You need to enable JavaScript to run this app.
导航
通过流水线实现 Java 源码编译构建并部署至 ECS(v2)
最近更新时间:2024.11.06 19:27:01首次发布时间:2024.11.06 19:20:42

持续交付搭配火山引擎 云服务器制品仓库,可完成云上持续交付一站式体验。本文为您介绍如何使用持续交付一站式流水线对 Java 源码进行编译构建并自动化部署至 ECS 实例。

场景介绍

对于主机部署应用的场景,通过持续交付流水线,可实现源码编译构建,制品仓库打包归档,ECS 推送部署一站式体验,帮助您实现 CICD 流程的自动化与合规化。
本文以 Spring Boot Hello World 代码为例,使用 Maven 进行编译构建,将制品推送至制品仓库归档,并下载产物至 ECS 实例进行部署。

前提条件

  • 云服务器

  • 制品仓库

    • 已开通火山引擎制品仓库。

    说明

    制品仓库当前处于公测状态,如需体验,请优先联系您的售前经理或解决方案经理。

    • 已创建制品仓库实例。具体操作可参见 创建基础版实例
    • 已创建 Generic 制品格式仓库,且仓库的发布策略要求为非只读策略。 具体操作可参见 创建 Generic 仓库
  • 持续交付

操作步骤

步骤一:创建流水线

  1. 登录 持续交付控制台

  2. 在左侧导航栏选择 工作区,在工作区页面单击目标工作区名称,进入当前工作区。

  3. 单击 创建流水线,弹出 选择流水线模板 对话框。

  4. 选择 Java - 编译构建 & 制品上传 - 应用部署,单击 确定,进入当前流水线的流程编排页面。

