本文为您介绍通过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资源包部署。