简体   繁体   English

Github 动作回滚策略

[英]Github Action Rollback Strategy

I am trying to create a rollback strategy for ecs task that managed with github action.我正在尝试为使用 github 操作管理的 ecs 任务创建回滚策略。 What i am trying to do is:我想做的是:

  • if previous task definition's image is not found on ecr, set revision number-=1 and check one more previous task definition image, until it is found a valid image (imagetag actually but it doesnt matter.)如果在 ecr 上没有找到以前的任务定义的图像,设置修订号-=1 并检查另一个以前的任务定义图像,直到找到一个有效的图像(实际上是 imagetag 但无关紧要。)

  • If previous task definition revision number is not found check previous (previous revision number -1 like above) revision until found a valid one.如果未找到先前的任务定义修订号,请检查先前的(先前的修订号 -1,如上)修订,直到找到有效的修订。

According to that target: when id:tag-checker step is hit on else block i need to repeat all the step below from id:previous-revision-image-tag until my if else blocks pass with true fields.根据该目标:当id:tag-checker步骤在 else 块上命中时,我需要从id:previous-revision-image-tag重复下面的所有步骤,直到我的 if else 块通过 true 字段。

So how can i achieve this purpose with github action?那么我怎样才能通过 github 行动达到这个目的呢?

Basically i want to repeat all the steps and below steps from a step that i pick.基本上我想从我选择的步骤中重复所有步骤和以下步骤。

    name: AWS Rollback
    on:
      workflow_dispatch:
    env:
      AWS_REGION: "region"
      ECR_REPOSITORY: "nodejs-1"
      ECS_SERVICE: "nodejs-service"
      ECS_CLUSTER: "test-1"
      ECS_TASK_DEFINITION: ".aws/staging.paris.json"
      CONTAINER_NAME: "nodejs-test"
      
    
    jobs:
      Rollback:
        name: "Rollback"
        runs-on: ubuntu-latest
        environment: production
        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: ${{ env.AWS_REGION }}
            
          - name: Login to Amazon ECR
            id: login-ecr
            uses: aws-actions/amazon-ecr-login@v1
            
          - name: Set Current Task Revision
            id: current-revision
            env:
              ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
              IMAGE_TAG: ${{ steps.date.outputs.date }}-${{ steps.vars.outputs.sha_short }}
            run: |
              echo "REVISION_NUMBER=$(aws ecs describe-services --cluster ${{ env.ECS_CLUSTER }} --query "services[].taskDefinition" --services ${{ env.ECS_SERVICE }} --output text | cut -d: -f7)" >> $GITHUB_ENV
              echo "REVISION_NAME=$(aws ecs describe-services --cluster ${{ env.ECS_CLUSTER }} --query "services[].taskDefinition" --services ${{ env.ECS_SERVICE }} --output text | cut -d: -f1-6)" >> $GITHUB_ENV
    
          - name: Set Previous Task Revision Number
            id: previous-revision-number
            run: |
              echo "PREVIOUS_REVISION_NUMBER"=$((${{ env.REVISION_NUMBER }}-1)) >> $GITHUB_ENV
    
          - name: Set Previous Task Revision Image Tag
            id: previous-revision-image-tag
            env:
              PREVIOUS_REVISION_NUMBER: ${{ env.PREVIOUS_REVISION_NUMBER }}
            run: |
              echo "IMAGE_TAG"=$(aws ecs describe-task-definition --task-definition "${{ env.ECR_REPOSITORY }}:$PREVIOUS_REVISION_NUMBER" --query "taskDefinition.containerDefinitions[0].image" --output text |cut -d: -f2) >> $GITHUB_ENV
    
          - name: Check if previous revision image is exist or not
            id: tag-checker
            env:
              IMAGE_TAG: ${{ env.IMAGE_TAG }}
            run: |
              if (aws ecr describe-images --repository-name=${{ env.ECR_REPOSITORY }} --image-ids=imageTag=$IMAGE_TAG &> /dev/null); then
                echo "Image Found"
              else
                echo 'Image is Not Found'
              fi
              
          - name: Check if previous task revision exist or not
            id: revision-checker
            env:
              PREVIOUS_REVISION_NUMBER: ${{ env.PREVIOUS_REVISION_NUMBER }}
            run: |
              if (aws ecs describe-task-definition --task-definition "${{ env.ECR_REPOSITORY }}:$PREVIOUS_REVISION_NUMBER" --output text &> /dev/null); then
                echo "Task definition Found"
              else
                echo 'Task definition not Found'
              fi
    
          # - name: Rollback to previous version
          #   id: rollback
          #   run: |
          #     aws ecs update-service --cluster ${{ env.ECS_CLUSTER }} --service ${{ env.ECS_SERVICE }} --task-definition ${{ env.REVISION_NAME }}:${{ env.PREVIOUS_REVISION_NUMBER }}

I have a solution for you without updating revision and task.我有一个解决方案,无需更新修订和任务。

Lets think you have a ecr repo with tags假设您有一个带标签的 ecr 回购协议

  • latest最新的
  • v1.0.2 v1.0.2
  • v1.0.1 v1.0.1
  • v1.0.0 v1.0.0

latest point to your latest version ( v1.0.2 ) latest指向你的最新版本( v1.0.2

You need to update your ecs task definition you use latest version always.您需要更新您始终使用latest版本的 ecs 任务定义。

When you want to rollback.当你想回滚时。 You can do a hack on ECR point latest version to v1.0.1 then just invoke ecs to force re-deploy services.您可以对 ECR 点latest版本进行 hack 到v1.0.1 ,然后调用 ecs 强制重新部署服务。

IMAGE_TAG_YOU_WANT_TO_DEPLOY="v1.0.1"
# fetch v1.0.1 manifest
MANIFEST=$(aws ecr batch-get-image --repository-name ${ECR_REPOSITORY} --image-ids imageTag=${IMAGE_TAG_YOU_WANT_TO_DEPLOY} --output json | jq --raw-output --join-output '.images[0].imageManifest')
# move latest tag pointer to v1.0.1
aws ecr put-image --repository-name ${ECR_REPOSITORY} --image-tag latest --image-manifest "$MANIFEST"


aws ecs update-service --cluster ${ECS_CLUSTER} --service ${ECS_SERVICE}  --force-new-deployment --region us-east-2

For new deployment you will create a image tag ( v1.0.3 and latest ) together and push both images to ECR.对于新部署,您将一起创建一个图像标签( v1.0.3latest )并将两个图像推送到 ECR。 then just invoke update-service only.然后只调用更新服务。 (new latest is v1.0.3) (最新的是v1.0.3)

aws ecs update-service --cluster ${ECS_CLUSTER} --service ${ECS_SERVICE}  --force-new-deployment --region us-east-2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM