• jenkins Redeploy Rancher2.x Workload插件实现CI/CD


    一、概述

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

    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个参数。

    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脚本

    完整代码如下:

    复制代码
    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为:

    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

    点击开始构建

    查看控制台输出:

    复制代码
    + 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服务器,查看环境变量文件

    # cat /var/lib/jenkins/workspace/test_admin_rancher/env.txt
    BUILD_ID=1

    注意:此文件定义的环境会覆盖jenkins的环境变量,因此镜像版本为1。

    刷新Rancher页面,发现地址已经更改过来了。

    回滚

    假设我需要回滚版本到32,请确保harbor仓库中,此镜像存在。

    选择回滚,输入32

    查看控制台输出:

    复制代码
    + 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服务器,查看环境变量文件

    # 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插件,所以只能用自由风格了。

    五、Pipeline发布

    感谢 QuintinX 网页提供的帮助,pipeline的部分官方文档: https://plugins.jenkins.io/redeploy-rancher2-workload/

    模板如下:

    node {
       rancherRedeploy alwaysPull: true, credential: 'rancher', images: 'busybox:lastest', workload: '/project/c-h4hxd:p-c9j8z/workloads/deployment:default:busybox'
    }

    说明:

    alwaysPull: true表示总是pull下载镜像。

    credential: jenkins凭证id,用于调用Rancher2.x  api

    images: 更新的镜像地址

    workload:API Path的值,一般以/project/开头

    新建job

    新建一个job,选择流水线

    通用配置

    参数化构建

    流水线

     完整代码如下:

    复制代码
    env.CREDENTIALSID = '3085730e-f6f1-41aa-9e2b-f5586fdd6896'
    env.BRANCHES = 'master'
    env.GIT_URL = 'ssh://git@gitlab.aliyun.com:8022/root/admin-master.git'
    env.HARBOR_PROJECT = '192.168.31.179:1180/java/admin-master'
    
    node {
       if (env.Status == 'Deploy'){
           stage('code pull') {
               checkout([$class: 'GitSCM', branches: [[name: env.BRANCHES]],
               doGenerateSubmoduleConfigurations: false,
               userRemoteConfigs: [[credentialsId: env.CREDENTIALSID, url: env.GIT_URL]]])
           }
           stage('code Build') {
             sh '/data/apache-maven-3.6.3/bin/mvn -f pom.xml clean package'
           }
           stage('docker push') {
             sh 'cd ${WORKSPACE} && cp dockerfile target'
             sh 'cd ${WORKSPACE}/target && docker build -t ${HARBOR_PROJECT}:${BUILD_NUMBER} .'
             sh 'docker push ${HARBOR_PROJECT}:${BUILD_NUMBER}'
             sh 'docker rmi ${HARBOR_PROJECT}:${BUILD_NUMBER}'
           }
           stage('Rancher2 deploy') {
             rancherRedeploy alwaysPull: true, credential: "rancher2.x", images: "${HARBOR_PROJECT}:${BUILD_NUMBER}", workload: "/project/c-8hbz6:p-6h97b/workloads/deployment:default:admin-master"
           }
       }else{
           stage('Rancher2 rollback') {
               rancherRedeploy alwaysPull: true, credential: "rancher2.x", images: "${HARBOR_PROJECT}:${BUILD_ID}", workload: "/project/c-8hbz6:p-6h97b/workloads/deployment:default:admin-master"
           }
       }
    }
    复制代码

    点击底部的保存按钮

    发布

     效果如下:

    回滚

     效果如下:

  • 相关阅读:
    JVM类加载(3)—初始化
    JVM类加载(1)—加载
    SQL笔记
    html5离线Web应用
    推荐3个很好的html5 网址
    HTML 5 File API应用实例
    异常与错误的区别
    html5Local Storage(本地存储)
    HTML5 js api 新的选择器
    5个HTML5 API
  • 原文地址:https://www.cnblogs.com/ExMan/p/13959083.html
Copyright © 2020-2023  润新知