Skip to content

v2.2.0-next.1

v2.2.0-next.1 #35

Workflow file for this run

name: 🚀 Deploy Workflow
on:
# This workflow runs for both releases and pre-releases
release: { types: [published] }
workflow_dispatch:
jobs:
deploy:
name: 🚀 Deploy to ECS
runs-on: ubuntu-latest
permissions:
contents: read # to checkout the code
id-token: write # to assume the OIDC role (configure-aws-credentials)
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- name: Configure AWS Credentials for ECR
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.ECR_OIDC_GITHUB_ROLE_ARN }}
aws-region: ${{ secrets.ECR_REPO_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: "true"
# Note: The above makes "outputs.registry" unavailable in any subsequent jobs.
- name: Build and Push Image+Tags
# IMAGE TAGS:
# 1. commit sha (always added)
# 2. release tag (if release/pre-release)
# 3. env tag (if release: "prod", anything else: "staging")
# 4. relative pointer (if release: "latest", anything else: "next")
run: |
image_tags=( "${{ github.sha }}" )
if [ "${{ github.event_name }}" == 'release' ]; then
image_tags+=( "${{ github.event.release.tag_name }}" )
fi
if [[ "${{ github.event_name }}" == 'release' && "${{ github.event.release.prerelease }}" == 'false' ]]; then
image_tags+=( prod latest )
else
image_tags+=( staging next )
fi
image_repo="${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_PRIVATE_REPO }}"
image_tags=("${image_tags[@]/#/$image_repo:}")
docker build ${image_tags[@]/#/--tag } .
for tag in "${image_tags[@]}"; do docker push "$tag"; done
- name: Configure AWS Credentials for ECS
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.ECS_OIDC_GITHUB_ROLE_ARN }}
aws-region: ${{ secrets.ECS_CLUSTER_REGION }}
- name: Update ECS Task Definition & Service
run: |
if [[ "${{ github.event_name }}" == 'release' && "${{ github.event.release.prerelease }}" == 'false' ]]; then
task_def_name=${{ secrets.ECS_API_TASK_DEF_PROD }}
service_name=${{ secrets.ECS_API_SERVICE_NAME_PROD }}
cluster_name=${{ secrets.ECS_CLUSTER_NAME_PROD }}
else
task_def_name=${{ secrets.ECS_API_TASK_DEF_STAGING }}
service_name=${{ secrets.ECS_API_SERVICE_NAME_STAGING }}
cluster_name=${{ secrets.ECS_CLUSTER_NAME_STAGING }}
fi
image_repo="${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_PRIVATE_REPO }}"
updated_task_def_json=$(
aws ecs describe-task-definition \
--task-definition $task_def_name \
--output json | \
jq --arg NEW_IMAGE "$image_repo:${{ github.sha }}" \
'.taskDefinition |
.containerDefinitions[0].image = $NEW_IMAGE |
del(.taskDefinitionArn) |
del(.revision) |
del(.status) |
del(.requiresAttributes) |
del(.compatibilities) |
del(.registeredAt) |
del(.registeredBy)'
)
aws ecs register-task-definition \
--cli-input-json "$updated_task_def_json" \
1>/dev/null
aws ecs update-service \
--cluster $cluster_name \
--service $service_name \
--task-definition $task_def_name \
--force-new-deployment \
1>/dev/null