使用 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>
添加秘密
我们需要添加以下密钥
- AWS_ACCESS_KEY_ID 具有部署访问权限的 ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY 关联的 SECRET_ACCESS_KEY
- AWS_REGION 集群部署所在的区域
- AWS_ECR_REPOSITORY 我们将把镜像推送到的 ECR 存储库的名称。
步骤 1
添加AWS_ACCESS_KEY_ID和AWS_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
将 AWS 控制台中的 JSON 数据粘贴到新创建的文件中。
我使用 ` <branch_name>`dev.json作为dev我的默认分支名称。我希望推送到此分支的代码能够部署到dev环境中。
您需要对qa和production环境重复此步骤。
触发工作流,使其在合并到发布分支时运行
步骤 1 - 创建工作流程
.github/workflows在文件夹中创建一个新的持续部署工作流
touch .github/workflows/cd.yml
步骤二 - 设置触发器
确定你的发布分支。第一个发布分支将是你的默认分支,团队通常也应该在这个分支上提交拉取请求,以便添加新功能。
就我而言,这是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:
将以上代码粘贴到新创建的cd.yml文件中
步骤 3 - 结账代码
此步骤会拉取最新代码。
...
steps:
- name: Checkout
uses: actions/checkout@v2
步骤 4 - 获取分支名称
获取当前分支名称。此步骤将获取并存储当前 Git 分支名称。现在可以像这样访问它:${{steps.vars.outputs.stage}}
...
steps:
...
- name: Get branch name
id: vars
run: echo ::set-output name=stage::${GITHUB_REF#refs/*/}
步骤 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 }}
步骤 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
步骤 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
步骤 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 }}
- 任务定义文件夹将包含所有环境的任务定义。我创建以环境名称命名的 JSON 文件,并
${{steps.vars.outputs.stage}}.json在工作流中使用它。 - 我给容器命名时,会以阶段名称作为后缀。我
<container-name>${{steps.vars.outputs.stage}}.json在工作流中会引用它。 - 我们引用刚刚推送到 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 }}
步骤 10 - 退出 ECR
部署完成后,请注销 ECR。
...
steps:
...
- name: Logout of Amazon ECR
if: always()
run: docker logout ${{ steps.login-ecr.outputs.registry }}
接下来该何去何从
既然您已经设置了 CD 管道来将应用程序部署到 ECS,我建议您阅读我们关于“如何在多容器环境中执行批处理作业”的文章。
希望这篇关于如何创建持续交付 (CD) 流水线来部署 ECS 应用程序的教程对您有所帮助。如果您有任何问题或意见,请加入下方的论坛讨论。
文章来源:https://dev.to/wednesdaysol/creating-a-continuous-deployment-workflow-using-github-actions-to-deploy-your-application-to-ecs-4l78







