在我们的日常运维工作中,使用jenkins来完成业务代码发版上线是至关重要的一环。
前面已经提到在jenkins上添加用户权限的操作,今天重点说下如何在jenkins下构建项目工程进行代码发布?

在此简单介绍下jenkins进行代码发布的流程(根据本人的经历而述)。
1)代码上线要经历四个场景:Dev开发环境-->Test测试环境-->Beta验收环境-->Online线上环境
Dev开发环境:开发人员在开发机上自行开发,开发后将代码上传到svn/git版本控制系统里。
Test测试环境:将代码从svn下载并同步到测试机(Test环境发版),通知测试同事进行上线前的业务测试。
Beta验收环境:测试同事测试ok后,将代码同步到Beta机上(Beta环境发版),然后通知产品/运营同事进行上线前的验收。
Online线上环境:待Beta验收ok后,再将代码同步到线上机器上,最终完成Online发版。

2)Test测试环境下的发版,没有放到jenkins上操作(当然也是可以放到kenins上构建测试项目工程的),直接是在服务器上写的发版脚本进行的。

3)Beta验收环境和Online线上环境的发版是放在jenkins上构建项目工程完成的,上线发版分为全量发版(全部同步)和增量发版(个别文件同步)。
发版是根据svn的tag标记,由release区分版本号进行的。具体情况如下:

全量发布流程:
第一步:构建FH_Diff_Release项目,构建时会提示选择一个release版本号。根据上线人员要求的release版本号(一般是最新的release号)进行构建。将代码从svn下载到jenkins本地(即放到对应项目的workspace目录下,也就是放在/usr/local/tomcat7/webapps/jenkins/jobs/FH_Diff_Release下)。构建后
发布日志里会留有一个版本号(比如20161028183745)
第二步:构建FH_Beta项目,构建时会提示输入VERSION版本号。使用FH_Diff_Release最近一次构建后的版本号(如上面的20161028183745)构建FH_Beta。构建后发布日志里同样也会留有一个版本号(也是20161028183745)。到这里完成Beta环境的验收工作,验收完成后
才可以进行代码上线工作。
第三步:构建FH_Online项目,构建时会提示输入VERSION版本号。使用FH_Beta最近一次构建后的版本号(也就是上面的20161028183745)构建FH_Online。至此完成代码全量上线。

增量发布流程:
重复上面的第一步和第二部,将代码发布到Beta环境进行验收,验收通过后,就可以进行代码上线了。
第三步:构建FH_Diff_Beta,构建时会提示输入FILE_LIST(一般不会是文件的全路径,是文件的部分路径,具体参考shell脚本里对此参数的引用设置)。输入要同步的个别文件进行构建即可。构建后发布日志里也会留有一个版本号(比如20161014371145).
第四部:构建FH_Online项目,构建时会提示输入VERSION版本号。使用FH_Diff_Beta最近一次构建后的版本号(也就是上面的20161014371145)构建FH_Online。至此完成代码增量上线。

另外:
上面在构建工程项目时要求输入的参数VERSION和FILE_LIST都是在项目配置里定义的(具体下面会提到),并且这两个参数在对应项目配置里的shell脚本里都会被引用。

同时,针对FH_Online项目,还可以创建FH_Rollback(使用ROLLBACK_VERSION参数),即Online环境的回滚方案(当然Test和Beta环境也可以创建回滚项目。一般会写一个回滚脚本,同步前都会做一次备份,回滚脚本可依据自己的情况而定义)。

-------------------------------------------------------------------------------
废话不多说,下面记录下jenkins创建工程,构建项目发版的具体流程:

首先新建一个工程任务:

按照上面总结的上线发版流程,这里举出一个业务线的代码发版的项目,依次列出全量、增量发版的工程:
FF_Diff_Release
FF_Beta
FF_Diff_Beta
FF_Online
FF_Rollback

1)FF_Diff_Release项目配置

接下来对这个项目进行配置

