基于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)及持续部 ...
随机推荐
- K-means算法
K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢? ...
- iOS 开发之崩溃日志分析
1. (js 与webview 交互崩溃)-[CFRunLoopTimer release]: message sent to deallocated instance 0x62398f80 I've ...
- AX2012 XppCompiler create method动态创建方法并运行
在用友系列的软件中经常可以看到可配置的计算公式,AX中其实也有可配置的公式,如call center呼叫中心的欺诈Fraud rule的配置,AX后台可以根据配置规则,变量,条件来动态产生方法并执行, ...
- JavaWeb前端:CSS
CSS 主要是要熟悉的掌握选择器 Div 的盒模型: 整个网页被切割成一个一个盒子,盒子可以套盒子,每个盒子通过以下几个主要属性来控制显示位置: 边框 Border-top, Border-botto ...
- 3d旋转
<!DOCTYPE html><html lang="zh-cmn-Hans"><head><meta charset="utf ...
- log4j输出日志到文件
输出端Appender Appender用来指定日志信息输出到哪个地方,可以同时指定多个输出目的地.Log4j允许将信息输出到许多不同的输出设备中,一个log信息输出目的地就叫做一个Appender. ...
- 20169212《Linux内核原理与分析》第七周作业
实验 给MenuOS增加time和time-asm命令的方法: 更新menu代码到最新版 再main()函数中增加MenuConfig 增加对应的Time函数和TimeAsm函数(这里的函数要换成我们 ...
- VGA, QVGA, HVGA, WVGA, FWVGA和iPhone显示分辨率
首先这些都是说的屏幕显示分辨率 VGA (Video Graphics Array), 分辨率为 480*640. QVGA (Quarter VGA), 分辨率为240*320. HVGA (Hal ...
- PHP发送电子邮件
1.导入文件,如本案例把Stmp.class.php放到Common\Common目录下,代码很多,直接复制就行! <?php namespace Common\Common; class Sm ...
- Oracle PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...