基于Jenkins + Git的PHP项目编译脚本
本文针对的是了解或已经在使用Jenkins和Git的开发者或团队。
本团队使用了Jenkins作为持续集成平台,Git作为版本管理工具,而本人负责的项目是PHP项目,所谓发布项目就是复制文件。
通常有两种发布方式:全量发布和增量发布。
这两种发布方式并没有本质的区别,主要区别在于不同的应用场景。
全量发布:代码改动比较大,基本上覆盖了项目的大部分代码,这个时候可以选择把整个项目打包,当然可能会排除掉少量文件或目录(通常需要排除配置文件)。另外需要注意的是如果有运行期目录比如用于存放临时文件则需要保持其空框架,但如果项目有上传文件等的目录,则不太合适全量发布,因为那样意味着需要把已上传文件备份并恢复,如果文件数量比较大,则是一项很耗时的工作。
全量发布意味着发布时通常会把之前的代码删除或重命名。
增量发布:代码改动不大,则可以直接指定改动的文件或文件夹。
增量发布意味着发布时不需要删除原来的代码,而是直接COPY覆盖。
结合Jenkins和Git,具体实现思路如下:
在源码根目录维护三个文本文件:VERSION,V_INCLUDE, V_EXCLUSE
其中VERSION存放每次要发布的版本号;
V_INCLUDE用于存放增量发布时要发布的文件(夹)列表,一个一行;
V_EXCLUDE用于存放全量发布时要排除的文件(夹)列表,一个一行。
(后面两个文件以V开头是为了出现在VERSION文件的附近,不容易被遗忘)。
在Jenkins中创建两个任务:全量发布任务、增量发布任务。
全量发布任务的脚本中,先从Git获取代码,然后从VERSION读取版本号,从V_EXCLUSE读取要排除的文件列表。
增量发布任务的脚本中,先从Git获取代码,然后从VERSION读取版本号,从V_INCLUSE读取要包含的文件列表。
下面给出全量发布的脚本:
# 定义变量
root_path=$PWD
code_name="HiCloudShop" # 清理历史数据
rm -rf release* || echo "no dir"
#download code
if [ -d $code_name ]; then
rm -rf $code_name
fi # 从Git获取代码
git clone ssh://xxx@xxx.com:29418/xxx/$code_name # 获取版本号
cd $code_name
versionname=`cat VERSION`
version=$versionname # 创建release目录
mkdir ${root_path}/release_$version # 生成Git info
cp /xxx/sh_script/git_info.sh .
chmod +x git_info.sh
./git_info.sh
mv git_info.txt git_info_${JOB_NAME}.txt
cp git_info_${JOB_NAME}.txt ${root_path}/release_$version/
rm -rf .git # 压缩源码
cd $root_path
cat ${root_path}/${code_name}/V_EXCLUDE | awk -v code_name=$code_name '/^(.+)$/{print " --exclude="code_name"/"$1}'| xargs tar czvf $code_name.tgz $code_name # 把源码转移到release目录
mv $code_name.tgz ${root_path}/release_$version/
tar行用到了awk和xargs:
先用cat取出V_EXCLUDE文件的内容(需要排除的文件列表);然后用awk在每个文件名前面缀上源码文件夹的名称(因为我们需要在源码文件夹的上一层执行tar);然后使用xargs把这个列表传给tar作为参数。
其中awk使用了-v参数把shell中code_name的值传到awk。
PS: 之前tar中是使用-X参数来提供需要排除的文件列表,但是这个参数的解释跟我们的需求不一致:-X匹配目录内所有的文件或文件夹,而我们需要的是相对跟目录的路径。详细点说,如果给出的是index.php,-X会把目录内所有的index.php文件排除,而我们只是想排除跟目录的index.php
下面是增量发布代码(跟全量发布代码类似):
# 定义变量
root_path=$PWD
code_name="HiCloudShop" # 清理历史数据
rm -rf release* || echo "no dir"
#download code
if [ -d $code_name ]; then
rm -rf $code_name
fi # 从Git获取代码
git clone ssh://xxx@xxx.com:29418/xxx/$code_name # 获取版本号
cd $code_name
versionname=`cat VERSION`
version=$versionname # 创建release目录
mkdir ${root_path}/release_$version # 生成Git info
cp /xxx/sh_script/git_info.sh .
chmod +x git_info.sh
./git_info.sh
mv git_info.txt git_info_${JOB_NAME}.txt
cp git_info_${JOB_NAME}.txt ${root_path}/release_$version/
rm -rf .git # 压缩源码
cd $root_path
cat ${root_path}/${code_name}/V_INCLUDE | awk -v code_name=$code_name '{print code_name"/"$1}' | xargs tar czvf $code_name.tgz # 把源码转移到release目录
mv $code_name.tgz ${root_path}/release_$version/
基于Jenkins + Git的PHP项目编译脚本的更多相关文章
- 基于jenkins的go语言项目自动化发布遇到的坑
之前我们研究dep,就是为了有一天可以实现go语言项目在我们系统里的CI. 之前联物科技的项目主要是使用java作为后端开发语言,基于jenkins的自动发布,使用了pipeline编写脚本,从拉取代 ...
- 【.NetCore】基于jenkins以及gitlab的持续编译及发布
前沿 其实本来是想把标题叫做持续集成的,只是后来看看研究出的内容,就只有发布这一个动作,自动化测试等内容也未涉及到,所以改名叫持续编译及发布应该更加贴切吧? 问题背景 其实目前我们传统方式上的发布方式 ...
- 使用Jenkins + git submodule 实现自动化编译,解决代码安全性问题
道哥的第 030 篇原创 目录 一.一个真实的代码泄漏故事 二.Jenkins 的基本使用 1. Jenkins 是什么? 2. 安装 JDK8 3. 安装 Jenkins 4. 在浏览器中配置 Je ...
- SCons - 简单而强大的项目编译脚本
N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...
- Powershell极速教程-如何在三分钟内编写项目编译脚本
分析及思路 来看一下项目目录结构 炒鸡正常的三板斧src+docs+tests.咦,怎么会多出一个build的文件夹呢,这就是我们今天要研究的目录.今天我会带着大家在五分钟之内编写一个极简的编译脚本. ...
- SCons - 简单而强大的项目编译脚本(原文https://www.cnblogs.com/binchen-china/p/5646791.html)
N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...
- 基于Jenkins+Git+Gradle的Android持续集成
本文参考了: http://my.oschina.net/uboluo/blog/157483 http://java.dzone.com/articles/automating-continuous ...
- .net项目在linux平台的CI流程(基于Jenkins+mono+jexus)
内容较多,主要分为以下4方面内容: Jenkins的安装部署(centos 7+) .net在linux平台CI流程所需的插件管理&配置 Jenkins配置连接Gitlab(也可使用对应插件连 ...
- 基于 Jenkins+Docker+Git 的CI流程初探
在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...
随机推荐
- CSS3的基础用法
CSS3的现状:1.浏览器支持程度差,需要添加私有前缀 2.移动端支持优于PC端 3.不断改进中 4.应用相对广泛 在CSS3中增加新增了许多灵活查找元素的方法,极大的提高了查找元素的效率和精准度.C ...
- java网络编程,简单的客户端和服务器端
1.服务器端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import ...
- simpson法求积分 专题练习
[xsy1775]数值积分 题意 多组询问,求\(\int_l^r\sqrt{a(1-{x^2\over b})}dx\) 分析 double f(double x) { return sqrt(a* ...
- HashMap,LinkedHashMap,TreeMap的区别
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很 ...
- C指针的大小
应该说这是一个非常基础的问题,教科书上说指针大小和机器字长相同,即32位机指针长度为4字节!但是对不对呢?为什么是这样? 搜了一下相关资料...居然发现回答不统一,很多人也同样是糊里糊涂. 下面对这个 ...
- effective java —— 终结方法守卫者
目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...
- Hibernate与MyBatis
一. Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R ...
- discuz后台登陆 口令卡添加
1.通过根目录文件admin.php 找到 $admincp->init(); 2.指向 dz/source/class/discuz/discuz_admincp.php 这个方法funct ...
- Adb refused a command 解决方法
原文:How To Fix Android Error Adb Refused A Command 地址:http://downloadfixit.com/android-error-adb-refu ...
- react验证码倒计时
<!DOCTYPE html> <html> <head> <script src="../build/react.js">< ...