本文為您介紹通過Jenkins插件(Alibabacloud Package Deployment)實現彈性伸縮中ECS資源包部署的最佳實踐。
前提條件
已部署JenKins服務。更多信息,請參見Jenkins官網。
背景信息
Jenkins插件(Alibabacloud Package Deployment)是由阿里云彈性伸縮團隊向Jenkins社區提供的插件,該插件結合了阿里云的彈性伸縮ESS、云服務器ECS、系統運維管理、對象存儲OSS等云產品,基于自建的Jenkins平臺,快速實現云上ECS資源的發布部署管理能力。
本文以SpringBoot項目(github地址)為例,介紹如何基于Jenkins插件(Alibabacloud Package Deployment)實現彈性伸縮中ECS資源包部署。
工作原理
在自建的Jenkins平臺上,Jenkins插件(Alibabacloud Package Deployment)結合OOS、OSS、彈性伸縮功能實現彈性伸縮中ECS資源包部署,其工作原理流程如下所示:
Jenkins任務執行完成后,由于上述流程中OOS模板已為伸縮組創建一個生命周期掛鉤,如果彈性伸縮后續擴容新的ECS實例時,則在彈性伸縮產品側,該生命周期掛鉤功能可實現從OSS中下載項目包并部署到新擴容出ECS資源上。具體流程如下所示:
準備工作
在操作前,請確保您已經完成以下工作。
安裝JenKins插件(Alibabacloud Package Deployment)
您需要為JenKins服務安裝Alibabacloud Package Deployment插件,以備ECS資源包部署需要。
登錄已部署的Jenkins服務。
在左側導航欄,選擇系統管理>插件管理>Available plugins。
在搜索欄中輸入Alibabacloud Package Deployment后,選中插件前的圖標,然后單擊Download now and install after restart。
在Download progress頁面,等待插件安裝完成后重啟Jenkins。
Jenkins重啟完成后,選擇系統管理>插件管理>Installed plugins,您可以在Plugins頁面查看到該插件。
創建伸縮組
本文以創建一個華東1(杭州)地域的ECS類型伸縮組為例(例如
ECS-test-group
),其中,該伸縮組已擴容3臺ECS實例。具體操作,請參見配置伸縮組。
操作步驟
步驟一:配置阿里云AccessKey信息
使用Alibabacloud Package Deployment插件進行ECS資源部署前,您必須配置阿里云AccessKey信息,
登錄已部署的Jenkins平臺。
在左側導航欄,選擇系統管理>系統配置。
在Configure System頁面,配置Aliyun Access Key和Aliyun Secret Key。
單擊保存。
步驟二:為OOSServiceRole角色授權
配置阿里云AccessKey信息后,還需要在阿里云賬號下創建OOS扮演的角色(OOSServiceRole角色),并為OOSServiceRole角色授權以下自定義策略。具體操作,請參見為OOS服務設置RAM權限。
自定義策略腳本示例如下:
{
"Version": "1",
"Statement": [
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ess:ResumeProcesses",
"ess:DescribeScalingInstances",
"ess:DescribeLifecycleHooks",
"ess:CreateLifecycleHook",
"ess:ModifyLifecycleHook",
"ess:SuspendProcesses",
"ess:CompleteLifecycleAction"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecs:DescribeInvocations",
"ecs:TagResources",
"ecs:DescribeInstances",
"ecs:RunCommand",
"ecs:DescribeInvocationResults"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "oos:ListExecutions",
"Resource": "*"
}
]
}
步驟三:創建JenKins任務
本文為您介紹通過構建一個自由風格的軟件項目(Freestyle)和Pipeline兩種方式創建JenKins任務的操作方法。
Freestyle創建方式
在Jenkins頁面的左側導航欄,單擊新建任務。
創建自由風格(即Freestyle方式)的JenKins任務。
以創建
testfreestyle
任務為例,具體如下所示:創建完成后,在Jenkins首頁的任務列表下查看
testfreestyle
任務已創建成功。
Pipeline創建方式
在Jenkins頁面的左側導航欄,單擊新建任務。
創建Pipeline方式的JenKins任務。
以創建
testpipeline
任務為例,具體如下所示:創建完成后,在Jenkins首頁的任務列表下查看
testpipeline
任務已創建成功。
步驟四:構建項目和部署資源包
由于步驟三:創建JenKins任務使用的創建方式不同,對彈性伸縮管理的ECS資源進行包部署的操作也有所不同。
基于Freestyle方式的項目
如果希望在部署資源時實現一站式部署,無需人為干預部署過程,推薦您按照以下操作步驟進行ECS資源的部署。
在Jenkins任務列表中找到
testfreestyle
任務,單擊任務名稱(testfreestyle
)。在左側導航欄,選擇配置>源碼管理,設置需要構建的源碼URL(例如github地址)。
在構建后操作區域,單擊增加構建后操作步驟,選擇Alibabacloud Automatic Package Deployment。
設置Alibabacloud Automatic Package Deployment相關參數。
主要參數說明如下所示,其他參數保持默認值即可。
配置項
說明
示例
Region
部署資源以及OSS、OOS的地區。
華東1(杭州)
ResourceType
操作資源類型。目前支持ESS和ECS。
ESS
ResourceId
資源ID。
說明本例選擇的操作資源類型為ESS,因此輸入環境準備中已創建的伸縮組(
ECS-test-group
)ID。asg-bp1fm3eq9dot****
Bucket
輸入OSS Bucket名稱。如果您未創建OSS Bucket,請先前往OSS控制臺進行配置,具體操作,請參見創建OSS Bucket。
ossbucketexample
ObjectName
構建項目打包后上傳到OSS Bucket的文件名。
說明上傳到OSS Bucket的文件名需要以
.zip
形式存儲。examplename.zip
LocalPath
Jenkins已構建項目的待打包上傳的目錄路徑。
/
DestinationDir
項目部署在云服務器ECS的位置。
/root/example.zip
BatchNumber
OOS模板任務執行的批次數(即伸縮組管理的ECS資源包部署的批次數)。
3
invokeScript
項目部署所執行的腳本。
說明請您根據自身需要填寫腳本內容。
單擊保存。
在左側導航欄,單擊立即構建。
單擊左下角的(構建進度圖標),進入控制臺輸出頁面,查看項目已成功構建(SUCCESS)。
基于Pipeline方式的項目
如果為了防止部署過程中出現異常,希望通過分批次暫停的部署方式,確保每一批次部署執行正常,推薦您使用流水線Pipeline script設置的方法。
在Jenkins任務列表中找到
testpipeline
任務,單擊任務名稱(testpipeline
)。在左側導航欄,選擇配置>流水線,配置流水線相關參數,然后單擊保存。
定義:選擇Pipeline script選項。
腳本:輸入Pipeline script腳本內容。腳本示例如下所示。
該腳本示例主要實現:Jenkins構建SpringBoot項目后,Jenkins插件會將其打包并上傳到OSS服務,然后執行OOS任務下載OSS上的目錄包,并將該目錄包分3批次下載在伸縮組所管理的ECS資源上,通過腳本命令啟動SpringBoot項目的tomcat demo服務,每完成一批任務,OOS任務將處于任務暫停狀態,此時,您可以根據已完成的部署情況,選擇OOS任務下一批部署操作是繼續還是取消。本示例以每10s查詢OOS執行任務狀態為例。
pipeline { agent any stages { stage('項目拉取') { steps { script{ checkout scmGit( branches: [[name: 'v2.1.0.RELEASE']], userRemoteConfigs: [[url: 'https://github.com/spring-projects/spring-boot']]) } } } stage('構建項目打包上傳部署') { steps { script { //將構建項目指定目錄打包上傳OSS后,OOS模板通過分批暫停方式將OSS上傳完成的包部署到ESS管理的ECS資源中,此時會返回OOS執行任務Id executeId = ossUploadAndOosExec(batchNumber:3, mode:'FailurePause', bucket: 'zln****', destinationDir:'/root/kk/testpipeline.zip', invokeScript:'source /etc/profile \\ncd /root/kk \\nunzip testpipeline.zip \\ncd /root/kk/testpipeline/spring-boot-samples/spring-boot-sample-tomcat \\nmvn spring-boot:run &', localPath:'/', objectName: 'workspace/spring****.zip', pausePolicy:'EveryBatchPause', region:'cn-hangzhou', resourceId: 'asg-bp15isanqpyoclxa****', resourceType:'ESS') env.EXECUTE_ID = executeId //通過OOS執行任務Id查詢OOS執行狀態 def status = oosStatusQuery(executeId:"${executeId}", region:'cn-hangzhou') //當OOS執行任務狀態沒有處于終態,進入循環 while (status != 'Success' && status != 'Failed' && status != 'Cancelled') { //如果OOS執行任務狀態處于等待狀態,此時需要用戶需要輸入命令,選擇是否要執行下一批ECS資源的部署 if (status == 'Waiting') { //通過用戶操作的選項,選擇Approve/Cancelled 實現執行下一批ECS資源的部署或者jenkins任務結束 def policy = input message: 'Policy input required', ok:'OK', parameters: [choice(name:'OOS execute policy', choices: 'Approve\nCancelled', description:'How to execute next step?')] //通過執行任務Id以及執行任務通知類型,推動OOS執行任務是繼續執行還是取消任務執行 oosExecuteNotify executeId:"${executeId}", notifyType:"${policy}", region:'cn-hangzhou' } //查詢OOS執行任務的間隔 sleep 10 //通過OOS執行任務Id查詢OOS執行狀態 status = oosStatusQuery(executeId:"${executeId}", region:'cn-hangzhou') } } } } } post { aborted { script { //防止jenkins任務執行終止時,OOS任務還處于運行/暫停狀態,這里在終止jenkins任務前將OOS任務進行取消 if (env.EXECUTE_ID != null) { oosExecuteNotify executeId:"${env.EXECUTE_ID}", notifyType:"Cancelled", region:'cn-hangzhou' } } } } }
說明為確保上述示例應用程序能夠順利構建,您必須確保待擴容的ECS實例已具備Maven、Java和unzip環境。
可選:查看流水線示例步驟腳本。
編輯上述Pipeline script腳本內容時,您可以參考Jenkins工具中Alibabacloud Package Deployment插件提供的3個流水線示例步驟,借助流水線語法中的片段生成器中的示例步驟,編輯符合實際場景需要的流水線步驟腳本。
在流水線區域,單擊流水線語法。
進入片段生成器頁面,在步驟區域的示例步驟下拉列表中,選擇并配置Alibabacloud Package Deployment插件提供的3個流水線示例步驟。具體詳情如下所示:
ossUploadAndOosExec:用于將已構建項目的相關目錄打包并上傳到OSS服務,然后OOS通過下載OSS上的目錄包并在相關ECS資源上進行部署。您可以通過配置以下相關參數,然后單擊生成流水線腳本,生成可參考的腳本內容。
配置項
說明
Region
OOS、OSS以及彈性伸縮所在的地域。例如華東1(杭州)。
ResourceType
資源類型。目前支持ESS和ECS。
本例選擇了ESS資源類型。
ResourceId
資源ID。本例設置了已創建的伸縮組ID。
Mode
OOS模板的執行方式,取值范圍:
Automatic(默認值):自動執行。
FailurePause:失敗暫停。
Debug:單步執行。
本例選擇了FailurePause執行方式。
PausePolicy
OOS模板的循環模式,取值范圍:
Automatic(默認值):不暫停。
EveryBatchPause:每批暫停。
FirstBatchPause:第一批暫停。
本示例選擇了EveryBatchPause模式。
BatchNumber
OOS模板執行的批次。
Bucket
OSS Bucket的名稱。
ObjectName
上傳至OOS的文件名稱。
LocalPath
已構建項目待打包的目錄路徑。
DestinationDir
OOS部署項目至ECS資源上的位置。
InvokeScript
部署項目所執行的腳本。
oosStatusQuery:用于查詢OOS模板的任務狀態,您可以通過配置以下相關參數,然后單擊生成流水線腳本,生成可參考的腳本內容。
配置項
說明
Region
OOS模板任務的所屬地域,例如華東1(杭州)。
ExecuteId
OOS模板任務的執行ID。您可以前往OOS控制臺查看,例如
exec-******
。oosExecuteNotify:用于OOS任務暫停后,執行下一步的操作,例如:任務繼續或取消。您可以通過配置以下相關參數,然后單擊生成流水線腳本,生成可參考的腳本內容。
配置項
說明
Region
OOS模板暫停任務所屬地域,例如華東1(杭州)。
ExecuteId
OOS模板暫停任務的執行ID。您可以前往OOS控制臺查看,例如
exec-******
。NotifyType
OOS模板暫停任務執行的下一步操作。取值范圍:
Approve:任務繼續執行。
Cancelled:任務取消。
在生成流水線腳本下方,查看已生成的流水線示例腳本。
例如通過配置ossUploadAndOosExec可生成如下腳本,您可根據示例腳本內容,編寫滿足實際場景需要的流水線腳本。
在左側導航欄,單擊返回。
在左側導航欄,單擊立即構建。
通過階段視圖頁面或者控制臺輸出頁面,查看部署任務的執行情況。
階段視圖頁面
例如:在階段視圖頁面,當OOS任務處于暫停狀態時,單擊下圖中藍色區域(In Progress),在彈出的選項框中,根據部署情況,選擇OOS模板任務暫停后的下一步操作為Approve或Cancelled。
控制臺輸出頁面
例如:在控制臺輸出頁面,當構建出現Input requested命令時,單擊Input requested,根據部署情況,在彈出的Policy input required頁面,選擇OOS模板任務暫停后的下一步操作為Approve或Cancelled。
驗證結果
驗證Alibabacloud Package Deployment插件的執行效果,可前往OSS控制臺、ECS控制臺、OOS控制臺或者彈性伸縮控制臺查看相應執行結果是否已生成。
前往對象存儲OSS管理控制臺,查看上傳打包的文件。具體操作,請參見搜索文件。
前往ECS云服務器管理控制臺,獲取ECS公網IP地址,然后在瀏覽器中輸入
http://<ECS公網IP>:8080
,并按回車鍵啟動項目。如果網頁可以正常訪問(如下圖所示)表示項目已正常啟動。說明<ECS公網IP>
替換為您實際擴容ECS實例的公網IP地址。前往系統運維管理(OOS)管理控制臺,查看模板執行詳情。具體操作,請參見查看執行詳情。
前往彈性伸縮控制臺,查看伸縮組中自動生成的生命周期掛鉤。OOS模板會觸發伸縮組自動創建一個生命周期掛鉤。可選:如果彈性伸縮后續擴容了新的ECS實例,伸縮組的生命周期掛鉤功能可實現自動下載OSS中的項目包并進行新ECS資源包部署。