@@ -0,0 +1,94 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ name: Promote to Production
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ on:
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ push:
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tags:
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - 'v*'
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ env:
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AWS_REGION: us-west-2
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ECR_REPO: fossilrepo
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ECS_CLUSTER: prd-fossilhub
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ECS_SERVICE: prd-fossilhub-app
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TASK_FAMILY: prd-fossilhub-app
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ jobs:
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ promote:
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ runs-on: ubuntu-latest
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ permissions:
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id-token: write
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contents: read
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ steps:
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - uses: aws-actions/configure-aws-credentials@v4
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with:
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aws-region: ${{ env.AWS_REGION }}
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - uses: aws-actions/amazon-ecr-login@v2
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id: ecr
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - name: Tag image as stable + version
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ env:
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ECR_REGISTRY: ${{ steps.ecr.outputs.registry }}
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VERSION_TAG: ${{ github.ref_name }}
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ run: |
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Pull the latest image (what dev is running)
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MANIFEST=$(aws ecr batch-get-image \
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --repository-name $ECR_REPO \
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --image-ids imageTag=latest \
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --query 'images[0].imageManifest' \
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --output text)
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Tag it with the version
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aws ecr put-image \
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --repository-name $ECR_REPO \
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --image-tag "$VERSION_TAG" \
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --image-manifest "$MANIFEST" || true
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Tag it as stable
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aws ecr put-image \
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --repository-name $ECR_REPO \
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --image-tag stable \
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --image-manifest "$MANIFEST" || true
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ echo "Promoted latest → $VERSION_TAG + stable"
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - name: Deploy to production ECS
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ env:
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ECR_REGISTRY: ${{ steps.ecr.outputs.registry }}
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VERSION_TAG: ${{ github.ref_name }}
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ run: |
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TASK_DEF=$(aws ecs describe-task-definition \
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --task-definition $TASK_FAMILY \
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --query 'taskDefinition' \
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --output json)
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ NEW_TASK_DEF=$(echo "$TASK_DEF" | jq \
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --arg IMAGE "$ECR_REGISTRY/$ECR_REPO:$VERSION_TAG" \
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ '.containerDefinitions[0].image = $IMAGE |
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ del(.taskDefinitionArn, .revision, .status,
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .requiresAttributes, .compatibilities,
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .registeredAt, .registeredBy, .deregisteredAt)')
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ NEW_TASK_ARN=$(aws ecs register-task-definition \
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --cli-input-json "$NEW_TASK_DEF" \
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --query 'taskDefinition.taskDefinitionArn' \
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --output text)
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aws ecs update-service \
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --cluster $ECS_CLUSTER \
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --service $ECS_SERVICE \
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --task-definition "$NEW_TASK_ARN" \
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --force-new-deployment
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ echo "Deployed $VERSION_TAG to production"
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - name: Wait for deployment to stabilize
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ run: |
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ echo "Waiting for production to reach steady state..."
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aws ecs wait services-stable \
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --cluster $ECS_CLUSTER \
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ --services $ECS_SERVICE
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ echo "Production deployment stable."