25
25
- web
26
26
- good-job
27
27
default : all
28
+ git_sha_to_deploy :
29
+ description : The git commit SHA to deploy.
30
+ required : false
31
+ type : string
28
32
workflow_call :
29
33
inputs :
30
34
environment :
38
42
required : true
39
43
type : string
40
44
41
- permissions : {}
45
+ permissions : { }
42
46
43
47
concurrency :
44
- group : deploy-application -${{ inputs.environment }}
48
+ group : deploy-mavis -${{ inputs.environment }}
45
49
46
50
env :
47
51
aws-role : ${{ inputs.environment == 'production'
48
52
&& 'arn:aws:iam::820242920762:role/GithubDeployMavisAndInfrastructure'
49
53
|| '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 }}
50
60
51
61
jobs :
52
62
prepare-deployment :
@@ -58,111 +68,116 @@ jobs:
58
68
steps :
59
69
- name : Checkout code
60
70
uses : actions/checkout@v4
61
- with :
62
- ref : ${{ inputs.git_sha_to_deploy || github.sha }}
63
71
- name : Configure AWS Credentials
64
72
uses : aws-actions/configure-aws-credentials@v4
65
73
with :
66
74
role-to-assume : ${{ env.aws-role }}
67
75
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
75
104
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
88
115
uses : actions/upload-artifact@v4
89
116
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 }}
92
122
93
- create -web-deployment :
94
- name : Create web deployment
123
+ deploy -web :
124
+ name : Deploy web service
95
125
runs-on : ubuntu-latest
96
- needs : prepare-deployment
97
126
if : inputs.server_types == 'web' || inputs.server_types == 'all'
127
+ needs : prepare-deployment
128
+ environment : ${{ inputs.environment }}
98
129
permissions :
99
130
id-token : write
100
131
steps :
101
- - name : Download artifact
102
- uses : actions/download-artifact@v4
103
- with :
104
- name : DEPLOYMENT_ENVS-${{ inputs.environment }}
105
- path : ${{ runner.temp }}
106
132
- name : Configure AWS Credentials
107
133
uses : aws-actions/configure-aws-credentials@v4
108
134
with :
109
135
role-to-assume : ${{ env.aws-role }}
110
136
aws-region : eu-west-2
111
- - name : Trigger CodeDeploy deployment
137
+ - name : Checkout code
138
+ uses : actions/checkout@v4
139
+ - name : Create appspec.yml
112
140
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
121
152
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 }} "
124
155
echo "Deployment successful"
125
156
126
- create -good-job-deployment :
127
- name : Create good-job deployment
157
+ deploy -good-job :
158
+ name : Deploy good-job service
128
159
runs-on : ubuntu-latest
129
- needs : prepare-deployment
130
160
if : inputs.server_types == 'good-job' || inputs.server_types == 'all'
161
+ needs : prepare-deployment
162
+ environment : ${{ inputs.environment }}
131
163
permissions :
132
164
id-token : write
133
165
steps :
134
- - name : Download Artifact
135
- uses : actions/download-artifact@v4
136
- with :
137
- name : DEPLOYMENT_ENVS-${{ inputs.environment }}
138
- path : ${{ runner.temp }}
139
166
- name : Configure AWS Credentials
140
167
uses : aws-actions/configure-aws-credentials@v4
141
168
with :
142
169
role-to-assume : ${{ env.aws-role }}
143
170
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