[英]Github Action Rollback Strategy
我正在嘗試為使用 github 操作管理的 ecs 任務創建回滾策略。 我想做的是:
如果在 ecr 上沒有找到以前的任務定義的圖像,設置修訂號-=1 並檢查另一個以前的任務定義圖像,直到找到一個有效的圖像(實際上是 imagetag 但無關緊要。)
如果未找到先前的任務定義修訂號,請檢查先前的(先前的修訂號 -1,如上)修訂,直到找到有效的修訂。
根據該目標:當id:tag-checker步驟在 else 塊上命中時,我需要從id:previous-revision-image-tag重復下面的所有步驟,直到我的 if else 塊通過 true 字段。
那么我怎樣才能通過 github 行動達到這個目的呢?
基本上我想從我選擇的步驟中重復所有步驟和以下步驟。
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 }}
我有一個解決方案,無需更新修訂和任務。
假設您有一個帶標簽的 ecr 回購協議
latest
指向你的最新版本( v1.0.2
)
您需要更新您始終使用latest
版本的 ecs 任務定義。
當你想回滾時。 您可以對 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
對於新部署,您將一起創建一個圖像標簽( v1.0.3
和latest
)並將兩個圖像推送到 ECR。 然后只調用更新服務。 (最新的是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.