Skip to content

Commit 801052c

Browse files
Replace deploy-application code
- Use new flow - Intermediary step for testing process
1 parent 5620df4 commit 801052c

File tree

8 files changed

+400
-400
lines changed

8 files changed

+400
-400
lines changed

.github/workflows/deploy-application.yml

Lines changed: 92 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ on:
2525
- web
2626
- good-job
2727
default: all
28+
git_sha_to_deploy:
29+
description: The git commit SHA to deploy.
30+
required: false
31+
type: string
2832
workflow_call:
2933
inputs:
3034
environment:
@@ -38,15 +42,21 @@ on:
3842
required: true
3943
type: string
4044

41-
permissions: {}
45+
permissions: { }
4246

4347
concurrency:
44-
group: deploy-application-${{ inputs.environment }}
48+
group: deploy-mavis-${{ inputs.environment }}
4549

4650
env:
4751
aws-role: ${{ inputs.environment == 'production'
4852
&& 'arn:aws:iam::820242920762:role/GithubDeployMavisAndInfrastructure'
4953
|| 'arn:aws:iam::393416225559:role/GithubDeployMavisAndInfrastructure' }}
54+
web_codedeploy_application: mavis-${{ inputs.environment }}
55+
web_codedeploy_group: blue-green-group-${{ inputs.environment }}
56+
web_task_definition: mavis-web-task-definition-${{ inputs.environment }}
57+
cluster_name: mavis-${{ inputs.environment }}
58+
good_job_service: mavis-${{ inputs.environment }}-good-job
59+
good_job_task_definition: mavis-good-job-task-definition-${{ inputs.environment }}
5060

5161
jobs:
5262
prepare-deployment:
@@ -58,111 +68,116 @@ jobs:
5868
steps:
5969
- name: Checkout code
6070
uses: actions/checkout@v4
61-
with:
62-
ref: ${{ inputs.git_sha_to_deploy || github.sha }}
6371
- name: Configure AWS Credentials
6472
uses: aws-actions/configure-aws-credentials@v4
6573
with:
6674
role-to-assume: ${{ env.aws-role }}
6775
aws-region: eu-west-2
68-
- name: Install terraform
69-
uses: hashicorp/setup-terraform@v3
70-
with:
71-
terraform_version: 1.11.4
72-
- name: Get terraform output
73-
id: terraform-output
74-
working-directory: terraform/app
76+
- name: Get image digest from ECR
77+
id: get-image-digest
78+
run: |
79+
# Get AWS account ID and construct repository URI
80+
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
81+
REPOSITORY_URI="${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-2.amazonaws.com/mavis"
82+
83+
# Get the image digest for the git SHA
84+
IMAGE_DIGEST=$(aws ecr describe-images \
85+
--repository-name mavis/webapp \
86+
--image-ids imageTag=${{ inputs.git_sha_to_deploy || github.sha }} \
87+
--query 'imageDetails[0].imageDigest' \
88+
--output text)
89+
90+
NEW_IMAGE_URI="${REPOSITORY_URI}@${IMAGE_DIGEST}"
91+
echo "new-image-uri=${NEW_IMAGE_URI}" >> $GITHUB_OUTPUT
92+
echo "New image URI: ${NEW_IMAGE_URI}"
93+
- name: Populate web task definition
94+
if: inputs.server_types == 'web' || inputs.server_types == 'all'
95+
id: render-web-task-definition
96+
run: |
97+
./script/populate_task_definition.sh ${{ inputs.environment }} web \
98+
-i "${{ steps.get-image-digest.outputs.new-image-uri }}" \
99+
-o web-task-definition.json
100+
cat web-task-definition.json
101+
- name: Populate good-job task definition
102+
if: inputs.server_types == 'good-job' || inputs.server_types == 'all'
103+
id: render-good-job-task-definition
75104
run: |
76-
set -e
77-
terraform init -backend-config=env/${{ inputs.environment }}-backend.hcl -reconfigure
78-
terraform output -json | jq -r '
79-
"s3_bucket=" + .s3_bucket.value,
80-
"s3_key=" + .s3_key.value,
81-
"application=" + .codedeploy_application_name.value,
82-
"application_group=" + .codedeploy_deployment_group_name.value,
83-
"cluster_name=" + .ecs_variables.value.cluster_name,
84-
"good_job_service=" + .ecs_variables.value.good_job.service_name,
85-
"good_job_task_definition=" + .ecs_variables.value.good_job.task_definition.arn
86-
' > ${{ runner.temp }}/DEPLOYMENT_ENVS
87-
- name: Upload Artifact
105+
./script/populate_task_definition.sh ${{ inputs.environment }} good-job \
106+
-i "${{ steps.get-image-digest.outputs.new-image-uri }}" \
107+
-o good-job-task-definition.json
108+
cat good-job-task-definition.json
109+
- name: Upload web task definition
110+
uses: aws-actions/amazon-ecs-deploy-task-definition@v2
111+
id: upload-web-task-definition
112+
with:
113+
task-definition: web-task-definition.json
114+
- name: Make artifact for good-job task definition
88115
uses: actions/upload-artifact@v4
89116
with:
90-
name: DEPLOYMENT_ENVS-${{ inputs.environment }}
91-
path: ${{ runner.temp }}/DEPLOYMENT_ENVS
117+
name: ${{ inputs.environment }}-good-job-task-definition
118+
path: good-job-task-definition.json
119+
outputs:
120+
new-image-uri: ${{ steps.get-image-digest.outputs.new-image-uri }}
121+
web-task-definition-arn: ${{ steps.upload-web-task-definition.outputs.task-definition-arn }}
92122

