大家好,我是藍胖子,在上一篇我簡單介紹瞭如何基於特定分支做自動編譯和釋出,在生產環境中,為了更加安全和快速回滾,我採取的是通過對程式碼打tag的方式來進行部署,下面我將詳細介紹整個釋出過程的邏輯。
正常功能釋出時,是基於master分支釋出的,所以我在成功釋出後,會將當時的master分支自動打上tag,當需要回滾時,則基於tag分支進行釋出即可。如下圖所示,當op選擇rollback時則需要去選擇tag的版本。
下面介紹下詳細的步驟
要想出現tag模式的引數,需要安裝git Parameter 外掛,在Jenkins的Manage Jenkins→Plugins→Available Plugins 中安裝 ,安裝完成後在專案的設定頁的This project is parameterized 中可以看到選項,
設定了這個還沒完,因為jenkins還需要知道是從哪個git倉庫獲取tag,所以在下面的原始碼管理部分(SCM) 需要設定git地址。
接著因為要自動給倉庫打上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