基于Jenkins插件实现弹性伸缩中ECS资源包部署

本文为您介绍通过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资源包部署,其工作原理流程如下所示:工作原理图..png

Jenkins任务执行完成后,由于上述流程中OOS模板已为伸缩组创建一个生命周期挂钩,如果弹性伸缩后续扩容新的ECS实例时,则在弹性伸缩产品侧,该生命周期挂钩功能可实现从OSS中下载项目包并部署到新扩容出ECS资源上。具体流程如下所示:生命周期..png

准备工作

在操作前,请确保您已经完成以下工作。

  • 安装JenKins插件(Alibabacloud Package Deployment

    您需要为JenKins服务安装Alibabacloud Package Deployment插件,以备ECS资源包部署需要。

    1. 登录已部署的Jenkins服务。

    2. 在左侧导航栏,选择系统管理>插件管理>Available plugins

    3. 在搜索栏中输入Alibabacloud Package Deployment后,选中插件前的图片..png图标,然后单击Download now and install after restart插件..png

    4. Download progress页面,等待插件安装完成后重启Jenkins。

      Jenkins重启完成后,选择系统管理>插件管理>Installed plugins,您可以在Plugins页面查看到该插件。

  • 创建伸缩组

    本文以创建一个华东1(杭州)地域的ECS类型伸缩组为例(例如ECS-test-group),其中,该伸缩组已扩容3台ECS实例。具体操作,请参见配置伸缩组伸缩组..png

操作步骤

步骤一:配置阿里云AccessKey信息

使用Alibabacloud Package Deployment插件进行ECS资源部署前,您必须配置阿里云AccessKey信息,

  1. 登录已部署的Jenkins平台。

  2. 在左侧导航栏,选择系统管理>系统配置

  3. Configure System页面,配置Aliyun Access KeyAliyun Secret KeyAK..png

  4. 单击保存

步骤二:为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创建方式

  1. 在Jenkins页面的左侧导航栏,单击新建任务

  2. 创建自由风格(即Freestyle方式)的JenKins任务。

    以创建testfreestyle任务为例,具体如下所示:

    freestyle.png

    创建完成后,在Jenkins首页的任务列表下查看testfreestyle任务已创建成功。

Pipeline创建方式

  1. 在Jenkins页面的左侧导航栏,单击新建任务

  2. 创建Pipeline方式的JenKins任务。

    以创建testpipeline任务为例,具体如下所示:

    pipeline.png

    创建完成后,在Jenkins首页的任务列表下查看testpipeline任务已创建成功。

步骤四:构建项目和部署资源包

由于步骤三:创建JenKins任务使用的创建方式不同,对弹性伸缩管理的ECS资源进行包部署的操作也有所不同。

基于Freestyle方式的项目

如果希望在部署资源时实现一站式部署,无需人为干预部署过程,推荐您按照以下操作步骤进行ECS资源的部署。

  1. 在Jenkins任务列表中找到testfreestyle任务,单击任务名称(testfreestyle)。

  2. 在左侧导航栏,选择配置>源码管理,设置需要构建的源码URL(例如github地址)。

    url.png

  3. 构建后操作区域,单击增加构建后操作步骤,选择Alibabacloud Automatic Package Deployment

    构建后操作..png

  4. 设置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

    项目部署所执行的脚本。

    说明

    请您根据自身需要填写脚本内容。

  5. 单击保存

  6. 在左侧导航栏,单击立即构建

  7. 单击左下角的图标..jpeg(构建进度图标),进入控制台输出页面,查看项目已成功构建(SUCCESS)。一次性执行完成..png

基于Pipeline方式的项目

如果为了防止部署过程中出现异常,希望通过分批次暂停的部署方式,确保每一批次部署执行正常,推荐您使用流水线Pipeline script设置的方法。

  1. 在Jenkins任务列表中找到testpipeline任务,单击任务名称(testpipeline)。

  2. 在左侧导航栏,选择配置>流水线,配置流水线相关参数,然后单击保存

    • 定义:选择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环境。

  3. 可选:查看流水线示例步骤脚本。

    编辑上述Pipeline script脚本内容时,您可以参考Jenkins工具中Alibabacloud Package Deployment插件提供的3个流水线示例步骤,借助流水线语法中的片段生成器中的示例步骤,编辑符合实际场景需要的流水线步骤脚本。

    1. 流水线区域,单击流水线语法

    2. 进入片段生成器页面,在步骤区域的示例步骤下拉列表中,选择并配置Alibabacloud Package Deployment插件提供的3个流水线示例步骤。具体详情如下所示:示例步骤..png

      • 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:任务取消。

    3. 生成流水线脚本下方,查看已生成的流水线示例脚本。

      例如通过配置ossUploadAndOosExec可生成如下脚本,您可根据示例脚本内容,编写满足实际场景需要的流水线脚本。生成脚本示例步骤..png

    4. 在左侧导航栏,单击返回

  4. 在左侧导航栏,单击立即构建

  5. 通过阶段视图页面或者控制台输出页面,查看部署任务的执行情况。

    • 阶段视图页面

      例如:在阶段视图页面,当OOS任务处于暂停状态时,单击下图中蓝色区域(In Progress),在弹出的选项框中,根据部署情况,选择OOS模板任务暂停后的下一步操作为ApproveCancelled

      pipe-xingqiyi..png

    • 控制台输出页面

      例如:在控制台输出页面,当构建出现Input requested命令时,单击Input requested,根据部署情况,在弹出的Policy input required页面,选择OOS模板任务暂停后的下一步操作为ApproveCancelled选择下一步操作..png

验证结果

验证Alibabacloud Package Deployment插件的执行效果,可前往OSS控制台、ECS控制台、OOS控制台或者弹性伸缩控制台查看相应执行结果是否已生成。

  • 前往对象存储OSS管理控制台,查看上传打包的文件。具体操作,请参见搜索文件存储..png

  • 前往ECS云服务器管理控制台,获取ECS公网IP地址,然后在浏览器中输入http://<ECS公网IP>:8080,并按回车键启动项目。如果网页可以正常访问(如下图所示)表示项目已正常启动。2023-06-30_14-10-56.png

    说明

    <ECS公网IP>替换为您实际扩容ECS实例的公网IP地址。

  • 前往系统运维管理(OOS)管理控制台,查看模板执行详情。具体操作,请参见查看执行详情OOS执行结果..png

  • 前往弹性伸缩控制台,查看伸缩组中自动生成的生命周期挂钩。OOS模板会触发伸缩组自动创建一个生命周期挂钩。生命周期挂钩..png可选:如果弹性伸缩后续扩容了新的ECS实例,伸缩组的生命周期挂钩功能可实现自动下载OSS中的项目包并进行新ECS资源包部署。