发布于 2026-01-06 2 阅读
0

使用 GitHub Actions 创建持续部署工作流,将应用程序部署到 ECS

使用 GitHub Actions 创建持续部署工作流,将应用程序部署到 ECS

编写良好的持续部署 (CD) 管道可确保每次合并到发布分支时,都会创建一个工件并将其部署到正确的环境中。

在使用容器化应用程序时,持续交付 (CD) 流水线需要包含以下步骤。

  • 代码检出
  • 安装依赖项
  • 构建图像
  • 推送到容器注册表
  • 下次部署请使用最新镜像。
  • 触发新的部署

在本教程中,我们将使用 GitHub Actions 编写一个持续交付 (CD) 流水线,完成上述所有任务。我们将使用 AWS ECS 部署我们的应用程序。

AWS ECS 是 AWS 提供的完全托管的容器编排服务。它可以帮助您轻松部署、管理和扩展容器化应用程序。

本教程假设您对以下内容有扎实的理解:

它还隐含地假设您的应用程序已部署在 ECS 上。完成本教程后,您将能够实现合并到发布分支时自动执行部署。

在本教程中,我将带您了解如何操作。

  • 合并到发布分支时触发工作流。
  • 构建镜像并将其推送到 Elastic Container Registry
  • 使用新创建的映像更新任务定义
  • 将应用程序部署到新环境

入门项目

请克隆以下仓库:https://github.com/wednesday-solutions/ecs-cd-starter

设置数据库连接

更新相关的数据库连接详细信息。.env.development

DB_URI=postgres://<role>:<password>@<host>:<port>/<db>
POSTGRES_HOST=<host>
POSTGRES_DB=<db>
POSTGRES_USER=<user>
POSTGRES_PASSWORD=<password>
Enter fullscreen mode Exit fullscreen mode

添加秘密

我们需要添加以下密钥

  • AWS_ACCESS_KEY_ID 具有部署访问权限的 ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY 关联的 SECRET_ACCESS_KEY
  • AWS_REGION 集群部署所在的区域
  • AWS_ECR_REPOSITORY 我们将把镜像推送到的 ECR 存储库的名称。

步骤 1

添加AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY密钥* *

替代文字

替代文字

步骤 2

添加 AWS 部署区域

替代文字

步骤 3

从 AWS 控制台获取存储库名称并将其添加为密钥。

替代文字

我省略了-dev表示阶段的部分。我们将使用相同的流程部署到多个环境,因此会在运行时推断阶段。

替代文字

为所有环境创建 task-definition.json 文件

步骤 1

请访问以下网址:https://ap-south-1.console.aws.amazon.com/ecs/home? region=ap-south-1#/taskDefinitions

我使用的ap-south-1是 AWS 区域。请根据您所在的区域更改 URL。

替代文字

步骤 2:
选择适用于您的环境和项目的任务定义。在我的例子中,它是……ecs-cd-starter-dev

替代文字

步骤 3

选择最新版本,然后转到该JSON选项卡。

替代文字

第四步

复制 JSON 数据。
在终端中运行以下代码片段。

mkdir task-definition
touch task-definition/dev.json
Enter fullscreen mode Exit fullscreen mode

将 AWS 控制台中的 JSON 数据粘贴到新创建的文件中。

我使用 ` <branch_name>`dev.json作为dev我的默认分支名称。我希望推送到此分支的代码能够部署到dev环境中。

您需要对qaproduction环境重复此步骤。

触发工作流,使其在合并到发布分支时运行

步骤 1 - 创建工作流程

.github/workflows在文件夹中创建一个新的持续部署工作流

touch .github/workflows/cd.yml
Enter fullscreen mode Exit fullscreen mode

步骤二 - 设置触发器

确定你的发布分支。第一个发布分支将是你的默认分支,团​​队通常也应该在这个分支上提交拉取请求,以便添加新功能。

就我而言,这是dev分支。通常情况下,你还会有两个以上的环境。

  • 问答
  • 生产

所以,每当这些分支之一收到推送时,我们就触发这个工作流程。

name: ECS Starter CD Develop

on:
  push:
    branches:
      - dev
      - qa
      - master
jobs:
  docker-build-push-deploy:
    name: Docker build, push and deploy
    runs-on: ubuntu-latest
    steps:
Enter fullscreen mode Exit fullscreen mode

将以上代码粘贴到新创建的cd.yml文件中

