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

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

发布与回滚思路

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

具体操作步骤

下面介绍下详细的步骤

Jenkins安装git Parameter 插件

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

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

安装Version Number 插件

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

groovy 复制代码
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流水线 声明式语法详解] mp.weixin.qq.com/s/QD2DwVypI...

相关推荐
tangdou36909865510 小时前
两种方案手把手教你多种服务器使用tinyproxy搭建http代理
运维·后端·自动化运维
int WINGsssss15 小时前
Git使用
git
用户07605303543817 小时前
Git Revert:安全移除错误提交的方式
git
Good_Starry1 天前
Git介绍--github/gitee/gitlab使用
git·gitee·gitlab·github
云端奇趣1 天前
探索 3 个有趣的 GitHub 学习资源库
经验分享·git·学习·github
henan程序媛1 天前
Jenkins Pipline流水线
运维·pipeline·jenkins
F_D_Z2 天前
【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:
网络·git·网络协议·ssl
等风来不如迎风去2 天前
【git】main|REBASE 2/6
git
艾伦~耶格尔2 天前
IDEA 配置 Git 详解
java·ide·git·后端·intellij-idea
云兮杜康2 天前
IDEA中用过git之后文件名颜色全变红
java·git·intellij-idea