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"
整体思路:
首先备份jenkins的所有job,任何操作没有绝对的把握先进行备份
获取Jenkins的所有job_name
遍历jobname,对每个job的配置文件config,通过Linux命令进行修改
修改好以后需要重启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 " 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会全部消失
如以下范例:增加了&如果不加的话会造成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\&321@gitlab.dxbim.com/products/dxyp-configcenter.git\n\n#拉取最新配置\ncd /home/dx/apps/config/xbase/dxyp-configcenter\ngit pull originxbase" for i in ${path} ;do sed -i "/${search_text} /a\\ ${replace_text} " "$i /config.xml" done 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
最终实现效果