jenkins快速修改多个job

​ 背景:jerkins 有100多个job,需要修改所有job的机器配置,如果手工配置非常浪费时间而且重复性任务很大,所以想到jenkins的每个job都是有对应的config配置文件的,可以通过shell脚本或者其他语言脚本去进行批量修改,默认jenkins的配置文件路径在/var/lib/jenkins/jobs/JOB_NAME/config.xml路径下,我们只需要修改对应配置即可,可以使用以下命令去查看我们的job有多少个

find /var/lib/jenkins/jobs/ -name "config.xml"

整体思路:

  1. 首先备份jenkins的所有job,任何操作没有绝对的把握先进行备份
  2. 获取Jenkins的所有job_name
  3. 遍历jobname,对每个job的配置文件config,通过Linux命令进行修改
  4. 修改好以后需要重启jenkins,重启最好看着没有job工作的时候在重启jenkins,否则可能会导致jenkins正在执行的job任务失败

快速搜索替换

注意:每次修改前最好先把config.xml备份,并且在最好本地测试好

方法1:快速替换

假设prod开头的项目需要把 prohb.xihuanwu.com 替换为 harbor-in.xihuanwu.com可以直接使用以下命令替换,替换好以后重启jenkins查看job是否成功即可

不过对于一些特殊符号可能以下命令还需要转义,这个时候参考方法2。

1
for n in `find /var/lib/jenkins/jobs/prod_*/ -maxdepth 1 -type f -name config.xml`;do cp $n $n.bak`date +%F`;sed -i "s/HARBOR=prohb.xihuanwu.com/HARBOR=harbor-in.xihuanwu.com/g" $n;done

方法2:

假设我们只有指定job需要修改,而且job名字也不统一,可以参考以下方式

注意:我这个脚本需要在/var/lib/jenkins/jobs/数据目录下面执行,不同配置数据目录可能不同,具体根据需求去修改脚本

1、在jenkins-web界面复制需要修改的job,然后放入文本编辑器,只保留job名称

2、编写以下脚本,path里面就是需要修改的job名字(由于这里我有多个文本需要修改,所以使用的多行)

3、重启jenkins服务器在web界面验收job是否修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
path="
centos-k8s-paas-email
centos-k8s-paas-etcd
centos-k8s-paas-example
centos-k8s-paas-fs-rpc
centos-k8s-paas-graphservice-api
centos-k8s-paas-graphservice-rpc
centos-k8s-paas-graphservice-web
centos-k8s-paas-jssdk
centos-k8s-paas-license-rpc
centos-k8s-paas-market
centos-k8s-paas-modefile-api
centos-k8s-paas-modelfile-rpc
centos-k8s-paas-modelstandardizat
"
#!/bin/bash

# 定义要替换的文本和替换后的文本
search_text="<description>说明:次处为打包images类型选择,默认开发版(paas-dev),测试版(paas-test),预发布版(paas-beta),上线版(paas-release)。</description>"
replace_text="<description>说明:次处为打包images类型选择,默认开发版(paas-dev),测试版(paas-test)</description>"
search_text3="<description>说明:此处为打包images类型选择,默认开发版(paas-dev),测试版(paas-test),预发布版(paas-beta),上线版(paas-release)。</description>"
replace_text3="<description>说明:此处为打包images类型选择,默认开发版(paas-dev),测试版(paas-test)</description>"
search_text1="选择是否部署到k8s,k8s-paas-test为101 test测试环境,k8s-paas-dev为103 dev测试环境,k8s-paas-demo为102 demo环境"
replace_text1="选择部署环境,dev(开发环境),test(测试环境),stage(预发布环境)"
search_text2="说明:此处是配合FixedVersion选项使用,FixedVersion值为true时此处选择有效。"
replace_text2="说明:此处默认只读test仓库docker images"


for i in ${path};do
sed -i 's|'"$search_text"'|'"$replace_text"'|g' "$i/config.xml"
sed -i 's|'"$search_text1"'|'"$replace_text1"'|g' "$i/config.xml"
sed -i 's|'"$search_text2"'|'"$replace_text2"'|g' "$i/config.xml"
sed -i 's|'"$search_text3"'|'"$replace_text3"'|g' "$i/config.xml"
done

批量添加多行内容

根据以上思路,现在又有一个新需求,我们需要在100多个job里面的某一行添加多行内容,这个时候我们可以考虑依旧通过sed去添加

要求:在${search_text}变量内容下加几行内容到jenkins,我这里选择使用\n换行符进行批量添加,另外还有一个文字需要替换所以我就新增了一个循环

echo “本次已选择k8s方式部署到测试环境192.168.99.200服务器”
#首次拉取配置
#cd /home/dx/apps/config/xbase
#git clone -b xbase http://rdc:dxyDXY&321@gitlab.dxbim.com/products/dxyp-configcenter.git

#拉取最新配置
cd /home/dx/apps/config/xbase/dxyp-configcenter
git pull origin xbase

最后修改好以后重启服务即可

  • 遇到的坑:

每次建议先在web修改好一个想要的内容,然后去编辑对应脚本的config.xml文件,因为jenkins-job使用的是XML语言,所以一些特殊符号需要添加指定的变量,否则jenkins重启成功这行command会全部消失

如以下范例:增加了&amp;如果不加的话会造成jenkins执行的shell脚本全部空白(我这里也是先在web界面修改好一个job改好以后才发现的)

修改前:

#git clone -b xbase http://rdc:dxyDXY&321@gitlab.dxbim.com/products/dxyp-configcenter.git

修改后:

#git clone -b xbase http://rdc:dxyDXY\&321@gitlab.dxbim.com/products/dxyp-configcenter.git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
path="
centos-paas-user-api
centos-paas-user-rpc
centos-paas-viewer
centos-paas-viewer2
centos-paas-viewport-api
centos-paas-viewport-rpc
centos-paas-web
centos-paas-xbase
centos-paas-xbase-rpc
centos-paas-xbase2-api
"
search_text="本次已选择k8s方式部署到测试环境"
replace_text="#首次拉取配置\n#cd /home/dx/apps/config/xbase\n#git clone -b xbase http://rdc:dxyDXY\&amp;321@gitlab.dxbim.com/products/dxyp-configcenter.git\n\n#拉取最新配置\ncd /home/dx/apps/config/xbase/dxyp-configcenter\ngit pull originxbase"

# Use the sed command to add text below the specified text
for i in ${path};do
sed -i "/${search_text}/a\\
${replace_text}
" "$i/config.xml"
done


# sed search string substitution
search_text1="sh /home/dx/apps/config/xbase/init/init_config.sh"
replace_text1="sh /home/dx/apps/config/xbase/dxyp-configcenter/init/init_config.sh"

for i in ${path};do
sed -i 's|'"$search_text1"'|'"$replace_text1"'|g' "$i/config.xml"
done

最终实现效果