前言
在新私有化部署及部署同一私有化的测试环境部署工作中,需要使用大量时间逐个修改Jenkins上job的名字或者里面的配置,本文档整理了一些批量修改语句给大家参考,以提高部署效率。
注:使用每条命令前执行前先前面的find部分确认查找到的目录是否为目标目录再完整执行
一、修改job名称
在实际使用中请先将需要修改的job复制到其他目录,在其他目录进行操作再mv到对应Jenkins的job目录下防止误操作影响其他job
将job目录下的选择的对应私有化job拷到/root/cp/目录:
$ find . -maxdepth 1 -name "*hwx86*" -exec cp -a {} /root/cp/ \;
此处是先cd到对应Jenkins的job目录下执行,后面的操作在/root/cp/目录下执行
将目录下带有yunhe-prod的目录 中的yunhe-prod 替换为hwx86-test
$ find . -maxdepth 1 -name "*yunhe-prod" | xargs rename yunhe-prod hwx86-test
即修改yunhe-prod后缀到hwx86-test
然后复制修改完成的文件到对应的/opt/job/目录,job目录根据实际情况来
$ find . -maxdepth 1 -name "*hwx86*" -exec cp -a {} /opt/job/ \;
登录Jenkins在9000后面加上reload回车Jenkins会重新加载配置
再新建对应项目的视图勾选之前创建的job即可
二、job下配置文件内容修改
每个Jenkins上的job对应的配置在服务器上就是这个config.xml文件,所以对配置文件的修改后再reload Jenkins即等同与直接修改页面上的各配置
注意以下操作均在/alidata/.jenkins/jobs的job目录下运行,因为场景是在job已经创建后的批量修改配置操作所以在其他目录下无法调试,我是采用自己搭一个Jenkins进行调试
1、替换COMPANY 将COMPANY=yunhe替换为COMPANY=hwx86
$ find `find . -name "*-hwx86-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i 's/COMPANY=yunhe/COMPANY=hwx86/g'
2、将BUILD_ENV=prod替换为BUILD_ENV=test
find `find . -name "*-hwx86-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i 's/BUILD_ENV=prod/BUILD_ENV=test/g'
3、替换镜像:
将:
swr.cn-east-3.myhuaweicloud.com/syh/$IMAGE_NAME
替换为:
swr.cn-east-3.myhuaweicloud.com/x86/$IMAGE_NAME:v$tag
因为docker部署打的镜像标签为latest,而k8s是根据日期+构建次数作为版本号。故在某使用docker部署的私有化修改为k8s部署时需要这这里替换,反之亦然
$ find `find . -name "*-hwx86-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i 's?swr.cn-east-3.myhuaweicloud.com/syh/$IMAGE_NAME?swr.cn-east-3.myhuaweicloud.com/x86/$IMAGE_NAME:v$tag?g'
4将hwx86-front.txt或hwx86-backend.txt里的内容
插入docker push swr.cn-east-3.myhuaweicloud.com\/x86\/$IMAGE_NAME:v$tag 下方
这个需求为:
docker部署的jenkins任务到docker push XXXX就结束:
而如果要修改为k8s的版本下面就要添加编辑yaml的命令:
因为添加多行直接通过命令难以做的故将要添加的配置保存到文件:
hwx86-front.txt
# cat hwx86-front.txt
cat<< EOF>$ITEM_APP-front-$COMPANY-$BUILD_ENV.yaml
apiVersion: v1
kind: Service
metadata:
name: $ITEM_APP-front-$COMPANY-$BUILD_ENV
namespace: $NAMESPACE
spec:
ports:
- port: 80
targetPort: 80
selector:
app: $ITEM_APP-front-$COMPANY-$BUILD_ENV
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: $ITEM_APP-front-$COMPANY-$BUILD_ENV
namespace: $NAMESPACE
spec:
replicas: 1
selector:
matchLabels:
app: $ITEM_APP-front-$COMPANY-$BUILD_ENV
template:
metadata:
labels:
app: $ITEM_APP-front-$COMPANY-$BUILD_ENV
spec:
containers:
- name: $ITEM_APP-front-$COMPANY-$BUILD_ENV
image: swr.cn-east-3.myhuaweicloud.com/x86/$IMAGE_NAME:v$tag
ports:
- containerPort: 80
readinessProbe:
httpGet:
scheme: HTTP
path: /index.html
port: 80
initialDelaySeconds: 10
periodSeconds: 5
imagePullSecrets:
- name: registrypullsecret
EOF
echo "---------------k8s更新开始-----------------------"
\cp $ITEM_APP-front-$COMPANY-$BUILD_ENV.yaml $yaml_dir
cd $yaml_dir
chown -R hwx86.hwx86 ./
su - hwx86 <<EOF
kubectl apply -f $yaml_dir/$ITEM_APP-front-$COMPANY-$BUILD_ENV.yaml
EOF
hwx86-front.txt及hwx86-backend.txt为jenkins中的配置需要到服务器上直接查看job下'config.xml复制里面的内容,注意格式
前端:
$ find `find . -name "*front-hwx86-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i '/docker push swr.cn-east-3.myhuaweicloud.com\/x86\/$IMAGE_NAME:v$tag/r hwx86-front.txt'
后端:
$ find `find . ! -path "./*front*" -name "*-hwx86-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i '/docker push swr.cn-east-3.myhuaweicloud.com\/x86\/$IMAGE_NAME:v$tag/r hwx86-backend.txt'
5、删除文件中对应行中包含关键字 “应用yaml文件” “kubectl apply -f” 之间包括查找到的上下两行的全部内容
这个需求为k8s部署的私有化部署测试环境使用docker要删除jenkins配置中的:
两者包括之间内容
$ find `find . -name "*-zjhd-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i '/应用yaml文件/,/kubectl apply -f/d'
这个语句的使用可以扩展到比如现在前端打包:
批量去掉job配置中的相关行做到批量修改
2.6 从测试Jenkins迁移到119,需要修改后端打包的jdk版本
System为使用默认jdk,在Jenkins配置文件上不会体现,需要收到批量添加在环境中配置好的 jdk8
在<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>下方插入
<jdk>jdk8</jdk>
语句:
$ find `find . -name "*-ynjt-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i "/blockBuildWhenUpstreamBuilding/a\ <jdk>jdk8<\/jdk>"
7、job在不同Jenkins间迁移,Job中保存的公钥id(id对应实际密码)不通用,以gitlab为例,拉取代码的账号密钥需要批量替换,否则迁移job后读取不到原id对应的密码
修改为迁移后Jenkins保存的配置同样密码的id
语句:
$ find `find . -name "*-ynjt-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i 's/db33731d-05d9-483d-bdee-4d7e230d162f/9c76bd28-2af0-49de-a802-82e3737871dd/g'
8、修改固定打包节点到不选择节点
去掉选择的slave1节点,以及勾选:
语句:
$ find `find . -name "*-ynjt-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i '/slave1/d'
$ find `find . -name "*-ynjt-test"` -maxdepth 1 -name 'config.xml' | xargs sed -i 's/<canRoam>false<\/canRoam>/<canRoam>true<\/canRoam>/g'
9、因测试环境与正式环境k8s部署部分不同替换这部分内容
测试环境:
需要替换为正式环境:
逻辑上是删除测试环境下方的语句,补上下方正式环境的语句,但有个坑,来看的这个job例子的config.xml 文件
部分job这里的</command>紧跟着前面的语句代表这里是没有换行符的,而<command>脚本</command>两个标志是一一对应表示中间执行shell语句
如果冒然将这句话删除会导致上方的<command>找不到被删除的</command>使得job无法被Jenkins加载再页面上无法显示该job
所以需要在删除前将</command>变动到语句的下方=添加换行。
思路:筛选出未换行job在语句下新加一行添加</command>再将所有job的都做批量删执行语句的操作,保障所有job在操作后</command>没被删除
首先筛选出匹配到未换行的job(测试写法)
$ find . -name "config.xml" | grep -R "yaml</command>"
正式写法
$ find . -name "config.xml" | grep -R "yaml"</command>"
将</command>插入到kubectl apply -f所在行的下方
$ find . -name "config.xml" | grep -R "yaml</command>" | awk -F : '{print $1}' | xargs sed -i "/kubectl apply -f/a\</command>"
效果
删除从包涵echo ok || mkdir -p的行到包涵kubectl apply -f的行(同时删除查询到的这两行)
$ find `find . -name "*-ztcj-prod"` -maxdepth 1 -name 'config.xml' | xargs sed -i '/echo ok || mkdir -p/,/kubectl apply -f/d'
余下操作与4节根据前后端筛选添加文本种的文件操作一致
三、其他参考
1、config配置相关:将ADD ArmsAgent.tar.gz /alidata/app/sit插入ENV JAVA_OPTS=""上面
$ find . ! -path "./developer-service/*" -name 'Dockerfile' | xargs sed -i '/ENV JAVA_OPTS=""/i\ADD ArmsAgent.tar.gz /alidata/app/site'
2、将文件批量复制到所有目录下:比如要对data下某一个私有化相关相关的文件目录都复制进去一个文件或者目录
在批量复制目录的上一级目录使用(在比如jobs下使用复制到下面所有查找到的job目录下,要么写ls跟绝对路径) xxx为过滤关键字(项目名或部署级别) /root/test2/test 为要复制文件或目录 $0"" 双引号中间可以跟目录,会被拼接到复制到的目录后面
$ ls|grep xxx |awk -F. '{print "cp -a /root/test2/test "$0""}'|bash