步骤二:流程编排

  1. 配置代码源。

    1. 在代码源&触发器区域,单击 添加 > 代码源

    2. 在弹出的配置输入源页面,选择您的代码仓库类型、代码仓库和默认分支。配置完成后,单击 确定

  2. 配置 Java 编译构建任务。

    1. 单击 Java 编译构建 卡片,弹出编辑任务面板。

    2. 配置代码源下载策略。本实践对 Java 源码进行编译构建,故选择 下载代码

    3. 在面板中配置 Java 编译构建 步骤。

      配置项说明
      步骤名称默认为 Java编译构建。本示例保持默认。
      版本根据实际选择 Java 版本。
      编译命令根据实际业务,编写编译命令。
      失败时跳过开启后当前步骤运行失败直接跳过。本示例不开启。
    4. 在面板中配置 制品上传 步骤。

      配置项说明
      步骤名称默认为制品上传。本示例保持默认。
      地域选择制品仓库所在的地域。
      实例选择制品仓库的实例名称。
      仓库地址选择要上传的目标仓库。仅支持选择非只读策略的 Generic 制品格式仓库。
      制品文件路径填写制品上传后,存储在制品仓库中的目标路径。本示例为/,表示存储至根目录。
      制品名称自定义制品仓库中归档的文件名称,本示例为webapp-$(PIPELINERUN_ID).jar
      是否上传单文件本示例上传一个 .jar 包,故开启。
      打包路径填写 Java 编译构建产物的文件路径。本示例为/workspace/target/demo-0.0.1-SNAPSHOT.jar
      失败时跳过开启后当前步骤运行失败直接跳过。本示例不开启。
    5. 高级设置保持默认。

    6. 单击 确定,完成当前任务配置。

  3. 配置 ECS 部署任务。

    1. 删除模板中原本的 应用部署 阶段,在 Java 编译构建 后新增阶段,并添加 部署 > ECS 运维 任务。

    2. 按要求配置当前任务,表格中未提及的配置项保持默认。配置完成后,单击 确定

      配置项说明
      上游任务展示当前任务的上游串行任务名称。本示例为 Java 编译构建。
      制品下载支持选择上游 制品上传 步骤构建的制品,制品会被下载到您配置的文件路径。本示例配置的文件路径为/tmp/demo.jar
      地域选择 ECS 实例所在的地域。

      ECS 实例

      选择要进行部署的 ECS 实例,支持批量勾选。

      注意

      ECS 实例需要安装运维助手,否则会导致任务失败。

      执行路径填写命令执行路径,对于 Linux 实例,默认在/home目录下。

      执行用户

      您可以指定以某个实例中存在的用户执行命令。建议避免使用 root 用户,以降低安全风险。

      注意

      请指定拥有执行命令权限的用户。

      超时时间设置命令在每个实例上执行的超时时间,执行超时后,将判断该任务在对应实例上执行失败。本示例为 5 分钟。
      命令类型选择要执行的命令类型,本示例使用 Shell

      命令内容

      输入希望在 ECS 实例中运行的脚本。本示例脚本如下:

      #!/bin/bash
      
      # 应用程序配置变量
      APP_NAME="demo"
      APP_JAR_PATH="/home/webapp/${APP_NAME}.jar"
      APP_PID_PATH="/home/webapp/${APP_NAME}.pid"
      NEW_APP_JAR="/tmp/${APP_NAME}.jar"
      APP_LOG_PATH="/home/webapp/${APP_NAME}.log"
      mkdir -p /home/webapp/
      
      # 检查新旧jar文件是否存在
      if [ ! -f "${NEW_APP_JAR}" ]; then
          echo "New application artifact not found!"
          exit 1
      fi
      
      if [ -f "${APP_JAR_PATH}" ]; then
          echo "Check current application artifact"
          ls -al /home/webapp/
      else
          echo "Current application artifact not found!"
      fi
      
      echo "Check new application artifact"
      ls -al /tmp
      
      # 停止应用程序
      echo "Stopping the application..."
      # 执行springboot优雅退出
      if [ -f "${APP_JAR_PATH}" ]; then
          if curl -s -o /dev/null -X POST http://localhost:8080/actuator/shutdown; then
              echo "Shutdown request sent successfully."
              echo "Application has been stopped."
              # 删除旧的jar文件
              echo "Removing the old jar file..."
              rm -f ${APP_JAR_PATH}
          else
              echo "Failed to send shutdown request."
          fi
      else
          echo "Skip Stopping."
      fi
      
      if [ $? -eq 0 ]; then
          echo "Old jar file removed successfully."
      else
          echo "Failed to remove old jar file."
          exit 1
      fi
      
      # 替换新的jar文件
      echo "Replacing with the new jar file..."
      cp ${NEW_APP_JAR} ${APP_JAR_PATH}
      
      if [ $? -eq 0 ]; then
          echo "New jar file copied successfully."
      else
          echo "Failed to copy new jar file."
          exit 1
      fi
      
      # 启动应用程序
      echo "Starting the application..."
      nohup java -jar ${APP_JAR_PATH} > ${APP_LOG_PATH} 2>&1 &
      echo $! > ${APP_PID_PATH}
      echo "Application started."
      
      echo "Deployment complete."
      
  4. 可选配置流水线的基本信息、缓存目录、通知提醒。本示例保持默认。

  5. 单击 保存,保存流水线当前配置。

步骤三:运行流水线

  1. 在流水线列表页,选择刚才创建的目标流水线,单击操作列的运行图标。

  2. 在弹出的运行流水线对话框中,确认使用的代码源分支信息,可选填写运行说明。

  3. 单击 确定,流水线开始运行,系统跳转至当前流水线的详情页面。

结果验证

流程验证

在当前流水线的运行详情页面,查看各任务的运行结果。

  • 选择 Java 编译构建任务,单击制品详情,可跳转至制品仓库控制台,查看上传归档的制品详情。

  • 选择 ECS 运维任务,单击 批量任务查看 按钮,可跳转至云服务器控制台,查看 ECS 批量任务的执行情况。

业务验证

登录至完成部署的 ECS 实例,执行如下命令,正常输出 Hello World!代表应用运行正常。

curl http://localhost:8080/hello