首选”启用项目安全“,选择对该项目具有操作权限的用户。一般而言,除了运维人员(管理员)具有所有项目操作的权限外,一般只给开发人员(通常是项目组的负责人)Beta环境下的项目操作权限。如下,只给caogaokui和yuxiaogang这两个用户(提前在“管理用户”里创建好的用户)设置下面三个权限,说明他们对该项目由构建的权限。

在“参数化构建过程”中选择“List Subversion tags(and more)”,填写相应业务svn的url;这里在对应项目的svn(如下面的svn://192.168.9.120/fangfull_new)下特意创建了一个release目录,在该目录下建立易于区分的版本号目录(如rel_20161031,里面存放业务代码)用于jenkins发布版本。这样在构建此工程的时候,就会出现提示选择一个release版本号(下面会演示到);
下面填写的svn://192.168.9.120/fangfull_new/releases最好提前在jenkins本机用svn co测试执行一下(用对应的的svn账号和密码,执行一会儿就ctrl+c结束就行),看看能否正常通过svn下载,不然可能会有报错。  如下:即将svn://192.168.9.120/fangfull_new/releases下的版本目录作为参数SVN_releases,用于构建工程时的提示

下面的提示不用在意,不影响。

最后,调用shell同步的脚本(脚本在jenkins本机上定义的,这里填写脚本的执行命令就行)

-----------------------------------------------------------------------------------------------------------
这里列举下jenkins内置的环境变量(可以在jenkins构建的项目配置中直接引用,如上图Shell脚本中引用的${JOB_NAME})
BUILD_NUMBER, 唯一标识一次build,例如23;
BUILD_ID,基本上等同于BUILD_NUMBER,但是是字符串,例如2011-11-15_16-06-21;
JOB_NAME, job的名字,例如JavaHelloWorld;
BUILD_TAG, 作用同BUILD_ID,BUILD_NUMBER,用来全局地唯一标识一此build,例如jenkins-JavaHelloWorld-23;
EXECUTOR_NUMBER, 例如0;
NODE_NAME,slave的名字,例如MyServer01;
NODE_LABELS,slave的label,标识slave的用处,例如JavaHelloWorld MyServer01;
JAVA_HOME, java的home目录
WORKSPACE,job的当前工作目录
HUDSON_URL = JENKINS_URL, jenkins的url,例如http://localhost:8000/ ;
BUILD_URL,build的url 例如http://localhost:8000/job/JavaHelloWorld/23/;
JOB_URL, job的url,例如http://localhost:8000/job/JavaHelloWorld/;
SVN_REVISION,svn 的revison
-----------------------------------------------------------------------------------------------------------

下面贴出该项目配置中调用的shell脚本(脚本中的192.168.1.106是其中的一台线上服务器):
先从线上机器拷贝一份代码下来,放到脚本中的${CODE_DIR}目录下
接着将代码从svn下载到脚本中的${WORKSPACE}中,然后再同步到脚本中的${FILE_DIR}/${VERSION}目录下,已等待后续发往beta环境中。

[root@jenkins-server Shell]# pwd
/usr/local/tomcat7/webapps/jenkins/scripts/Shell
[root@redmine Shell]# cat FF_Diff_Release.sh
#!/bin/bash
CODE_DIR="/var/lib/jenkins/code_online/www.wangshibo.com"
FILE_DIR="/var/lib/jenkins/file_list/www.wangshibo.com"
ONLINE_SERVER="192.168.1.106"
EXCLUDE_FILE="/var/lib/jenkins/code_online/www.wangshibo.com.exclude"
VERSION=`/bin/date +%Y%m%d%H%M%S`
LOCK_FILE="/var/lib/jenkins/file_list/www.wangshibo.com/diff.lock" check_return()
{
if [[ $? != "0" ]]; then
/bin/echo $1
exit 255
fi
} ### check lock file ###
while [ -f ${LOCK_FILE} ]; do
sleep 2
/bin/echo "Other diff project is running,please wait for a moment,thanks."
done ### update code ###
/usr/bin/rsync -a -e ssh --exclude-from ${EXCLUDE_FILE} root@${ONLINE_SERVER}:/var/www/vhosts/www.wangshibo.com/ ${CODE_DIR}/
check_return "update code failed" ### rsync svn code to version directory ###
/bin/mkdir -p ${FILE_DIR}/${VERSION}
/usr/bin/rsync -a --exclude-from ${EXCLUDE_FILE} ${WORKSPACE}/ ${FILE_DIR}/${VERSION}/ ### diff file ###
/bin/find ${FILE_DIR}/${VERSION}/ -type f -regex ".*/.*\.\(php\|tpl\|js\|css\|html\)" | while read line; do
ONLINE_FILE=`/bin/echo ${line} | /bin/cut -d"/" -f8- | /bin/sed 's/^/\/var\/lib\/jenkins\/code_online\/www.wangshibo.com\//g'`
FILE_NAME=`/bin/echo ${line} | /bin/cut -d"/" -f8-`
if [[ -f ${ONLINE_FILE} ]]; then
if [[ "$(/usr/bin/md5sum "${line}" | /bin/awk '{print $1}')" != "$(/usr/bin/md5sum "${ONLINE_FILE}" | /bin/awk '{print $1}')" ]]; then
/bin/echo "=============${FILE_NAME}============="
/usr/bin/diff -bu ${ONLINE_FILE} ${line}
fi
else
/bin/echo "=============${FILE_NAME}============="
/bin/echo "...这是一个新文件..."
fi
done /bin/echo "==================================Diff Completed=================================="
/bin/echo ""
/bin/echo ""
/bin/echo ""
/bin/echo "Version : ${VERSION}"
/bin/rm -f ${LOCK_FILE}

然后执行这个工程的构建,如下,构建时会提示你选择一个SVN_release的版本号。

上面的rel_*版本目录作为SVN_releases参数,是开发人员上传到svn://192.168.9.120/fangfull_new/releases下的,通过svn能看到:

----------------------------------------------------------------------------------------------------------------------------------------
另一种形式:
上面的FF_Diff_Release项目配置中采用了“发版时选择release版本号”的配置(如上截图中)

也可以不采用上面这种方式:
直接配置一个svn的url(分支或主干)就行,不启动上面的“参数化构建过程”
这样,点击“构建”的时候就直接执行项目构建了,没有上面的选择版本号的提示了

如下的一个项目,就跟上面的FF_Diff_Release项目配置不一样,具体采用哪种方式,根据自己的情况而定。

最简单的做法还可以是:在jenkins本机提前编写好代码同步的脚本(svn操作在脚本中定义),然后在jenkins界面里的项目构建配置中只引用shell脚本构建即可。

----------------------------------------------------------------------------------------------------------------------------------------

2)FF_Beta项目配置

