【问题标题】:Deploy using Semver for docker images hosted by AWS ECS使用 Semver 为 AWS ECS 托管的 docker 映像部署
【发布时间】:2021-12-11 11:09:05
【问题描述】:

我有一个 Azure DevOps 管道,它使用 SemVer 标签构建 docker 映像并将其推送到 AWS ECS 存储库。例如。 1.0.01.0.1

谁能告诉我如何在我的管道中自动化下一个阶段来部署刚刚构建的版本?例如该阶段应更新我的 ECS 任务定义以使用 image:1.0.1,然后更新我的服务以使用最新的任务定义。

我看到的所有文章都使用:latest,然后他们只是使用force-new-deployment。坦率地说,我认为这是一种愚蠢的做事方式。如果您的 PROD 容器在不是最新版本的情况下崩溃并且必须重新启动怎么办?它将使用最新版本启动 PROD,这将导致大问题。

我的完整方案是,我想要一个图像存储库,其中将包含我的图像的所有版本。 UAT 和 PROD 将从那里提取,具体取决于我要在构建管道中指定使用的版本。

假设我在 UAT 和 PROD 中使用 1.0.0。 我启动了一个多阶段构建管道,它将构建1.0.1 并将图像向上推送。我希望 UAT 任务定义现在自动更新为 1.0.1,然后进行新的部署。 PROD 仍然指向1.0.0。即使我停止它并重新启动它,它仍然应该指向1.0.0

现在,在 UAT 之后,作为我批准的一部分,我批准了我的 PROD 版本。这会更新 PROD 的任务定义以指向 1.0.1 并强制进行新部署....

也许我抓住了猫的尾巴,所以如果这太牵强,或者故事是什么,请告诉我。

感谢您的宝贵时间,

【问题讨论】:

    标签: docker azure-devops amazon-ecs


    【解决方案1】:

    此后我找到了更多关于这个主题的信息,并且通过从我的 CICD 管道中调用这个 bash 脚本取得了成功。

    #!/bin/bash
    
    # ORIGINALLY FROM: https://github.com/aws/aws-cli/issues/3064
    # IDEAS FROM FROM: https://www.mytechramblings.com/posts/create-an-ecs-cluster-and-deploy-apps-using-azure-devops/
    
    #Script to get current task definition, and based on that add new ecr image address to old template and remove attributes that are not needed, then we send new task definition, get new revision number from output and update service
    
    set -e # stop on any error
    ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
    echo "ECR_IMAGE: $ECR_IMAGE"
    
    TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "$AWS_DEFAULT_REGION")
    echo "TASK_DEFINITION: $TASK_DEFINITION"
    
    NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibilities) | del(.registeredAt) | del(.registeredBy)')
    echo "NEW_TASK_DEFINTIION: $NEW_TASK_DEFINTIION"
    
    NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
    echo "NEW_TASK_INFO: $NEW_TASK_INFO"
    
    NEW_REVISION=$(echo $NEW_TASK_INFO | jq '.taskDefinition.revision')
    echo "NEW_REVISION: $NEW_REVISION"
    
    aws ecs update-service --cluster ${ECS_CLUSTER} \
                           --service ${SERVICE_NAME} \
                           --task-definition ${TASK_FAMILY}:${NEW_REVISION}
    
    

    【讨论】:

      猜你喜欢
      • 2019-09-10
      • 2020-12-30
      • 2019-01-25
      • 2015-04-16
      • 2021-06-16
      • 2017-04-20
      • 2015-10-07
      • 2017-12-30
      • 2017-09-30
      相关资源
      最近更新 更多