jenkins实践篇(2)—— 自动打tag的可回滚发布模式

发布时间 2023-11-01 18:04:52作者: 蓝胖子的编程梦

大家好,我是蓝胖子,在上一篇我简单介绍了如何基于特定分支做自动编译和发布,在生产环境中,为了更加安全和快速回滚,我采取的是通过对代码打tag的方式来进行部署,下面我将详细介绍整个发布过程的逻辑。

发布与回滚思路

正常功能发布时,是基于master分支发布的,所以我在成功发布后,会将当时的master分支自动打上tag,当需要回滚时,则基于tag分支进行发布即可。如下图所示,当op选择rollback时则需要去选择tag的版本。

Pasted image 20231020172438.png

具体操作步骤

下面介绍下详细的步骤

Jenkins安装git Parameter 插件

要想出现tag模式的参数,需要安装git Parameter 插件,在Jenkins的Manage Jenkins→Plugins→Available Plugins 中安装 ,安装完成后在项目的配置页的This project is parameterized 中可以看到选项,

Pasted image 20231020174847.png

Pasted image 20231020175019.png

配置了这个还没完,因为jenkins还需要知道是从哪个git仓库获取tag,所以在下面的源码管理部分(SCM) 需要配置git地址。

Pasted image 20231020175203.png

安装Version Number 插件

接着因为要自动给仓库打上tag,所以这里涉及到tag的取名规则,我用了一个Version Number 的插件,它能够获取到当天的年,月,日数据,我可以利用它来为tag进行取名,来看下写pipeline脚本时如何用上,

pipeline {  
    agent any  
    environment {  
        PROJECT_NAME = 'project1'  
        GIT_URL = 'https://git.xxxx.git'  
        VERSION = VersionNumber versionPrefix:'prod.', versionNumberString: '${BUILD_DATE_FORMATTED, "yyyyMMdd"}.${BUILDS_TODAY}'  
    }  
    parameters {  
        choice(name:'OP',choices:'publish\nrollback',description: 'publish(发布新版本时选择,部署后自动生成新tag) rollback(回滚时选择,需要同时选择回滚的tag)')  
        choice(name:'DEPLOYENV',choices:'prod',description: '部署环境')  
        gitParameter (branch:'', branchFilter: 'origin/(.*)', defaultValue: 'master', description: '选择将要构建的标签', name: 'TAG', quickFilterEnabled: false, selectedValue: 'TOP', sortMode: 'DESCENDING_SMART', tagFilter: '*', type: 'PT_TAG', useRepository: env.GIT_URL)  
        choice(name:'APP',choices:'app1\app2',description: '应用名')  
     }
    stages{  
   stage('build'){  
        steps {  
                script {  
                   if (params.OP == 'publish') {  

                            sh """  
                               source ~/.bash_profile
                               box_build.sh $APP master $PROJECT_NAME
                           """                                              
                   } else {  
                        if (params.TAG == ''){  
                               error("回滚操作必须指定tag版本")  
                        }  

                                     sh """  
                                        source ~/.bash_profile
                                        box_build.sh $APP master $PROJECT_NAME $TAG
                                    """                   
                   }  
               }  
  
         }  
   }  
  
   stage('deploy'){  
       steps {  
              sh """  
                  source ~/.bash_profile
                  boxcli  --env=$DEPLOYENV  publish --app=$APP
              """   
       }  
   }  
  
   stage('tag') {  
           steps {  
               script {  
                   if (params.OP == 'publish') {  
                          sh """  
                              source ~/.bash_profile
                              cd ~/pkgs/src/$PROJECT_NAME
                              git tag $VERSION
                              git push --tags
                 """       
                   }  
               }  
           }  
        }  
}
}     

如上述代码所示,VERSION 变量就是最后的tag 名,最后类似于prod.20231020.1 这样的结构,最后的.1 代表的是当天build的次数。 其中编译和部署的stage里面是调用了我们公司自己的编译和发布脚本,这个每个公司的都不太一样,可自行修改。最后发布成功后,在最后一个阶段也就是tag 阶段,我们会自动堆项目打上tag。

在上述pipeline脚本中,我在parameters 指令中定义了gitParameter 以及其他参数,所以不用再到jenkins的界面去定义相关参数了。需要用到的插件在pipeline脚本中如何使用,在插件的官方网址上一般都会说明,照着例子写下来修改其中配置即可。

关于jenkins pipeline的语法可以参考我之前的一片文章 [jenkins 原理篇——pipeline流水线 声明式语法详解] https://mp.weixin.qq.com/s/QD2DwVypIN5-xWxYrAzITw