一、发布瓶颈
在jenkins的使用中,一般都会为每一个应用服务都创建一个独立的Job。在日常各个环境(测试、预发、生产)升级发布的过程中,比较传统的做法是在Jenkins中对每一个要发布的应用都依次点击Build。
如果模块比较少,那这种方法没啥毛病。但是我这边一共有30多个微服务模块,这时候如果还是用这种点击每一个模块去构建发布的方法,显然是一种不够效率的做法。
二、改进思路
注意!!!我觉得这里有必要先说一下前提:我这里测试、预发、生产这些环境使用的是固定的分支,就是Build的时候不需要再选择分支了。不然在后面的远程调用如果要选择分支的话,有点麻烦。虽然可以传参数,但是如果每次发布的分支不一样,还要改配置,确实很麻烦,我觉得也没必要用这种checkbox的方法了,还不如直接每个模块自己手动点过去发布呢。
在Jenkins中创建一个新Job,通过checkbox展示所有的模块,在需要发布时勾选要发布的模块,然后再通过调用Jenkins的api来执行相应模块的Build。
三、实现
1、多选框的实现
1)安装插件
这里需要安装的插件是Extended Choice Parameter
,如下图:
2)插件使用在"General"中的"参数化构建过程"中,点击"添加参数",并选择"Extended Choice Parameter"。
在"Extended Choice Parameter"中填写数据,我这边以"前台"为例(因为我们项目分为前台、中台、微服务,所以我会添加三个"Extended Choice Parameter"):
Name
:变量名,后面脚本中会调用Description
:对此参数的描述Parameter Type
:根据实际需求,这里选择CheckBoxes最为方便Number of Visible Items
:设置下拉多选框的可见范围,大于或等于CheckBox可选值的数量即可Delimiter
:设置参数的分隔符,特别注意!!!这里的默认值是逗号,我这里换成了空格(并不是没有值!),这样传给shell脚本的时候就不用再做处理了。Value
:参数的值,把前台的服务名填写进去,使用逗号做分隔。这里不能使用空格的原因是使用空格的话,会把整个字符串当成一个参数。Default Value
:设置默认值。当多选框没有选择任何值的时候,就使用这个参数。例如我这里设置成null,在shell脚本中可以利用这个值来做判断:
if [ "$frond_ground" == "" ];then
echoGreen "前台没有要发布的模块!"
fi
测试一下:
按照上面的方法,再添加两个Extended Choice Parameter
,将中台和微服务也加上。并且在下面的执行shell中将选择的参数给打印出来。
在构建的时候,我这边选择几个模块,看能否正常取到值。
输出结果如下:
从上面输出结果可以看出,可以正常取到参数值。
2、调用Jenkins-api来Build各个模块
其实Jenkins有很多的API,官方文档中也是做了详细的介绍。如果有时间的话,完全可以根据API把jenkins集成到运维平台上去。
1)远程调用Build的方法
这里所要使用的是比较基础的"远程调用Build"API,官方给出的命令如下:
curl JENKINS_URL/job/JOB_NAME/buildWithParameters \
--user USER:TOKEN
2)创建用户并生成TOKEN
由上面的命令可以看到需要使用到用户的TOKEN
,我这里创建了一个名为rest
的用户,并授予这个用户所有环境的权限(具体的创建用户和授权的过程这边就不展开了,之前都有写过的)。
然后用这个rest用户登录jenkins,并生成TOKEN:
点击Jenkins页面中右上角的用户下拉菜单中的"设置",进入用户设置页面。
点击"添加新Token",给rest用户生成Token,并且将Token的值拷贝出来备用。
结合上面的checkbox中传过来的参数,脚本如下:
#!/bin/bash
jenkins_baseurl="http://192.168.0.111:8080"
jenkins_user=rest
jenkins_token="11f0d371b2ae670af82f190b3be8e88d2d"
for project in $frond_ground $middle_ground $microservice_module
do
echoGreen "发布server1中的$project服务"
curl -X POST ${jenkins_baseurl}/job/online_${project}/buildWithParameters --user ${jenkins_user}:${jenkins_token}
sleep 3
done
这样就实现了批量构建的效果了。
四、完整配置文件
其中shell脚本中的switch_nginx
和switch_eureka
是我为了不影响用户的使用(做到用户无感发布),用来做生产内环境切nginx流量和eureka中模块的上下线用的,在本文中可以先忽略掉这两个步骤。