如何在GitHub与AWS中实现Development/Staging/Production环境自动部署?
ECS多环境CI/CD(基于GitHub Actions)部署方案
前置准备
- 提前在AWS端创建Production、Staging两套独立的ECS集群、任务定义(Task Definition)、服务(Service),以及对应的ECR镜像仓库
- 在AWS IAM中创建CI/CD专用权限用户,授予ECS、ECR相关操作权限,生成
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,连同AWS区域、ECR仓库地址、两套环境的ECS集群名、服务名、任务定义名、容器名一并存入GitHub仓库的Secrets配置中 - 代码仓库遵循Git Flow规范管理:main分支作为生产和预发的基线分支,feature分支用于新功能开发,hotfix分支用于紧急问题修复
工作流配置
在仓库中创建.github/workflows/ecs-deploy.yml文件,内容如下:
name: ECS自动部署 on: push: branches: [ main ] # main分支有合并操作时触发预发部署 tags: [ 'v*' ] # main分支打v开头的正式tag时触发生产部署 jobs: deploy-to-ecs: runs-on: ubuntu-latest environment: ${{ startsWith(github.ref, 'refs/tags/') && 'production' || 'staging' }} steps: - name: 拉取仓库代码 uses: actions/checkout@v4 - name: 配置AWS访问凭证 uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.AWS_REGION }} - name: 登录ECR镜像仓库 id: login-ecr uses: aws-actions/amazon-ecr-login@v2 - name: 构建并推送镜像到ECR id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: ${{ secrets.ECR_REPO_NAME }} IMAGE_TAG: ${{ github.sha }} run: | docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT - name: 更新ECS任务定义的镜像地址 id: render-task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 with: task-definition: ${{ startsWith(github.ref, 'refs/tags/') ? secrets.ECS_TASK_DEF_PROD : secrets.ECS_TASK_DEF_STAGING }} container-name: ${{ secrets.ECS_CONTAINER_NAME }} image: ${{ steps.build-image.outputs.image }} - name: 部署更新到ECS服务 uses: aws-actions/amazon-ecs-deploy-task-definition@v1 with: task-definition: ${{ steps.render-task-def.outputs.task-definition }} service: ${{ startsWith(github.ref, 'refs/tags/') ? secrets.ECS_SERVICE_PROD : secrets.ECS_SERVICE_STAGING }} cluster: ${{ startsWith(github.ref, 'refs/tags/') ? secrets.ECS_CLUSTER_PROD : secrets.ECS_CLUSTER_STAGING }} wait-for-service-stability: true
开发环境适配
Development环境无需配置自动部署,团队成员可在本地构建Docker镜像做自测,也可单独创建一套开发环境的ECS资源,新增工作流触发规则为dev分支推送时自动部署,用于功能联调、hotfix验证。
注意事项
- ECS任务定义可提前从AWS控制台导出为JSON文件存入仓库,也可直接填写AWS端已有的任务定义名称,Action会自动拉取最新版本更新镜像
- 可在GitHub仓库的Settings->Environments中配置生产环境部署审核权限,避免误发布
- 镜像标签可按需调整,比如生产环境用发布的tag名称作为镜像标签,方便后续版本回滚
内容的提问来源于stack exchange,提问作者André Castro
相关产品推荐
相关产品推荐

