Skip to content

AWS Deployment

AWS Deployment #119

Workflow file for this run

# AWS ECS Deployment Workflow
name: AWS Deployment
on:
workflow_run:
workflows: ["Continuous Integration"]
branches: [master]
types:
- completed
env:
AWS_REGION: us-east-1
ECS_SERVICE: barrett-fogle-love-v1
ECS_CLUSTER: tcf-fargate-cluster
ECR_REPO: tcf/thecourseforum2
ECR_CONTAINER_NAME: tcf-container
jobs:
deploy:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
steps:
- name: Checkout master
uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_sha }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
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
uses: aws-actions/amazon-ecr-login@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPO }}:${{ github.sha }}
cache-from: type=registry,ref=${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPO }}:buildcache
cache-to: type=registry,ref=${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPO }}:buildcache,mode=max
provenance: false
- name: Get current task definition
run: |
aws ecs describe-task-definition \
--task-definition tcf-prod-task \
--query taskDefinition > task-definition.json
- name: Update task definition with new image
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: task-definition.json
container-name: ${{ env.ECR_CONTAINER_NAME }}
image: ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPO }}:${{ github.sha }}
- name: Run Release Tasks (Migrate, Static, Cache)
run: |
NETWORK_CONFIG=$(aws ecs describe-services --cluster ${{ env.ECS_CLUSTER }} --services ${{ env.ECS_SERVICE }} | jq -c '.services[0].networkConfiguration')
TASK_DEF_ARN=$(aws ecs register-task-definition --cli-input-json file://${{ steps.task-def.outputs.task-definition }} | jq -r '.taskDefinition.taskDefinitionArn')
RELEASE_COMMAND="python manage.py migrate && python manage.py collectstatic --noinput && python manage.py invalidate_cachalot tcf_website && python manage.py clearsessions"
TASK_ARN=$(aws ecs run-task \
--cluster ${{ env.ECS_CLUSTER }} \
--task-definition $TASK_DEF_ARN \
--launch-type FARGATE \
--network-configuration "$NETWORK_CONFIG" \
--overrides "{\"containerOverrides\": [{\"name\": \"${{ env.ECR_CONTAINER_NAME }}\", \"command\": [\"bash\", \"-c\", \"$RELEASE_COMMAND\"]}]}" \
| jq -r '.tasks[0].taskArn')
echo "Waiting for Release Task ($TASK_ARN) to complete..."
aws ecs wait tasks-stopped --cluster ${{ env.ECS_CLUSTER }} --tasks $TASK_ARN
EXIT_CODE=$(aws ecs describe-tasks --cluster ${{ env.ECS_CLUSTER }} --tasks $TASK_ARN | jq -r '.tasks[0].containers[0].exitCode')
if [ "$EXIT_CODE" != "0" ]; then
echo "Release task failed! Halting deployment."
exit 1
fi
- name: Deploy to Amazon ECS
uses: aws-actions/amazon-ecs-deploy-task-definition@v2
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true