一、发布瓶颈

在jenkins的使用中,一般都会为每一个应用服务都创建一个独立的Job。在日常各个环境(测试、预发、生产)升级发布的过程中,比较传统的做法是在Jenkins中对每一个要发布的应用都依次点击Build。

如果模块比较少,那这种方法没啥毛病。但是我这边一共有30多个微服务模块,这时候如果还是用这种点击每一个模块去构建发布的方法,显然是一种不够效率的做法。

二、改进思路

注意!!!我觉得这里有必要先说一下前提:我这里测试、预发、生产这些环境使用的是固定的分支,就是Build的时候不需要再选择分支了。不然在后面的远程调用如果要选择分支的话,有点麻烦。虽然可以传参数,但是如果每次发布的分支不一样,还要改配置,确实很麻烦,我觉得也没必要用这种checkbox的方法了,还不如直接每个模块自己手动点过去发布呢。

在Jenkins中创建一个新Job,通过checkbox展示所有的模块,在需要发布时勾选要发布的模块,然后再通过调用Jenkins的api来执行相应模块的Build。

三、实现

1、多选框的实现

1)安装插件

这里需要安装的插件是Extended Choice Parameter,如下图:

jenkins 批量授权 jenkins 批量发布_微服务


2)插件使用在"General"中的"参数化构建过程"中,点击"添加参数",并选择"Extended Choice Parameter"。

jenkins 批量授权 jenkins 批量发布_jenkins 批量授权_02


在"Extended Choice Parameter"中填写数据,我这边以"前台"为例(因为我们项目分为前台、中台、微服务,所以我会添加三个"Extended Choice Parameter"):

jenkins 批量授权 jenkins 批量发布_jenkens_03

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中将选择的参数给打印出来。

jenkins 批量授权 jenkins 批量发布_远程调用_04


在构建的时候,我这边选择几个模块,看能否正常取到值。

jenkins 批量授权 jenkins 批量发布_jenkins 批量授权_05


输出结果如下:

jenkins 批量授权 jenkins 批量发布_微服务_06


从上面输出结果可以看出,可以正常取到参数值。

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 批量授权 jenkins 批量发布_Jenkins_07


点击Jenkins页面中右上角的用户下拉菜单中的"设置",进入用户设置页面。

jenkins 批量授权 jenkins 批量发布_Jenkins_08


点击"添加新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

这样就实现了批量构建的效果了。

四、完整配置文件

jenkins 批量授权 jenkins 批量发布_jenkens_09

其中shell脚本中的switch_nginxswitch_eureka是我为了不影响用户的使用(做到用户无感发布),用来做生产内环境切nginx流量和eureka中模块的上下线用的,在本文中可以先忽略掉这两个步骤。