启用“参数化构建过程”,选择“String Parameter”,里面填写“VERSION”。这样构建这个工程时就会出现提示你输入版本号,也就是输入上面的FF_Diff_Release项目构建后打印的版本号(在Consloe Output日志里最底部可以看到)构建。

接下来不需要再设置“源码管理”了,直接引用shell脚本即可。

下面贴出该项目配置中调用的shell脚本(脚本中的192.168.1.25是beta服务器),可以看出,上面设置的VERSION参数,在脚本里已经被引用到了。

[root@jenkins-server Shell]# cat FF_Beta.sh
#!/bin/bash
FILE_DIR="/var/lib/jenkins/file_list/www.wangshibo.com"
BETA_SERVER="192.168.1.25"
BETA_DIR="/var/www/vhosts/www.wangshibo.com" ### define check_return ###
check_return()
{
if [[ $? != "0" ]]; then
/bin/echo $1
exit 255
fi
} ### check syntax errors ###
/bin/echo "check syntax errors"
for line in `/bin/find ${FILE_DIR}/${VERSION} -type f -name "*.php"`; do
/Data/app/php5.5.1/bin/php -l "${line}" >/dev/null 2>&1
check_return "syntax errors,please check ${line}"
done ### release to beta server ###
/usr/bin/rsync -av -e "ssh -p25791" ${FILE_DIR}/${VERSION}/ root@${BETA_SERVER}:${BETA_DIR}/
check_return "release to beta server failed" ### change directory permission ###
/usr/bin/ssh -p25791 -t -q -o 'StrictHostKeyChecking no' root@${BETA_SERVER} "/bin/chown -R nobody:nobody /var/www/vhosts/www.wangshibo.com; /bin/chmod -R 755 /var/www/vhosts/www.wangshibo.com/main/protected/runtime /var/www/vhosts/www.wangshibo.com/main/protected/themes /Data/logs/www/fangfull.com"
### purge memcache ###
#/usr/bin/ssh -t -q -o 'StrictHostKeyChecking no' root@${BETA_SERVER} "echo flush_all | nc 127.0.0.1 11221 ; echo flush_all | nc 127.0.0.1 11222" >/dev/null 2>&1 ### print version ###
/bin/echo "Version : ${VERSION}"