步骤 3 - 结账代码

此步骤会拉取最新代码。

...
    steps:
      - name: Checkout
        uses: actions/checkout@v2
Enter fullscreen mode Exit fullscreen mode

步骤 4 - 获取分支名称

获取当前分支名称。此步骤将获取并存储当前 Git 分支名称。现在可以像这样访问它:${{steps.vars.outputs.stage}}

...
    steps:
      ...
      - name: Get branch name
        id: vars
        run: echo ::set-output name=stage::${GITHUB_REF#refs/*/}
Enter fullscreen mode Exit fullscreen mode

步骤 5 - 配置 AWS 凭证

配置 AWS 凭证和区域。使用 GitHub Secrets 中的值来配置 AWS 凭证。
要更详细地了解所有配置选项,请参阅此处的文档:https://github.com/aws-actions/configure-aws-credentials#usage

...
    steps:
      ...
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
Enter fullscreen mode Exit fullscreen mode

步骤 6 - 登录 ECR

使用 aws-actions/amazon-ecr 操作登录 AWS ECR。

要更详细地了解所有配置选项,请参阅此处的文档:https://github.com/aws-actions/amazon-ecr-login#usage

...
    steps:
      ...
      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1
Enter fullscreen mode Exit fullscreen mode

步骤 7 - 构建标签并将映像推送到 ECR

现在我们需要构建 Docker 镜像,添加标签并将其推送到 AWS ECR。使用提交哈希值来标记镜像。

...
    steps:
      ...
      - name: Build, tag, and push image to Amazon ECR
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPOSITORY }}-${{steps.vars.outputs.stage}}
          AWS_REGION: ${{ secrets.AWS_REGION }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG3
Enter fullscreen mode Exit fullscreen mode

步骤 8 - 渲染任务定义

我们通过更新镜像值来创建一个新的任务定义修订版本。我们将指向刚刚推送到 ECR 的镜像。

...
    steps:
      ...
      - name: Render Amazon ECS task definition
        id: ecs-cd-starter-container
        uses: aws-actions/amazon-ecs-render-task-definition@v1
        with:
          task-definition: task-definition/${{steps.vars.outputs.stage}}.json #1
          container-name: ecs-cd-starter-${{steps.vars.outputs.stage}} #2
          image: ${{ steps.login-ecr.outputs.registry }}/${{ secrets.AWS_ECR_REPOSITORY }}-${{steps.vars.outputs.stage}}:${{ github.sha }}
Enter fullscreen mode Exit fullscreen mode
  1. 任务定义文件夹将包含所有环境的任务定义。我创建以环境名称命名的 JSON 文件,并${{steps.vars.outputs.stage}}.json在工作流中使用它。
  2. 我给容器命名时,会以阶段名称作为后缀。我<container-name>${{steps.vars.outputs.stage}}.json在工作流中会引用它。
  3. 我们引用刚刚推送到 ECR 注册表中的图像。

步骤 9 - 部署到 ECS

我们使用刚刚创建的最新版任务定义将应用程序部署到 ECS。我-branchName在命名服务和集群时使用相同的后缀。

...
...
    steps:
      ...
      - name: Deploy to Amazon ECS service
        uses: aws-actions/amazon-ecs-deploy-task-definition@v1
        with:
          task-definition: ${{ steps.pawlyclinic-api-container.outputs.task-definition }}
          service: ecs-cd-starter-${{ steps.vars.outputs.stage }}
          cluster: ecs-cd-starter-${{ steps.vars.outputs.stage }}
Enter fullscreen mode Exit fullscreen mode

步骤 10 - 退出 ECR

部署完成后,请注销 ECR。

...
    steps:
      ...
      - name: Logout of Amazon ECR
        if: always()
        run: docker logout ${{ steps.login-ecr.outputs.registry }}
Enter fullscreen mode Exit fullscreen mode

接下来该何去何从

既然您已经设置了 CD 管道来将应用程序部署到 ECS,我建议您阅读我们关于“如何在多容器环境中执行批处理作业”的文章。

希望这篇关于如何创建持续交付 (CD) 流水线来部署 ECS 应用程序的教程对您有所帮助。如果您有任何问题或意见,请加入下方的论坛讨论。

文章来源:https://dev.to/wednesdaysol/creating-a-continuous-deployment-workflow-using-github-actions-to-deploy-your-application-to-ecs-4l78