一、摘要

在上一篇文章,链接如下:

https://www.cnblogs.com/xiao987334176/p/11434849.html

镜像打的是latest版,如果需要回滚的话,就比较麻烦了。

因此,需要修改为参数化构建。镜像的版本,使用时间戳。

本文采用的环境,依然是上一篇的环境,就不多介绍了。

二、参数化构建

发布

修改 ph任务,勾选 此项目参数化构建,点击添加参数,选择Choice Parameter

输入参数,这里有2个固定选项,分别是发布和回滚,再点击底部的添加参数,选择String Parameter

输入参数,这个版本号,就是来回滚的。

再进入到Bulid,修改执行命令

case $Status  in
Deploy)
echo "Status:$Status"
bash -x /root/docker_dir/deploy_docker.sh
echo "Completing!"
;;
Rollback)
echo "Status:$Status"
echo "Version:$Version"
bash -x /root/docker_dir/rollback_docker.sh
echo "Completing!"
;;
*)
exit
;;
esac

效果如下:

修改3个shell脚本

deploy_docker.sh

#!/bin/bash

set -e
harbor_project="java"
projectName=$JOB_NAME
docker_path=${WORKSPACE}
appName=${JOB_NAME}.jar # harbor认证用户
user_name=jenkins
password=Jenkins@ # harbor地址以及tag
tag=$(date +%s)
harbor_server=192.168.10.122
server_path=${harbor_server}
taget_image=${projectName}:${tag}
#${BUILD_NUMBER}
echo ${taget_image} # 登录docker
cd ${docker_path}
sudo docker login ${harbor_server} -u ${user_name} -p ${password} # 生成镜像并推送到harbor,最后删除本地镜像
cp ${WORKSPACE}/target/*.jar ${appName}
sudo docker build --build-arg app=${appName} -t ${taget_image} .
sudo docker tag ${taget_image} ${server_path}/${harbor_project}/${taget_image}
echo "The name of image is ${server_path}/${harbor_project}/${taget_image}"
sudo docker push ${server_path}/${harbor_project}/${taget_image}
sudo docker rmi -f $(docker images|grep ${projectName}|grep ${tag}|awk '{print $3}'|head -n 1) # 替换yaml中镜像的版本号
MASTER="192.168.10.130"
CONF_DIR="/root/kube-conf" ssh ${MASTER} sed -i "s/${projectName}:[^.]*/${taget_image}/g" ${CONF_DIR}/${projectName}-rc.yaml

sed命令解释:

${projectName}:[^.]*   表示匹配 项目名:任意长度内容。

rollback_docker.sh

#!/bin/bash

# 替换yaml中镜像的版本号
MASTER="192.168.10.130"
CONF_DIR="/root/kube-conf"
projectName=${JOB_NAME}
taget_image=${JOB_NAME}:${Version} ssh ${MASTER} sed -i "s/${projectName}:[^.]*/${taget_image}/g" ${CONF_DIR}/${projectName}-rc.yaml

reboot_app.sh

#!/bin/bash
MASTER="192.168.10.130"
CONF_DIR="/root/kube-conf"
ProJ=${JOB_NAME} #scp ${WORKSPACE}/*.yaml ${MASTER}:${CONF_DIR}
# Pod running process
RUN=$(ssh $MASTER kubectl get po|grep -w ${ProJ}|wc -l)
if [ $RUN -eq 0 ];then
ssh ${MASTER} kubectl apply -f ${CONF_DIR}/${ProJ}-rc.yaml
ssh ${MASTER} kubectl apply -f ${CONF_DIR}/${ProJ}-service.yaml
else
# Delete and Apply
ssh ${MASTER} kubectl delete -f ${CONF_DIR}/${ProJ}-rc.yaml
ssh ${MASTER} kubectl delete -f ${CONF_DIR}/${ProJ}-service.yaml
ssh ${MASTER} kubectl apply -f ${CONF_DIR}/${ProJ}-rc.yaml
ssh ${MASTER} kubectl apply -f ${CONF_DIR}/${ProJ}-service.yaml
fi

点击下面的保存

点击Build with Parameters,选择Deploy,版本不用输入,默认即可。点击开始构建

等待任务构建完成后,查看harbor仓库中的ph项目,发现tag就是时间戳。

登陆到k8s的master节点,查看运行中的pod

root@k8s-master:~/kube-conf# kubectl describe po ph-rc-xzbjn
Name: ph-rc-xzbjn
Namespace: default
Priority:
Node: k8s-node1/192.168.10.131
Start Time: Sun, Sep :: +
Labels: app=ph
Annotations: cni.projectcalico.org/podIP: 192.168.36.99/
Status: Running
IP: 192.168.36.99
Controlled By: ReplicationController/ph-rc
Containers:
ph:
Container ID: docker://a403c9051a3aef451b80fae8765b5380029b36073bbf7f87d8d30f20efd2ee77
Image: 192.168.10.122/java/ph:1569749673

可以发现,镜像已经是指定的版本了。

多点击几次 Build with Parameters,查看harbor的镜像列表

三、回滚

假设说,现在k8s的ph项目使用的版本是 1569749522,发现有问题,需要回滚到上一个版本1569749773。

点击  Build with Parameters,选择Rollback,输入版本号。

查看构建任务的控制台输出

登录到k8s master节点,查看运行的pod,镜像是否更换了。

root@k8s-master:~/kube-conf# kubectl describe po ph-rc-rjf2w
Name: ph-rc-rjf2w
Namespace: default
Priority:
Node: k8s-node1/192.168.10.131
Start Time: Sun, Sep :: +
Labels: app=ph
Annotations: cni.projectcalico.org/podIP: 192.168.36.100/
Status: Running
IP: 192.168.36.100
Controlled By: ReplicationController/ph-rc
Containers:
ph:
Container ID: docker://60cf0d1bd21c1f67ddad1ccf6b554111d99d3206e1cb09574fa1cf793540e268
Image: 192.168.10.122/java/ph:1569749773

发现已经,更改过来了。

本文参考链接:

https://www.jianshu.com/p/af5fecaa8357

最新文章

  1. Android二维码之创建
  2. Elasticsearch 安装中文分词
  3. 阿里云服务器出现Warning: Cannot modify header information - headers already sent by (output started at 问题的解决方法
  4. PHP计算程序运行时间的类
  5. 再谈Jquery Ajax方法传递到action
  6. php数组转换js数组操作及json_encode应用
  7. 《OD学算法》排序之冒泡排序
  8. Oracle从11.2.0.2开始,数据库补丁包是一个完整安装包(转)
  9. Oracle function注释
  10. 页面传值中get和post区别
  11. mysql数据库的物理文件结构
  12. shell-逐行读取文件
  13. 解决 Oracle 11g 不能导出空表的问题
  14. Hibernate框架进阶(上篇)
  15. Linux 常见命令示例【一】
  16. .net core 2.0 Code First Fluent API配置
  17. 用python一起来看流星雨
  18. Altium Designer9.4局域网内冲突的问题
  19. Requests对HTTPS请求验证SSL证书
  20. 广告牌LED灯阵

热门文章

  1. 灰度图像--图像分割 Prewitt算子
  2. 【Beta】Scrum meeting 8 & 助教参会记录
  3. FCN内容通读
  4. mybatis-generator 模板
  5. idea中如何
  6. 修改Jupyter Notebook默认文件存储路径(已安装Anaconda)
  7. TortoiseGit用户名密码的更换方法介绍
  8. 003 okhttp超时与缓存
  9. session与getSession()用法总结
  10. dlib-android