点击构建脚本,就会出现输入版本号的提示(注意上面Beta的shell脚本中有/Data/app/php5.5.1/bin/php进程,把这个php服务启动起来;按照以上脚本中的意思是在代码发布前,将代码中的php文件搜索出来,然后用php执行下这些php脚本文件,如果有报错,则终止这次构建,如果没有报错,则继续进行代码发布;具体按照自己的实际情况对脚本进行调试

3)FF_Diff_Beta项目配置

如下:参数名填写为FILE_LIST,在构建该项目的时候会有这个参数的提示,即输入要发布的文件,这是增量发版用到的(具体上面已经总结)。

接着直接引用shell脚本即可:

下面贴出该项目配置中调用的shell脚本(脚本中的192.168.1.25是beta服务器):
从脚本中可以看出:
上面“参数化构建”中定义的FILE_LIST在脚本中被引用到了。
同步前先从beta机器上将代码备份一份到本机,然后再根据FILE_LIST进行增量同步。

[root@jenkins-server Shell]# cat FF_Diff_Beta.sh
#!/bin/bash
CODE_DIR="/var/lib/jenkins/code_online/www.wangshibo.com"
FILE_DIR="/var/lib/jenkins/file_list/www.wangshibo.com"
BETA_SERVER="192.168.1.25"
BETA_DIR="/var/www/vhosts/www.wangshibo.com"
ONLINE_SERVER="192.168.1.25"
EXCLUDE_FILE="/var/lib/jenkins/code_online/www.wangshibo.com.exclude"
VERSION=`/bin/date +%Y%m%d%H%M%S`
LOCK_FILE="/var/lib/jenkins/file_list/www.wangshibo.com/diff.lock" check_return()
{
if [[ $? != "0" ]]; then
/bin/echo $1
exit 255
fi
} ### check lock file ###
while [ -f ${LOCK_FILE} ]; do
sleep 2
/bin/echo "Other diff project is running,please wait for a moment,thanks."
done ### update code ###
/usr/bin/rsync -av -e "ssh -p 25791" --exclude-from ${EXCLUDE_FILE} root@${ONLINE_SERVER}:/var/www/vhosts/www.wangshibo.com/ ${CODE_DIR}/
check_return "update code failed" ### rsync file from beta server ###
/bin/mkdir -p ${FILE_DIR}/${VERSION}
for FILE in ${FILE_LIST}; do
DIR_NAME=`/usr/bin/dirname ${FILE}`
/bin/mkdir -p ${FILE_DIR}/${VERSION}/${DIR_NAME}
/usr/bin/rsync -av -e "ssh -p 25791" --exclude-from ${EXCLUDE_FILE} root@${BETA_SERVER}:${BETA_DIR}/${FILE} ${FILE_DIR}/${VERSION}/${FILE}
check_return "${FILE} 文件不存在!"
done ### diff file ###
/bin/find ${FILE_DIR}/${VERSION}/ -type f -regex ".*/.*\.\(php\|tpl\|js\|css\|html\)" | while read line; do
ONLINE_FILE=`/bin/echo ${line} | /bin/cut -d"/" -f8- | /bin/sed 's/^/\/var\/lib\/jenkins\/code_online\/www.wangshibo.com\//g'`
FILE_NAME=`/bin/echo ${line} | /bin/cut -d"/" -f8-`
if [[ -f ${ONLINE_FILE} ]]; then
if [[ "$(/usr/bin/md5sum "${line}" | /bin/awk '{print $1}')" != "$(/usr/bin/md5sum "${ONLINE_FILE}" | /bin/awk '{print $1}')" ]]; then
/bin/echo "=============${FILE_NAME}============="
/usr/bin/diff -bu ${ONLINE_FILE} ${line}
fi
else
/bin/echo "=============${FILE_NAME}============="
/bin/echo "...这是一个新文件..."
fi
done /bin/echo "==================================Diff Completed=================================="
/bin/echo ""
/bin/echo ""
/bin/echo ""
/bin/echo "Version : ${VERSION}"
/bin/rm -f ${LOCK_FILE}

