本文针对的是了解或已经在使用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=`catVERSION`
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 -vcode_name=$code_name '/^(.+)$/{print " --exclude="code_name"/"$1}'|xargs tarczvf $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=`catVERSION`
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 -vcode_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项目编译脚本相关推荐

  1. 基于jenkins的go语言项目自动化发布遇到的坑

    之前我们研究dep,就是为了有一天可以实现go语言项目在我们系统里的CI. 之前联物科技的项目主要是使用java作为后端开发语言,基于jenkins的自动发布,使用了pipeline编写脚本,从拉取代 ...

  2. jenkins+git+maven搭建项目自动化持续集成

    2019独角兽企业重金招聘Python工程师标准>>> 1.概要说明 为了开发人员和测试人员的解耦,让开发和测试流程更加便捷,所以采用jenkins+git+maven这套可持续性集 ...

  3. 基于Jenkins+git+gradle+pgyer的android持续集成

    前段时间搞了下CI持续集成工具,这里总结一下:供需要的朋友参考,错误之处还请指出,与君共勉. 主要步骤如下: 1. jenkins 安装配置 2.打包环境配置 3.系统配置及插件管理 4.新建项目.b ...

  4. jenkins git maven tomat 项目拉取编译自动部署(操作详细)

    文章目录 1.项目说明 2.tomcat 配置 (1)tomcat-users.xml 配置用户 (2)context.xml 去掉访问限制 (3)解决 war包过大无法上传 (4)访问host-ma ...

  5. jenkins+maven+docker java项目编译、打包、构建镜像、上传私有仓库、web容器部署

    本环境非常简单,主要实现如下流程功能 员工通过eclipse提交java代码---gitlab更新代码----jenkins通过maven编译打包----生成war包----制作docker镜像并上传 ...

  6. Jenkins+Gitlab+Nginx+SonarQube+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    环境拓扑:  Jenkins -192.168.1.30  Gitlab -192.168.1.31  LB -192.168.1.32  Web1 -192.168.1.33  Web2 -192. ...

  7. jenkins最完整自动打包编译备份,跨服务器拷贝,git自动触发构建

    jenkins自动构建vue项目(自动打包.备份.上传.跨服务器拷贝.git自动触发构建) 一:环境准备: 首先,在安装jenkins之前,我们要先在linux中必须安装jdk,本次我们使用的是jdk ...

  8. 最全的项目部署+持续集成解决方案:Jenkins + git + docker

    1.概述 1.1 什么是持续集成,持续交付 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干 持续交付/持续部署(Continuo ...

  9. 【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(上)

    目录 一.k8s 助力 DevOps 在企业落地实践 1.1 传统方式部署项目为什么发布慢,效率低? 1.2 上线一个功能,有多少时间被浪费了? 1.3 如何解决发布慢,效率低的问题呢? 1.4 什么 ...

最新文章

  1. 一分钟明白各种SQL语句加的什么锁——《深究Mysql锁》
  2. 合工大计算机研究生毕业工资,合肥工业大学2019届薪酬统计
  3. C语言程序设计 | 模拟实现字符串操作函数:strlen, strcmp, strcpy, strcat, strchr, strstr
  4. 代码里-3gt;gt;1是-2但3gt;gt;1是1,-3/2却又是-1,为什么?
  5. 轉:VB6中将数据导出到Excel提速之法
  6. 何时使用 Golang
  7. Qfile与QTextStream读写文本文件
  8. java mojo是什么_java – 为什么Maven不能找到我的定制Mojo?
  9. android app定时自动重启,android 应用程序自动重启
  10. Git 输入命令git branch -a 后怎么返回
  11. C++随机数生成器(default_random_engine)
  12. 大数据简历(项目部分)
  13. Qt绘制出思岚雷达扫描到的轮廓
  14. List of music used by Apple Inc.
  15. 最新Matomo网站访问统计流量统计系统源码V3.13.1
  16. 求生之路服务器列表只显示ip,L4DL4D2 玩家进入退出+玩家转队伍SteamIdIP+国家+城市显示SQL版本 SP源码 2.4(2013-10-15更新)...
  17. 详细直播平台开发细节,提供成品直播系统源码
  18. JavaScript的三级联动
  19. python画xy轴_用python建立两个Y轴的XY曲线图方法
  20. svn怎么执行清理命令_C盘又见红了?一个C盘清理强迫症教你真正有效的解决方法!...

热门文章

  1. 三星Samsung CLX-6260ND 驱动
  2. 有关 numpy 的 35 个实战挑战
  3. 如何申请一个免费的域名。。在 freenom 上 并解决用谷歌账号登录不上的问题
  4. 解决Vercel托管项目后无法正常访问的问题
  5. Turnkey wordpress镜像下载
  6. uchome工作笔记--添加微新闻功能
  7. 学术报告PPT制作建议
  8. 电脑升级nvme固态硬盘 迁移物理机系统至虚拟机 虚拟机至物理机
  9. 支持双向充放电的高效Buck-Boost控制器——TMI5810
  10. 【PTA题目】7-4 输出大写英文字母 (15 分)