本文针对的是了解或已经在使用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项目编译脚本的更多相关文章

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

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

  2. 【.NetCore】基于jenkins以及gitlab的持续编译及发布

    前沿 其实本来是想把标题叫做持续集成的,只是后来看看研究出的内容,就只有发布这一个动作,自动化测试等内容也未涉及到,所以改名叫持续编译及发布应该更加贴切吧? 问题背景 其实目前我们传统方式上的发布方式 ...

  3. 使用Jenkins + git submodule 实现自动化编译,解决代码安全性问题

    道哥的第 030 篇原创 目录 一.一个真实的代码泄漏故事 二.Jenkins 的基本使用 1. Jenkins 是什么? 2. 安装 JDK8 3. 安装 Jenkins 4. 在浏览器中配置 Je ...

  4. SCons - 简单而强大的项目编译脚本

    N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...

  5. Powershell极速教程-如何在三分钟内编写项目编译脚本

    分析及思路 来看一下项目目录结构 炒鸡正常的三板斧src+docs+tests.咦,怎么会多出一个build的文件夹呢,这就是我们今天要研究的目录.今天我会带着大家在五分钟之内编写一个极简的编译脚本. ...

  6. SCons - 简单而强大的项目编译脚本(原文https://www.cnblogs.com/binchen-china/p/5646791.html)

    N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...

  7. 基于Jenkins+Git+Gradle的Android持续集成

    本文参考了: http://my.oschina.net/uboluo/blog/157483 http://java.dzone.com/articles/automating-continuous ...

  8. .net项目在linux平台的CI流程(基于Jenkins+mono+jexus)

    内容较多,主要分为以下4方面内容: Jenkins的安装部署(centos 7+) .net在linux平台CI流程所需的插件管理&配置 Jenkins配置连接Gitlab(也可使用对应插件连 ...

  9. 基于 Jenkins+Docker+Git 的CI流程初探

    在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...

随机推荐

  1. 关于xml配置实现AOP的小知识

    除了前面介绍的基于JDK1.5的注解方式来定义切面,切入点和增强处理外,Spring AOP也允许直接使用XML配置文件来管理它们.在JDK1.5之前,只能使用配置文件的方式来管理,在Spring2. ...

  2. JQuery_DOM 简介/设置元素及内容

    一.DOM 简介 1.D 表示的是页面文档Document.O 表示对象,即一组含有独立特性的数据集合.M表示模型,即页面上的元素节点和文本节点. 2.DOM 有三种形式,标准DOM.HTML DOM ...

  3. java: Thread 和 runnable线程类

    java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...

  4. ORM框架通过映射(反射)获取数据库的数据

    ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中.只要提供了持久化类与表的映射关系,ORM ...

  5. 【转】 memcmp源码实现

    原型: int memcmp(void *buf1, void *buf2, unsigned int count); 用法:#include <string.h> 功能:比较内存区域bu ...

  6. centos7 升级内核到最新版本

    centos7 从问世以来,官网提供的镜像始终是3.10 版本,该版本最大的一个问题是对硬件驱动(尤其是无线网卡)的支持不是很好,本人亲测>5种机型,无线网卡均无法正常使用,如果是非主流机型,手 ...

  7. 浅谈android binder机制

    binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...

  8. javascript 之 prototype 浅析

    prototype 原型 javascript 是一种 prototype based programming 的语言, 而与我们通常的 class based programming 有很大 的区别 ...

  9. Delphi与Windows 7下的用户账户控制(UAC)机制 及 禁用兼容性助手

    WIN7, Vista提供的UAC机制,它的主要目的是防止对于操作系统本身的恶意修改.对于Delphi程序的影响,UAC主要在于以下几点:1.由于UAC机制,Delphi对于系统的操作可能无声的失败, ...

  10. 周爱民:真正的架构师是没有title的(图灵访谈)

    周爱民,现任豌豆荚架构师,国内软件开发界资深软件工程师.从1996年起开始涉足商业软件开发,历任部门经理.区域总经理.高级软件工程师.平台架构师等职,有18年的软件开发与架构.项目管理及团队建设经验, ...