点击构建脚本,就会出现输入文件的提示(多个文件之间用空格隔开),如下,输入文件的格式路径可以根据shell脚本中(注意上面脚本中的dirname命令,即取一个路径的目录部分(即去掉一个路径最后一级后的部分路径))

4)FF_Online项目配置

下面贴出该项目构建配置中引用的脚本(脚本中的192.168.1.106和192.168.1.220是线上服务器):

[root@jenkins-server Shell]# cat FF_Online.sh
#!/bin/bash
FILE_DIR="/var/lib/jenkins/file_list/www.wangshibo.com"
CODE_DIR="/var/lib/jenkins/code_online/www.wangshibo.com"
EXCLUDE_FILE="/var/lib/jenkins/code_online/www.wangshibo.com.exclude"
ROLLBACK_DIR="/var/lib/jenkins/rollback/www.wangshibo.com"
ONLINE_SERVER="192.168.1.106 192.168.1.220"
REMOTE_SERVER="192.168.1.106"
ONLINE_DIR="/var/www/vhosts/www.wangshibo.com" ### define check_return ###
check_return()
{
if [[ $? != "0" ]]; then
/bin/echo $1
exit 255
fi
} ### check version ###
if [[ ! -d ${FILE_DIR}/${VERSION} ]]; then
/bin/echo "版本无效,请确认."
exit 255
fi ### update code ###
/bin/echo "update online code"
/usr/bin/rsync -a -e ssh --exclude-from ${EXCLUDE_FILE} root@${REMOTE_SERVER}:/var/www/vhosts/www.wangshibo.com/ ${CODE_DIR}/
check_return "update code failed" ### backup code ###
/bin/echo "backup online code"
cd ${CODE_DIR} && /usr/bin/rsync -aR * ${ROLLBACK_DIR}/${VERSION}/
check_return "backup code failed" ### release to online server ###
for SERVER in ${ONLINE_SERVER}; do
/bin/echo "release to ${SERVER}"
/usr/bin/rsync -av -e "ssh -o 'StrictHostKeyChecking no'" ${FILE_DIR}/${VERSION}/ root@${SERVER}:${ONLINE_DIR}/
/usr/bin/ssh -t -q -o 'StrictHostKeyChecking no' root@${SERVER} "/bin/chown -R nobody:nobody /var/www/vhosts/www.wangshibo.com ; /bin/chmod -R 755 /var/www/vhosts/www.wangshibo.com/main/protected/runtime /var/www/vhosts/www.wangshibo.com/main/protected/themes /Data/logs/www/fangfull.com" >/dev/null 2>&1
done ### print rollback version ###
/bin/echo "Rollback Version : ${VERSION}"

