一、概述
在上一篇文章,链接如下:
https://www.cnblogs.com/xiao987334176/p/13074198.html
已经实现了基于Jenkins Gitlab Harbor Rancher k8s CI/CD,但是有一个问题,需要jenkins ssh登录到k8s master节点执行kubectl修改镜像地址。
但是由于安全问题,不允许jenkins ssh登录到k8s master节点。这个时候,可以通过Redeploy Rancher2.x Workload插件来完成修改镜像地址。
这样就避免了ssh登录问题。
二、Rancher创建api key
这个是给Jenkins来使用的。
点击用户右上角-->API & Keys
添加key
输入描述,选择永不过期,这里不指定作用范围。
请根据实际情况来原则
创建成功后,一定要保存。它只会显示一次
对于Redeploy Rancher2.x Workload Plugin而言,它只需要用到2个参数。
代码语言:javascript复制API访问地址:
https://10.212.82.86/v3
Bearer Token:
token-96p7n:d8sw4vlff68kqspcwnflbwpptt565c5cszltwbhgb4wcz9w6k5fxmj
下面会重点介绍
三、jenkins配置
插件安装
Redeploy Rancher2.x Workload
这个插件是专门针对Rancher2.x版本的,1.x版本的插件为Rancher
Environment Injector
这个插件是用来修改jenkins 环境变量用的。
添加凭据
点击凭据
点击进去
再点击
添加凭据
类型选择rancher2.x API Keys
说明:
ID: 这个是唯一的,随便填写。
描述: 随便填写
Endpoint:Rancher api地址,上面Rancher api keys里面的信息
Trust certification:信任证书,这里一定要勾选。
Bearer Token:不记名token,,上面Rancher api keys里面的信息
填写完成后,点击Test Connection按钮,出现Connect Succeed!,表示连接成功。
最后点击保存。
新建job
名称为:test_admin_rancher,选择自由风格。
通用配置
参数化构建
源码管理
执行shell脚本
完整代码如下:
代码语言:javascript复制export HARBOR_PROJECT='10.212.82.86:1180/java/admin-master'
case $Status in
Deploy)
echo "Status:$Status"
cd ${WORKSPACE}
mvn -f pom.xml clean package
cp dockerfile target
cd target
docker build -t ${HARBOR_PROJECT}:${BUILD_NUMBER} .
docker push ${HARBOR_PROJECT}:${BUILD_NUMBER}
docker rmi ${HARBOR_PROJECT}:${BUILD_NUMBER}
echo "BUILD_ID=${BUILD_NUMBER}" > ${WORKSPACE}/env.txt
echo "Completing!"
;;
Rollback)
echo "Status:$Status"
echo "Version:${BUILD_ID}"
echo "BUILD_ID=${BUILD_ID}" > ${WORKSPACE}/env.txt
;;
*)
exit
;;
esac
这里有2个步骤,分别是发布和回滚。在最后一步时,写入了一个env.txt,它就是用来修改jenkins环境的。
注入环境变量
写入路径 ${WORKSPACE}/env.txt
重新部署Rancher2.x工作负载
内容如下:
说明:
第一行显示乱码的,就是上面jenkins创建的凭证
Workload API Path:工作api路径,注意:必须是以/project开头的。先来登录Rancher后台,查看工作负载
先找到我需要发布的应用admin-master-->api查看
跳转的url为:
代码语言:javascript复制https://10.212.82.86/v3/project/c-l5nxb:p-dghs7/workloads/statefulset:default:admin-master
那么Workload API Path的值,就是:以/project/开头,一直到后面部分。也就是上面我截图显示的。
Always Pull Image:这里表示总是拉取镜像
Update Images:更新的镜像地址。10.212.82.86:1180/java/admin-master:${BUILD_ID},注意:这里有一个变量BUILD_ID。发布和回滚时,都会用到此变量。
表示镜像的版本!
最后点击保存
四、测试发布和回滚
发布
先来看目录运行的镜像版本,显示是32
登录jenkins,发布一下。
点击Build with Parameters
点击开始构建
查看控制台输出:
代码语言:javascript复制 export HARBOR_PROJECT=10.212.82.86:1180/java/admin-master
HARBOR_PROJECT=10.212.82.86:1180/java/admin-master
case $Status in
echo Status:Deploy
Status:Deploy
cd /var/lib/jenkins/workspace/test_admin_rancher
mvn -f pom.xml clean package
...
echo BUILD_ID=1
echo 'Completing!'
Completing!
[EnvInject] - Injecting environment variables from a build step.
[EnvInject] - Injecting as environment variables the properties file path '/var/lib/jenkins/workspace/test_admin_rancher/env.txt'
[EnvInject] - Variables injected successfully.
set image tag from "10.212.82.86:1180/java/admin-master:32" to "10.212.82.86:1180/java/admin-master:1"
redeploy Rancher2.x workload succeed!
Finished: SUCCESS
可以看到镜像更新为:10.212.82.86:1180/java/admin-master:1
登录jenkins服务器,查看环境变量文件
代码语言:javascript复制# cat /var/lib/jenkins/workspace/test_admin_rancher/env.txt
BUILD_ID=1
注意:此文件定义的环境会覆盖jenkins的环境变量,因此镜像版本为1。
刷新Rancher页面,发现地址已经更改过来了。
回滚
假设我需要回滚版本到32,请确保harbor仓库中,此镜像存在。
选择回滚,输入32
查看控制台输出:
代码语言:javascript复制 export HARBOR_PROJECT=10.212.82.86:1180/java/admin-master
HARBOR_PROJECT=10.212.82.86:1180/java/admin-master
case $Status in
echo Status:Rollback
Status:Rollback
echo Version:32
Version:32
echo BUILD_ID=32
[EnvInject] - Injecting environment variables from a build step.
[EnvInject] - Injecting as environment variables the properties file path '/var/lib/jenkins/workspace/test_admin_rancher/env.txt'
[EnvInject] - Variables injected successfully.
set image tag from "10.212.82.86:1180/java/admin-master:1" to "10.212.82.86:1180/java/admin-master:32"
redeploy Rancher2.x workload succeed!
Finished: SUCCESS
可以看到镜像更新为:10.212.82.86:1180/java/admin-master:32
登录jenkins服务器,查看环境变量文件
代码语言:javascript复制# cat /var/lib/jenkins/workspace/test_admin_rancher/env.txt
BUILD_ID=32
注意:此文件定义的环境会覆盖jenkins的环境变量,因此镜像版本为32。
刷新Rancher页面,发现地址已经更改过来了。
总结
通过jenkins Redeploy Rancher2.x Workload插件,调用Rancher api,修改镜像地址,完成了应用服务的发布和回滚。
在上篇文章中,用到了Pipeline。但是这篇文章中,用的是自由风格。
其实我也想用Pipeline,但是我不知道如何在Pipeline中调用Redeploy Rancher2.x Workload插件,所以只能用自由风格了。