jenkins實踐篇(2)—— 自動打tag的可回滾釋出模式

2023-11-01 21:00:26

大家好,我是藍胖子,在上一篇我簡單介紹瞭如何基於特定分支做自動編譯和釋出,在生產環境中,為了更加安全和快速回滾,我採取的是通過對程式碼打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指令碼時如何用上,

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