点击构建脚本,就会出现输入版本号的提示

5)FF_Rollback项目配置,即FF_Online的回滚方案,就是说上线如若出现问题,构建这个FF_Rollback工程就会自动回滚到上线前的状态

下面是该回滚项目的shell脚本

[root@jenkins-server Shell]# cat FF_Rollback.sh
#!/bin/bash
FILE_DIR="/var/lib/jenkins/file_list/www.wangshibo.com"
CODE_DIR="/var/lib/jenkins/code_online/www.wangshibo.com"
EXCLUDE_FILE="/var/lib/jenkins/code_online/www.wangshibo.com.exclude"
ROLLBACK_DIR="/var/lib/jenkins/rollback/www.wangshibo.com"
ROLLBACK_VERSION=`/bin/ls -l /var/lib/jenkins/rollback/www.wangshibo.com|tail -1|awk '{print $9}'`
ONLINE_SERVER="192.168.1.106 192.168.1.220"
ONLINE_DIR="/var/www/vhosts/www.wangshibo.com" ### define check_return ###
check_return()
{
if [[ $? != "0" ]]; then
/bin/echo $1
exit 255
fi
} ### release to online server ###
for SERVER in ${ONLINE_SERVER}; do
/bin/echo "release to ${SERVER}"
/usr/bin/rsync -av -e "ssh -o 'StrictHostKeyChecking no'" ${ROLLBACK_DIR}/${ROLLBACK_VERSION}/ root@${SERVER}:${ONLINE_DIR}/
/usr/bin/ssh -t -q -o 'StrictHostKeyChecking no' root@${SERVER} "/bin/chown -R nobody:nobody /var/www/vhosts/www.wangshibo.com ; /bin/chmod -R 755 /var/www/vhosts/www.wangshibo.com/main/protected/runtime /var/www/vhosts/www.wangshibo.com/main/protected/themes /Data/logs/www/fangfull.com ; cd /var/www/vhosts/www.wangshibo.com/main/qmjjrwap/themes/ntpl; /bin/rm -rf /var/www/vhosts/www.wangshibo.com/main/qmjjrwap/themes/ntpl/*; /bin/ln -s /var/www/vhosts/www.wangshibo.com/main/qmjjrwap/dist/themes/ntpl/qmjjrwap ./; /bin/chown -R nobody:nobody /var/www/vhosts/www.wangshibo.com/main/qmjjrwap/themes/ntpl/qmjjrwap" >/dev/null 2>&1
done ### print rollback version ###
/bin/echo "Rollback Version : ${VERSION}"

回滚即是用最近一次的备份覆盖到线上,脚本中的“ROLLBACK_VERSION”参数实际上取的就是最近一次的备份

[root@jenkins-server Shell]# ll /var/lib/jenkins/rollback/www.wangshibo.com
total 72
drwxr-xr-x 9 root root 4096 Aug 10 12:24 20160810122352
drwxr-xr-x 9 root root 4096 Aug 12 18:05 20160812180522
drwxr-xr-x 9 root root 4096 Aug 19 17:59 20160819175910
drwxr-xr-x 9 root root 4096 Aug 29 10:41 20160826170848
drwxr-xr-x 9 root root 4096 Sep 8 19:52 20160908195214
drwxr-xr-x 9 root root 4096 Sep 14 19:40 20160914193917
drwxr-xr-x 9 root root 4096 Sep 20 18:33 20160920171701
drwxr-xr-x 9 root root 4096 Sep 22 13:41 20160922110959
drwxr-xr-x 9 root root 4096 Sep 22 16:19 20160922161415
drwxr-xr-x 9 root root 4096 Sep 23 20:30 20160923201543
drwxr-xr-x 9 root root 4096 Sep 23 21:57 20160923213311
drwxr-xr-x 9 root root 4096 Sep 23 22:12 20160923220941
drwxr-xr-x 9 root root 4096 Sep 29 21:24 20160929210300
drwxr-xr-x 9 root root 4096 Oct 17 16:13 20161017161120
drwxr-xr-x 9 root root 4096 Oct 17 19:51 20161017192718
drwxr-xr-x 9 root root 4096 Oct 26 17:17 20161025173337
drwxr-xr-x 9 root root 4096 Oct 28 18:58 20161028185753
drwxr-xr-x 9 root root 4096 Nov 2 17:03 20161102145159
[root@jenkins-server Shell]# /bin/ls -l /var/lib/jenkins/rollback/www.wangshibo.com|tail -1|awk '{print $9}'
20161102145159

