diff --git a/.github/workflows/deploy-to-prod.yml b/.github/workflows/deploy-to-prod.yml index 9b72863..269d82e 100644 --- a/.github/workflows/deploy-to-prod.yml +++ b/.github/workflows/deploy-to-prod.yml @@ -100,6 +100,16 @@ jobs: role-to-assume: ${{ env.AWS_IAM_ROLE_TO_ASSUME }} aws-region: ${{ env.AWS_REGION }} + - name: Backup Current Task Definition + run: | + echo "Backing up current task definition to task-def-backup.json" + aws ecs describe-task-definition --task-definition ${{ env.ECS_TASK_DEFINITION }} --query taskDefinition > task-def-backup.json + if [ ! -f task-def-backup.json ]; then + echo "::error::Failed to backup task definition." + exit 1 + fi + echo "Backup successful." + - name: Render New Task Definition with New Image id: task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 @@ -123,18 +133,24 @@ jobs: env: NEW_TASK_DEF_ARN: ${{ steps.deploy.outputs.task-definition-arn }} run: | - DEPLOYED_TASK_DEF_ARN=$(aws ecs describe-services \ - --cluster ${{ env.ECS_CLUSTER }} \ - --services ${{ env.ECS_SERVICE }} \ - --query "services[0].taskDefinition" \ + FINAL_TASK_DEF_ARN="${{ steps.deploy.outputs.task-definition-arn }}" + EXPECTED_IMAGE_TAG="${{ needs.build.outputs.image_tag }}" + + echo "Final stable Task Definition ARN: $FINAL_TASK_DEF_ARN" + echo "Expected image tag: $EXPECTED_IMAGE_TAG" + + # Describe the final task definition and get the actual image tag for the specified container + ACTUAL_IMAGE_TAG=$(aws ecs describe-task-definition --task-definition "$FINAL_TASK_DEF_ARN" \ + --query "taskDefinition.containerDefinitions[?name=='${{ env.CONTAINER_NAME }}'].image" \ --output text) - echo "New Task Definition ARN: $NEW_TASK_DEF_ARN" - echo "Currently Deployed Task Definition ARN: $DEPLOYED_TASK_DEF_ARN" + echo "Actual image tag in final task definition: $ACTUAL_IMAGE_TAG" - if [ "$NEW_TASK_DEF_ARN" != "$DEPLOYED_TASK_DEF_ARN" ]; then + if [ "$ACTUAL_IMAGE_TAG" != "$EXPECTED_IMAGE_TAG" ]; then + echo "::warning::Deployment failed or rolled back. The new image is not running." echo "rollback_occurred=true" >> $GITHUB_OUTPUT else + echo "Deployment successful. The new image is running." echo "rollback_occurred=false" >> $GITHUB_OUTPUT fi diff --git a/.github/workflows/deploy-to-stg.yml b/.github/workflows/deploy-to-stg.yml index 6df1c69..186e6dc 100644 --- a/.github/workflows/deploy-to-stg.yml +++ b/.github/workflows/deploy-to-stg.yml @@ -100,6 +100,16 @@ jobs: role-to-assume: ${{ env.AWS_IAM_ROLE_TO_ASSUME }} aws-region: ${{ env.AWS_REGION }} + - name: Backup Current Task Definition + run: | + echo "Backing up current task definition to task-def-backup.json" + aws ecs describe-task-definition --task-definition ${{ env.ECS_TASK_DEFINITION }} --query taskDefinition > task-def-backup.json + if [ ! -f task-def-backup.json ]; then + echo "::error::Failed to backup task definition." + exit 1 + fi + echo "Backup successful." + - name: Render New Task Definition with New Image id: task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 @@ -123,18 +133,24 @@ jobs: env: NEW_TASK_DEF_ARN: ${{ steps.deploy.outputs.task-definition-arn }} run: | - DEPLOYED_TASK_DEF_ARN=$(aws ecs describe-services \ - --cluster ${{ env.ECS_CLUSTER }} \ - --services ${{ env.ECS_SERVICE }} \ - --query "services[0].taskDefinition" \ + FINAL_TASK_DEF_ARN="${{ steps.deploy.outputs.task-definition-arn }}" + EXPECTED_IMAGE_TAG="${{ needs.build.outputs.image_tag }}" + + echo "Final stable Task Definition ARN: $FINAL_TASK_DEF_ARN" + echo "Expected image tag: $EXPECTED_IMAGE_TAG" + + # Describe the final task definition and get the actual image tag for the specified container + ACTUAL_IMAGE_TAG=$(aws ecs describe-task-definition --task-definition "$FINAL_TASK_DEF_ARN" \ + --query "taskDefinition.containerDefinitions[?name=='${{ env.CONTAINER_NAME }}'].image" \ --output text) - echo "New Task Definition ARN: $NEW_TASK_DEF_ARN" - echo "Currently Deployed Task Definition ARN: $DEPLOYED_TASK_DEF_ARN" + echo "Actual image tag in final task definition: $ACTUAL_IMAGE_TAG" - if [ "$NEW_TASK_DEF_ARN" != "$DEPLOYED_TASK_DEF_ARN" ]; then + if [ "$ACTUAL_IMAGE_TAG" != "$EXPECTED_IMAGE_TAG" ]; then + echo "::warning::Deployment failed or rolled back. The new image is not running." echo "rollback_occurred=true" >> $GITHUB_OUTPUT else + echo "Deployment successful. The new image is running." echo "rollback_occurred=false" >> $GITHUB_OUTPUT fi