93-
create-web-deployment:
94-
name: Create web deployment
123+
deploy-web:
124+
name: Deploy web service
95125
runs-on: ubuntu-latest
96-
needs: prepare-deployment
97126
if: inputs.server_types == 'web' || inputs.server_types == 'all'
127+
needs: prepare-deployment
128+
environment: ${{ inputs.environment }}
98129
permissions:
99130
id-token: write
100131
steps:
101-
- name: Download artifact
102-
uses: actions/download-artifact@v4
103-
with:
104-
name: DEPLOYMENT_ENVS-${{ inputs.environment }}
105-
path: ${{ runner.temp }}
106132
- name: Configure AWS Credentials
107133
uses: aws-actions/configure-aws-credentials@v4
108134
with:
109135
role-to-assume: ${{ env.aws-role }}
110136
aws-region: eu-west-2
111-
- name: Trigger CodeDeploy deployment
137+
- name: Checkout code
138+
uses: actions/checkout@v4
139+
- name: Create appspec.yml
112140
run: |
113-
set -e
114-
source ${{ runner.temp }}/DEPLOYMENT_ENVS
115-
deployment_id=$(aws deploy create-deployment \
116-
--application-name "$application" --deployment-group-name "$application_group" \
117-
--s3-location bucket="$s3_bucket",key="$s3_key",bundleType=yaml | jq -r .deploymentId)
118-
echo "Deployment started: $deployment_id"
119-
echo "deployment_id=$deployment_id" >> $GITHUB_ENV
120-
- name: Wait up to 30 minutes for deployment to complete
141+
cp config/templates/appspec.yaml.tpl appspec.yaml
142+
sed -i 's|<TASK_DEFINITION_ARN>|${{ needs.prepare-deployment.outputs.web-task-definition-arn }}|g' appspec.yaml
143+
- name: Deploy web service with CodeDeploy
144+
id: deploy-web-service
145+
uses: aws-actions/amazon-ecs-deploy-task-definition@v2
146+
with:
147+
task-definition: ${{ steps.render-web-task-definition.outputs.task-definition }}
148+
codedeploy-appspec: appspec.yaml
149+
codedeploy-application: ${{ env.web_codedeploy_application }}
150+
codedeploy-deployment-group: ${{ env.web_codedeploy_group }}
151+
- name: Wait for deployment to complete
121152
run: |
122-
set -e
123-
aws deploy wait deployment-successful --deployment-id "$deployment_id"
153+
echo "Waiting for CodeDeploy deployment ${{ steps.deploy-web-service.outputs.codedeploy-deployment-id }} to complete..."
154+
aws deploy wait deployment-successful --deployment-id "${{ steps.deploy-web-service.outputs.codedeploy-deployment-id }}"
124155
echo "Deployment successful"
125156
126-
create-good-job-deployment:
127-
name: Create good-job deployment
157+
deploy-good-job:
158+
name: Deploy good-job service
128159
runs-on: ubuntu-latest
129-
needs: prepare-deployment
130160
if: inputs.server_types == 'good-job' || inputs.server_types == 'all'
161+
needs: prepare-deployment
162+
environment: ${{ inputs.environment }}
131163
permissions:
132164
id-token: write
133165
steps:
134-
- name: Download Artifact
135-
uses: actions/download-artifact@v4
136-
with:
137-
name: DEPLOYMENT_ENVS-${{ inputs.environment }}
138-
path: ${{ runner.temp }}
139166
- name: Configure AWS Credentials
140167
uses: aws-actions/configure-aws-credentials@v4
141168
with:
142169
role-to-assume: ${{ env.aws-role }}
143170
aws-region: eu-west-2
144-
- name: Trigger ECS Deployment
145-
run: |
146-
set -e
147-
source ${{ runner.temp }}/DEPLOYMENT_ENVS
148-
DEPLOYMENT_ID=$(aws ecs update-service --cluster $cluster_name --service $good_job_service \
149-
--task-definition $good_job_task_definition --force-new-deployment \
150-
--query 'service.deployments[?rolloutState==`IN_PROGRESS`].[id][0]' --output text)
151-
echo "Deployment started: $DEPLOYMENT_ID"
152-
echo "deployment_id=$DEPLOYMENT_ID" >> $GITHUB_ENV
153-
- name: Wait for deployment to complete
154-
run: |
155-
set -e
156-
source ${{ runner.temp }}/DEPLOYMENT_ENVS
157-
DEPLOYMENT_STATE=IN_PROGRESS
158-
while [ "$DEPLOYMENT_STATE" == "IN_PROGRESS" ]; do
159-
echo "Waiting for deployment to complete..."
160-
sleep 30
161-
DEPLOYMENT_STATE="$(aws ecs describe-services --cluster $cluster_name --services $good_job_service \
162-
--query "services[0].deployments[?id == \`$deployment_id\`].[rolloutState][0]" --output text)"
163-
done
164-
if [ "$DEPLOYMENT_STATE" != "COMPLETED" ]; then
165-
echo "Deployment failed with state: $DEPLOYMENT_STATE"
166-
exit 1
167-
fi
168-
echo "Deployment successful"
171+
- name: Download good-job task definition artifact
172+
uses: actions/download-artifact@v4
173+
with:
174+
name: ${{ inputs.environment }}-good-job-task-definition
175+
path: ${{ runner.temp }}
176+
- name: Deploy good-job service
177+
uses: aws-actions/amazon-ecs-deploy-task-definition@v2
178+
with:
179+
task-definition: ${{ runner.temp }}/good-job-task-definition.json
180+
cluster: ${{ env.cluster_name }}
181+
service: ${{ env.good_job_service }}
182+
force-new-deployment: true
183+
wait-for-service-stability: true

0 commit comments

Comments
 (0)