点击这个回滚项目的构建,同样会出现让你输入版本号的提示

******************************************************************************************************

扩展小提示:

截取目录的方法,有以下两种:
1)dirname命令:用于取给定路径的目录部分。这个命令很少直接在shell命令行中使用,一般把它用在shell脚本中,用于取得脚本文件所在目录,然后将当前目录切换过去。
其实就是取所给路径的倒数第二级及其之前的路径部分,如下:
[root@jenkins-server Shell]# dirname main/protected/xqsjmob/themes/tpl2/common/page_statistics.tpl
main/protected/xqsjmob/themes/tpl2/common
[root@jenkins-server Shell]# dirname /usr/local/tomcat7/webapps/jenkins/scripts/Shell
/usr/local/tomcat7/webapps/jenkins/scripts
[root@jenkins-server Shell]# dirname FF_Online.sh            #取的结果既是当前路径目录下

.

2)可以用${pathname%/*}截取掉pathname后面的文件部分。
下面比较下这两种方法的效果:即dirname取的是倒数第二级及其以上级的路径,而${pathname%/*}取的是"删除最后一个/符号后的路径部分"
[root@jenkins-server Shell]# pathname=/usr/bin/sort; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin
You have new mail in /var/spool/mail/root
[root@jenkins-server Shell]# pathname=/usr/bin/sort/; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin/sort
[root@jenkins-server Shell]# pathname=/usr/; echo $(dirname $pathname) ${pathname%/*}
/ /usr
[root@jenkins-server Shell]# pathname=/usr; echo $(dirname $pathname) ${pathname%/*}
/

---------------------------------------------------------------------------------------------------

以上的项目在构建后,可以通过构建日志查看代码发布情况:

如下:点击“Console Output"查看日志

通过查看Parameter参数得到本次构建动作所用到的VERSION版本号或FILE_LIST文件

待项目构建完成后,还可以创建视图,将相关业务(应用)构建的工程放到同一个视图下,有多少个应用就创建多少个视图。如下创建视图:

然后将相应的构建工程拉到这个视图下进行管理

至此,一个完整项目的jenkins发版流程已经配置完成,后续上线发版只需要在这里一键构建执行即可。这仅仅是依据本人使用jenkins的经历而梳理的,如有误述,敬请指出,以待改正!

jenkins配置记录(2)--代码发布流程的更多相关文章

  1. jenkins配置记录

    jenkins配置记录 http://www.cnblogs.com/kevingrace/p/6022447.html

  2. jenkins配置记录(1)--添加用户权限

    前一阵子在线上部署了一套jenkins环境,作为线上代码发布平台使用.部署记录:http://www.cnblogs.com/kevingrace/p/5651427.html 下面重点记录下jenk ...

  3. jenkins配置--上传代码,定时执行用例,发送测试报告

    1.安装条件:jdk1.8以上的,百度jenkin进入官网--download ,根据需要的版本下载 2.jenkins概念:持续集成,jenkins开源属于插件式形式进行管理的,选择性的装插件,支持 ...

  4. Jenkins搭建.NET自动编译发布远程环境

    继上一篇文章Jenkins搭建.NET自动编译发布本地环境 发布到本地成功后,接下来配置发布到远程环境. Build配置——发布到远程 根据前面VS中发布项目,生成的CustomProfile2 来配 ...

  5. 【Eclipse】Eclipse中tomcat的Server配置(解决修改代码不断的重启服务器)以及设置tomcat文件发布位置与JSP编译位置查看

     Eclipse有时候修改一点JS或者JSP都会自动重启,有时候修改完JS或者JSP之后必须重启服务器才生效,下面研究了server的一些选项之后彻底解决了这些问题,下面做记录: 我的 Eclipse ...

  6. Docker:pipeline编写基本技巧- jenkins配置通过免交互方式拉取git源码管理仓库的代码

    工作中,从git仓库拉取代码有2种方式:交互式和非交互式 什么是交互式?就是拉取需要权限才能访问的代码时,需要输入密码 免交互式呢? 是通过密钥,私钥的方式,让服务端信任客户端,产生信任后,任何一次客 ...

  7. 【Linux】php7.2.8 + xdebug + composer + php代码覆盖率 + jenkins配置 (实操记录,亲测可用)

        [一.linux安装php 7.2.8] 1.wget http://nginx.org/download/nginx-1.9.9.tar.gz              # nginx可不安 ...

  8. jenkins配置到gitlab拉代码

    参照: jenkins 从git拉取代码-简明扼要 https://www.cnblogs.com/jwentest/p/7065783.html 持续集成①安装部署jenkins从git获取代码-超 ...

  9. 9.2 k8s结合Jenkins与gitlab实现代码升级与回滚

    1.部署Jenkins 1.1 安装jdk # apt 安装jdk11 apt install openjdk-11-jdk # 查看 root@jenkins:~# java -version op ...

随机推荐

  1. 可怜的js居然没有块级作用域

    js中在一个函数中定义一个for循环:for(var i=0;i<5;i++) 其中的i并不会随着for循环的结束就销毁,i会一直存在该函数中,这就是js和其他语言的区别,也就是js没有块级作用 ...

  2. Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39

    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39 V1  初步实现sina csdn cnblogs V2  实现qzone sohu 的发帖 ...

  3. Windows环境下利用github快速配置git环境

    在windows环境下利用github客户端我们可以直接拥有可视化的界面来管理工程,当然你也可以选择你喜欢的命令行工具来做.今天我分享一个比较快速的方式来配置git环境. 先去下载github的win ...

  4. Android项目实战(八):列表右侧边栏拼音展示效果

    之前忙着做项目,好久之前的技术都没有时间总结,而发现自己的博客好多写的技术都比自己掌握的时候晚了很多.不管怎么样,写技术博客一定是一个想成为优秀程序猿或者已经是优秀程序猿必须做的.好吧,下面进行学习阶 ...

  5. iOS-多线程--(pthread/NSThread/GCD/NSOperation)--总结

    零.线程的注意点(掌握) .不要同时开太多的线程(~3条线程即可,不要超过5条) .线程概念 > 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 > 子线程 : 后台线程,异 ...

  6. mysql字段不能为空的字段为空时也能插入的方法

    接手了一个项目,设计数据库的时候字段全部是不能为空,但是空值又可以插入数据,刚拿过来的时候就提示各种sql语法错误,现记录一下解决办法. 将my.ini中设置: #sql-mode=STRICT_TR ...

  7. c#注册表对象映射

    用于快捷保存与读取注册表,为对应的对象 示例 [RegistryRoot(Name = "superAcxxxxx")] public class Abc : IRegistry ...

  8. Bootstrap(转)

    Bootstrap 随着互联网的不断成熟以及我们越来越多的用各种移动端的设备访问互联网,Web设计师和Web开发者的工作也变得越来越复杂. 十年前,一切都还简单得多.那个时候,大部分用户都是坐在桌子前 ...

  9. java控制台输入

    一.java控制台输入 java控制台输入有如下几个方法 1.JDK 1.4 及以下版本读取的方法 JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in获得系统的 ...

  10. HDU 4043 FXTZ II (组合数学-排列组合)

    FXTZ II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...