1
+ # Create a unified Build and Deploy pipeline that uses approval gates
2
+ # Build Model –> Deploy to staging with approval –> Deploy to prod with approval.
3
+ # https://timheuer.com/blog/add-approval-workflow-to-github-actions/
4
+
5
+ name : Build and Batch Pipeline
6
+
7
+ on : [push, pull_request] # Optionally filter on branch
8
+
9
+ jobs :
10
+ build :
11
+ name : Build Model
12
+ runs-on : ubuntu-latest
13
+ environment :
14
+ name : development
15
+ defaults :
16
+ run :
17
+ shell : bash
18
+ working-directory : ./build_pipeline
19
+ steps :
20
+ - name : Checkout
21
+ uses : actions/checkout@v2
22
+
23
+ - name : Config Environment
24
+ id : env-name
25
+ env :
26
+ PROJECT_NAME : ${{ github.event.repository.name }}
27
+ run : |
28
+ echo "Project name: $PROJECT_NAME"
29
+ echo "::set-output name=project_name::$PROJECT_NAME"
30
+
31
+ - name : Setup Python
32
+ uses : actions/setup-python@v2
33
+ with :
34
+ python-version : " 3.8"
35
+ architecture : " x64"
36
+
37
+ - name : Setup Node
38
+ uses : actions/setup-node@v2
39
+ with :
40
+ node-version : " 12"
41
+ architecture : " x64"
42
+ cache : npm
43
+
44
+ - name : Install Requirements
45
+ run : |
46
+ npm install -g aws-cdk # Install cdk
47
+ pip install --requirement requirements.txt
48
+
49
+ - name : Configure AWS Credentials
50
+ id : creds
51
+ uses : aws-actions/configure-aws-credentials@v1
52
+ with :
53
+ aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
54
+ aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
55
+ aws-region : ${{ secrets.AWS_REGION }}
56
+ role-to-assume : ${{ secrets.AWS_SAGEMAKER_ROLE }}
57
+ role-duration-seconds : 1200
58
+
59
+ - name : Build Pipeline
60
+ id : build-pipeline
61
+ env :
62
+ SAGEMAKER_PROJECT_NAME : ${{ steps.env-name.outputs.project_name }}
63
+ SAGEMAKER_PIPELINE_NAME : ${{ steps.env-name.outputs.project_name }}-pipeline
64
+ SAGEMAKER_PIPELINE_DESCRIPTION : " SageMaker pipeline created from GitHub actions"
65
+ SAGEMAKER_PIPELINE_ROLE_ARN : ${{ secrets.AWS_SAGEMAKER_ROLE }}
66
+ AWS_REGION : ${{ secrets.AWS_REGION }}
67
+ run : |
68
+ export SAGEMAKER_PROJECT_ID=`aws sagemaker describe-project --project-name $SAGEMAKER_PROJECT_NAME --query ProjectId --output text`
69
+ echo "Project id: $SAGEMAKER_PROJECT_ID"
70
+ export ARTIFACT_BUCKET=sagemaker-project-$SAGEMAKER_PROJECT_ID-$AWS_REGION
71
+ echo "Artifact Bucket: $ARTIFACT_BUCKET"
72
+ npx cdk synth --path-metadata false --asset-metadata=false > drift-pipeline.yml
73
+ echo "::set-output name=pipeline_name::$SAGEMAKER_PIPELINE_NAME"
74
+
75
+ - name : Print template
76
+ run : cat drift-pipeline.yml
77
+
78
+ - name : Create CFN Pipeline
79
+ id : deploy-pipeline
80
+ uses : aws-actions/aws-cloudformation-github-deploy@v1
81
+ with :
82
+ name : sagemaker-${{ steps.build-pipeline.outputs.pipeline_name }}
83
+ template : ./build_pipeline/drift-pipeline.yml # Need to specify working-directory
84
+ no-fail-on-empty-changeset : " 1"
85
+
86
+ - name : Start Pipeline
87
+ id : start-pipeline # TODO: Run python code that waits for pipeline to complete
88
+ run : aws sagemaker start-pipeline-execution --pipeline-name ${{ steps.build-pipeline.outputs.pipeline_name }} --pipeline-parameters Name=InputSource,Value=GitHubAction#${{ github.run_number }}
89
+
90
+ - name : Upload template
91
+ uses : actions/upload-artifact@v2
92
+ with :
93
+ name : drift-pipeline
94
+ path : ./build_pipeline/drift-pipeline.yml
95
+
96
+ deploy_staging :
97
+ needs : build
98
+ name : Deploy to staging
99
+ runs-on : ubuntu-latest
100
+ environment :
101
+ name : staging # Use different environment that optionally requires approval
102
+ defaults :
103
+ run :
104
+ shell : bash
105
+ working-directory : ./batch_pipeline
106
+ steps :
107
+ - name : Checkout
108
+ uses : actions/checkout@v2
109
+
110
+ - name : Config Environment
111
+ id : env-name
112
+ env :
113
+ PROJECT_NAME : ${{ github.event.repository.name }}
114
+ run : |
115
+ echo "Project name: $PROJECT_NAME"
116
+ echo "::set-output name=project_name::$PROJECT_NAME"
117
+
118
+ - name : Setup Python
119
+ uses : actions/setup-python@v2
120
+ with :
121
+ python-version : " 3.8"
122
+ architecture : " x64"
123
+
124
+ - name : Setup Node
125
+ uses : actions/setup-node@v2
126
+ with :
127
+ node-version : " 12"
128
+ architecture : " x64"
129
+ cache : npm
130
+
131
+ - name : Install Requirements
132
+ run : |
133
+ npm install -g aws-cdk # Install cdk
134
+ pip install --requirement requirements.txt
135
+
136
+ - name : Configure AWS Credentials
137
+ id : creds
138
+ uses : aws-actions/configure-aws-credentials@v1
139
+ with :
140
+ aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
141
+ aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
142
+ aws-region : ${{ secrets.AWS_REGION }}
143
+ role-to-assume : ${{ secrets.AWS_SAGEMAKER_ROLE }}
144
+ role-duration-seconds : 1200
145
+
146
+ - name : Build Templates
147
+ id : build-templates
148
+ env :
149
+ SAGEMAKER_PROJECT_NAME : ${{ steps.env-name.outputs.project_name }}
150
+ SAGEMAKER_EXECUTION_ROLE_ARN : ${{ secrets.AWS_SAGEMAKER_ROLE }}
151
+ AWS_REGION : ${{ secrets.AWS_REGION }}
152
+ run : |
153
+ export SAGEMAKER_PROJECT_ID=`aws sagemaker describe-project --project-name $SAGEMAKER_PROJECT_NAME --query ProjectId --output text`
154
+ echo "Project id: $SAGEMAKER_PROJECT_ID"
155
+ export ARTIFACT_BUCKET=sagemaker-project-$SAGEMAKER_PROJECT_ID-$AWS_REGION
156
+ echo "Artifact Bucket: $ARTIFACT_BUCKET"
157
+ npx cdk synth drift-batch-staging --path-metadata false --asset-metadata=false > drift-batch-staging.yml
158
+
159
+ - name : Print template
160
+ run : cat drift-batch-staging.yml
161
+
162
+ - name : Deploy Staging
163
+ id : deploy-pipeline
164
+ uses : aws-actions/aws-cloudformation-github-deploy@v1
165
+ with :
166
+ name : sagemaker-${{ steps.env-name.outputs.project_name }}-deploy-staging
167
+ template : ./batch_pipeline/drift-batch-staging.yml # Need to specify working-directory
168
+ no-fail-on-empty-changeset : " 1"
169
+
170
+ - name : Upload template
171
+ uses : actions/upload-artifact@v2
172
+ with :
173
+ name : drift-batch-staging
174
+ path : ./batch_pipeline/drift-batch-staging.yml
175
+
176
+ deploy_prod :
177
+ needs : deploy_staging
178
+ name : Deploy to prod
179
+ if : ${{ github.ref == 'refs/heads/main' }} # Filter to only run on main branch
180
+ runs-on : ubuntu-latest
181
+ environment :
182
+ name : prod # Use different environment that requires approval
183
+ defaults :
184
+ run :
185
+ shell : bash
186
+ working-directory : ./batch_pipeline
187
+ steps :
188
+ - name : Checkout
189
+ uses : actions/checkout@v2
190
+
191
+ - name : Config Environment
192
+ id : env-name
193
+ env :
194
+ PROJECT_NAME : ${{ github.event.repository.name }}
195
+ run : |
196
+ echo "Project name: $PROJECT_NAME"
197
+ echo "::set-output name=project_name::$PROJECT_NAME"
198
+
199
+ - name : Setup Python
200
+ uses : actions/setup-python@v2
201
+ with :
202
+ python-version : " 3.8"
203
+ architecture : " x64"
204
+
205
+ - name : Setup Node
206
+ uses : actions/setup-node@v2
207
+ with :
208
+ node-version : " 12"
209
+ architecture : " x64"
210
+ cache : npm
211
+
212
+ - name : Install Requirements
213
+ run : |
214
+ npm install -g aws-cdk # Install cdk
215
+ pip install --requirement requirements.txt
216
+
217
+ - name : Configure AWS Credentials
218
+ id : creds
219
+ uses : aws-actions/configure-aws-credentials@v1
220
+ with :
221
+ aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
222
+ aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
223
+ aws-region : ${{ secrets.AWS_REGION }}
224
+ role-to-assume : ${{ secrets.AWS_SAGEMAKER_ROLE }}
225
+ role-duration-seconds : 1200
226
+
227
+ - name : Build Templates
228
+ id : build-templates
229
+ env :
230
+ SAGEMAKER_PROJECT_NAME : ${{ steps.env-name.outputs.project_name }}
231
+ SAGEMAKER_EXECUTION_ROLE_ARN : ${{ secrets.AWS_SAGEMAKER_ROLE }}
232
+ AWS_REGION : ${{ secrets.AWS_REGION }}
233
+ run : |
234
+ export SAGEMAKER_PROJECT_ID=`aws sagemaker describe-project --project-name $SAGEMAKER_PROJECT_NAME --query ProjectId --output text`
235
+ echo "Project id: $SAGEMAKER_PROJECT_ID"
236
+ export ARTIFACT_BUCKET=sagemaker-project-$SAGEMAKER_PROJECT_ID-$AWS_REGION
237
+ echo "Artifact Bucket: $ARTIFACT_BUCKET"
238
+ npx cdk synth drift-batch-prod --path-metadata false --asset-metadata=false > drift-batch-prod.yml
239
+
240
+ - name : Print Template
241
+ run : cat drift-batch-prod.yml
242
+
243
+ - name : Deploy Prod
244
+ id : deploy-pipeline
245
+ uses : aws-actions/aws-cloudformation-github-deploy@v1
246
+ with :
247
+ name : sagemaker-${{ steps.env-name.outputs.project_name }}-deploy-prod
248
+ template : ./batch_pipeline/drift-batch-prod.yml # Need to specify working-directory
249
+ no-fail-on-empty-changeset : " 1"
250
+
251
+ - name : Upload template
252
+ uses : actions/upload-artifact@v2
253
+ with :
254
+ name : drift-batch-prod
255
+ path : ./batch_pipeline/drift-batch-prod.yml
0 commit comments