20
20
PR_NUMBER : ${{ github.event.pull_request.number || github.event.issue.number }}
21
21
22
22
jobs :
23
- debug-trigger :
24
- if : always()
25
- runs-on : ubuntu-latest
26
- steps :
27
- - name : Debug Trigger Conditions
28
- env :
29
- EVENT_NAME : ${{ github.event_name }}
30
- IS_PR : ${{ toJSON(github.event.issue.pull_request) }}
31
- COMMENT : ${{ github.event.comment.body }}
32
- run : |
33
- echo "Debug information for deploy command:"
34
- echo "Event name: $EVENT_NAME"
35
- echo "Is PR (raw): $IS_PR"
36
- echo "Comment body: $COMMENT"
37
- echo "Raw event payload:"
38
- echo '${{ toJSON(github.event) }}'
39
-
40
23
Process-Deployment-Command :
41
- needs : debug-trigger
42
24
if : |
43
25
(github.event_name == 'pull_request') ||
44
26
(github.event_name == 'issue_comment' &&
@@ -52,21 +34,17 @@ jobs:
52
34
issues : write
53
35
54
36
steps :
37
+ - uses : actions/checkout@v4
38
+
55
39
- name : Get PR HEAD Ref
56
40
if : github.event_name == 'issue_comment'
57
41
id : getRef
58
42
run : |
59
- # For PR comments, get the actual PR head commit
60
- PR_DATA=$(gh pr view $PR_NUMBER --repo ${{ github.repository }} --json headRefName,headRefOid)
61
- echo "PR_REF=$(echo "$PR_DATA" | jq -r '.headRefName')" >> $GITHUB_OUTPUT
62
- echo "PR_SHA=$(echo "$PR_DATA" | jq -r '.headRefOid')" >> $GITHUB_OUTPUT
63
- env :
64
- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
65
-
66
- - uses : actions/checkout@v4
67
- with :
68
- fetch-depth : 0
69
- ref : ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || steps.getRef.outputs.PR_REF || github.ref }}
43
+ PR_URL=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
44
+ -H "Accept: application/vnd.github.v3+json" \
45
+ "${{ github.event.issue.pull_request.url }}")
46
+ HEAD_REF=$(echo "$PR_URL" | jq -r .head.ref)
47
+ echo "ref=$HEAD_REF" >> "$GITHUB_OUTPUT"
70
48
71
49
- name : Validate Required Secrets
72
50
run : |
@@ -85,278 +63,74 @@ jobs:
85
63
- name : Setup Environment
86
64
uses : ./.github/actions/setup-environment
87
65
88
- - name : Set shared functions
89
- id : shared-functions
90
- uses : actions/github-script@v7
91
- with :
92
- script : |
93
- core.exportVariable('GET_CONSOLE_LINK', `
94
- function getConsoleLink(prNumber) {
95
- return ' [Control Plane Console for Review App with PR #' + prNumber + '](' +
96
- 'https://console.cpln.io/org/' + process.env.CPLN_ORG + '/workloads/' + process.env.APP_NAME + ')';
97
- }
98
- `);
99
-
100
- - name : Initialize Deployment
101
- id : init-deployment
66
+ - name : Create Initial Status Comment
67
+ id : init-status
102
68
uses : actions/github-script@v7
103
69
with :
104
70
script : |
105
- eval(process.env.GET_CONSOLE_LINK);
106
-
107
- async function getWorkflowUrl(runId) {
108
- // Get the current job ID
109
- const jobs = await github.rest.actions.listJobsForWorkflowRun({
110
- owner: context.repo.owner,
111
- repo: context.repo.repo,
112
- run_id: runId
113
- });
114
-
115
- const currentJob = jobs.data.jobs.find(job => job.status === 'in_progress');
116
- const jobId = currentJob?.id;
117
-
118
- if (!jobId) {
119
- console.log('Warning: Could not find current job ID');
120
- return `${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
121
- }
122
-
123
- return `${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}/job/${jobId}`;
124
- }
125
-
126
- // Create initial deployment comment
127
71
const comment = await github.rest.issues.createComment({
128
- owner: context.repo.owner,
129
- repo: context.repo.repo,
130
72
issue_number: process.env.PR_NUMBER,
131
- body: ' Initializing deployment...'
132
- });
133
-
134
- // Create GitHub deployment
135
- const deployment = await github.rest.repos.createDeployment({
136
73
owner: context.repo.owner,
137
74
repo: context.repo.repo,
138
- ref: context.sha,
139
- environment: 'review',
140
- auto_merge: false,
141
- required_contexts: []
75
+ body: '🚀 Starting deployment...'
142
76
});
143
-
144
- const workflowUrl = await getWorkflowUrl(context.runId);
145
-
146
- return {
147
- deploymentId: deployment.data.id,
148
- commentId: comment.data.id,
149
- workflowUrl
150
- };
151
-
152
- - name : Set comment ID and workflow URL
153
- run : |
154
- echo "COMMENT_ID=${{ fromJSON(steps.init-deployment.outputs.result).commentId }}" >> $GITHUB_ENV
155
- echo "WORKFLOW_URL=${{ fromJSON(steps.init-deployment.outputs.result).workflowUrl }}" >> $GITHUB_ENV
156
-
157
- - name : Set commit hash
158
- run : |
159
- FULL_COMMIT="${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || steps.getRef.outputs.PR_SHA || github.sha }}"
160
- echo "COMMIT_HASH=${FULL_COMMIT:0:7}" >> $GITHUB_ENV
77
+ return { commentId: comment.data.id };
161
78
162
79
- name : Update Status - Building
163
80
uses : actions/github-script@v7
164
81
with :
165
82
script : |
166
83
eval(process.env.GET_CONSOLE_LINK);
167
-
168
- const buildingMessage = [
169
- ' Building Docker image for PR #' + process.env.PR_NUMBER + ', commit ' + '${{ env.COMMIT_HASH }}',
170
- '',
171
- ' [View Build Logs](' + process.env.WORKFLOW_URL + ')',
172
- '',
173
- getConsoleLink(process.env.PR_NUMBER)
174
- ].join('\n');
175
-
176
- await github.rest.issues.updateComment({
177
- owner: context.repo.owner,
178
- repo: context.repo.repo,
179
- comment_id: process.env.COMMENT_ID,
180
- body: buildingMessage
181
- });
182
-
183
- - name : Build Docker Image
184
- uses : ./.github/actions/build-docker-image
185
- with :
186
- app_name : ${{ env.APP_NAME }}
187
- org : ${{ env.CPLN_ORG }}
188
- commit : ${{ env.COMMIT_HASH }}
189
- PR_NUMBER : ${{ env.PR_NUMBER }}
190
-
191
- - name : Update Status - Deploying
192
- uses : actions/github-script@v7
193
- with :
194
- script : |
195
- eval(process.env.GET_CONSOLE_LINK);
196
-
197
- const deployingMessage = [
198
- ' Deploying to Control Plane...',
199
- '',
200
- ' Waiting for deployment to be ready...',
201
- '',
202
- ' [View Deploy Logs](' + process.env.WORKFLOW_URL + ')',
203
- '',
204
- getConsoleLink(process.env.PR_NUMBER)
205
- ].join('\n');
206
84
207
85
await github.rest.issues.updateComment({
208
86
owner: context.repo.owner,
209
87
repo: context.repo.repo,
210
- comment_id: process.env.COMMENT_ID,
211
- body: deployingMessage
88
+ comment_id: ${{ fromJSON(steps.init-status.outputs.result).commentId }},
89
+ body: [
90
+ '🏗️ Building review app...',
91
+ '',
92
+ getConsoleLink(process.env.PR_NUMBER)
93
+ ].join('\n')
212
94
});
213
95
214
- - name : Deploy to Control Plane
96
+ - name : Deploy Review App
97
+ id : deploy
215
98
uses : ./.github/actions/deploy-to-control-plane
216
99
with :
217
100
app_name : ${{ env.APP_NAME }}
218
101
org : ${{ env.CPLN_ORG }}
102
+ wait_timeout : 900
219
103
github_token : ${{ secrets.GITHUB_TOKEN }}
220
- wait_timeout : ${{ vars.WAIT_TIMEOUT || 900 }}
104
+ env :
105
+ CPLN_TOKEN : ${{ secrets.CPLN_TOKEN }}
221
106
222
- - name : Update Status - Deployment Complete
107
+ - name : Update Status - Complete
108
+ if : always()
223
109
uses : actions/github-script@v7
224
110
with :
225
111
script : |
226
112
eval(process.env.GET_CONSOLE_LINK);
227
-
228
- const prNumber = process.env.PR_NUMBER;
229
- const appUrl = process.env.REVIEW_APP_URL;
230
- const workflowUrl = process.env.WORKFLOW_URL;
231
- const isSuccess = '${{ job.status }}' === 'success';
232
-
233
- // Create GitHub deployment status
234
- const deploymentStatus = {
235
- owner: context.repo.owner,
236
- repo: context.repo.repo,
237
- deployment_id: ${{ fromJSON(steps.init-deployment.outputs.result).deploymentId }},
238
- state: isSuccess ? 'success' : 'failure',
239
- environment_url: isSuccess ? appUrl : undefined,
240
- log_url: workflowUrl,
241
- environment: 'review'
242
- };
243
113
244
- await github.rest.repos.createDeploymentStatus(deploymentStatus);
114
+ const isSuccess = '${{ job.status }}' === 'success';
115
+ const railsUrl = '${{ steps.deploy.outputs.rails_url }}';
245
116
246
- // Define messages based on deployment status
247
117
const successMessage = [
248
- ' Deployment complete for PR #' + prNumber + ', commit ' + '${{ env.COMMIT_HASH }}',
249
- '',
250
- ' [Review App for PR #' + prNumber + '](' + appUrl + ')',
118
+ '✅ Review app deployed successfully!',
251
119
'',
252
- ' [View Completed Action Build and Deploy Logs ](' + workflowUrl + ')',
120
+ '🌐 [Rails App ](' + railsUrl + ')',
253
121
'',
254
- getConsoleLink(prNumber )
122
+ getConsoleLink(process.env.PR_NUMBER )
255
123
].join('\n');
256
124
257
125
const failureMessage = [
258
- ' Deployment failed for PR #' + prNumber + ', commit ' + '${{ env.COMMIT_HASH }}',
259
- '',
260
- ' [View Deployment Logs with Errors](' + workflowUrl + ')',
126
+ '❌ Review app deployment failed',
261
127
'',
262
- getConsoleLink(prNumber )
128
+ getConsoleLink(process.env.PR_NUMBER )
263
129
].join('\n');
264
130
265
- // Update the existing comment
266
131
await github.rest.issues.updateComment({
267
132
owner: context.repo.owner,
268
133
repo: context.repo.repo,
269
- comment_id: process.env.COMMENT_ID ,
134
+ comment_id: ${{ fromJSON(steps.init-status.outputs.result).commentId }} ,
270
135
body: isSuccess ? successMessage : failureMessage
271
- });
272
-
273
- debug-delete :
274
- if : always()
275
- runs-on : ubuntu-latest
276
- steps :
277
- - name : Debug Trigger Conditions
278
- env :
279
- EVENT_NAME : ${{ github.event_name }}
280
- IS_PR : ${{ toJSON(github.event.issue.pull_request) }}
281
- COMMENT : ${{ github.event.comment.body }}
282
- run : |
283
- echo "Debug information for delete-review-app command:"
284
- echo "Event name: $EVENT_NAME"
285
- echo "Is PR (raw): $IS_PR"
286
- echo "Comment body: $COMMENT"
287
- echo "Raw event payload:"
288
- echo '${{ toJSON(github.event) }}'
289
-
290
- Process-Delete-Command :
291
- needs : debug-delete
292
- if : |
293
- github.event_name == 'issue_comment' &&
294
- github.event.issue.pull_request &&
295
- github.event.comment.body == '/delete-review-app'
296
- runs-on : ubuntu-latest
297
-
298
- steps :
299
- - uses : actions/checkout@v4
300
-
301
- - name : Validate Required Secrets
302
- run : |
303
- missing_secrets=()
304
- for secret in "CPLN_TOKEN" "CPLN_ORG"; do
305
- if [ -z "${!secret}" ]; then
306
- missing_secrets+=("$secret")
307
- fi
308
- done
309
-
310
- if [ ${#missing_secrets[@]} -ne 0 ]; then
311
- echo "Required secrets are not set: ${missing_secrets[*]}"
312
- exit 1
313
- fi
314
-
315
- - name : Setup Environment
316
- uses : ./.github/actions/setup-environment
317
-
318
- - name : Create Initial Delete Comment
319
- id : init-delete
320
- uses : actions/github-script@v7
321
- with :
322
- script : |
323
- const comment = await github.rest.issues.createComment({
324
- issue_number: process.env.PR_NUMBER,
325
- owner: context.repo.owner,
326
- repo: context.repo.repo,
327
- body: ' Starting app deletion...'
328
- });
329
- return { commentId: comment.data.id };
330
-
331
- - name : Delete Review App
332
- uses : ./.github/actions/delete-control-plane-app
333
- with :
334
- app_name : ${{ env.APP_NAME }}
335
- org : ${{ env.CPLN_ORG }}
336
- github_token : ${{ secrets.GITHUB_TOKEN }}
337
- env :
338
- CPLN_TOKEN : ${{ secrets.CPLN_TOKEN }}
339
-
340
- - name : Update Delete Status
341
- if : always()
342
- uses : actions/github-script@v7
343
- with :
344
- script : |
345
- const success = '${{ job.status }}' === 'success';
346
- const prNumber = process.env.PR_NUMBER;
347
- const cpConsoleUrl = `https://console.cpln.io/org/${process.env.CPLN_ORG}/workloads/${process.env.APP_NAME}`;
348
-
349
- const message = success
350
- ? ' Review app for PR #' + prNumber + ' was successfully deleted'
351
- : [
352
- ' Review app for PR #' + prNumber + ' failed to be deleted',
353
- '',
354
- ' [Control Plane Console for Review App with PR #' + prNumber + '](' + cpConsoleUrl + ')'
355
- ].join('\n');
356
-
357
- await github.rest.issues.updateComment({
358
- owner: context.repo.owner,
359
- repo: context.repo.repo,
360
- comment_id: ${{ fromJSON(steps.init-delete.outputs.result).commentId }},
361
- body: message
362
136
});
0 commit comments