@@ -5,11 +5,6 @@ run-name: Deploy PR Review App - PR #${{ github.event.pull_request.number || git
5
5
on :
6
6
pull_request :
7
7
types : [opened, synchronize, reopened]
8
- push :
9
- branches :
10
- - ' **' # Any branch
11
- - ' !main' # Except main
12
- - ' !master' # Except master
13
8
issue_comment :
14
9
types : [created]
15
10
workflow_dispatch :
71
66
72
67
- name : Validate Required Secrets and Variables
73
68
uses : ./.github/actions/validate-required-vars
69
+ with :
70
+ CPLN_TOKEN_STAGING : ${{ secrets.CPLN_TOKEN_STAGING }}
71
+ CPLN_TOKEN_PRODUCTION : ${{ secrets.CPLN_TOKEN_PRODUCTION }}
72
+ CPLN_ORG_STAGING : ${{ vars.CPLN_ORG_STAGING }}
73
+ CPLN_ORG_PRODUCTION : ${{ vars.CPLN_ORG_PRODUCTION }}
74
+ REVIEW_APP_PREFIX : ${{ vars.REVIEW_APP_PREFIX }}
75
+ PRODUCTION_APP_NAME : ${{ vars.PRODUCTION_APP_NAME }}
76
+ STAGING_APP_NAME : ${{ vars.STAGING_APP_NAME }}
74
77
75
78
- name : Get PR HEAD Ref
76
79
id : getRef
@@ -131,9 +134,9 @@ jobs:
131
134
fi
132
135
fi
133
136
134
- # Extract and set PR data
137
+ # Set PR_NUMBER and override APP_NAME with validated PR number
135
138
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV
136
- echo "APP_NAME=${{ vars.REVIEW_APP_PREFIX }}-$PR_NUMBER" >> $GITHUB_ENV
139
+ echo "APP_NAME=${{ vars.REVIEW_APP_PREFIX }}-pr- $PR_NUMBER" >> $GITHUB_ENV
137
140
echo "PR_REF=$(echo $PR_DATA | jq -r .headRefName)" >> $GITHUB_OUTPUT
138
141
echo "PR_SHA=$(echo $PR_DATA | jq -r .headRefOid)" >> $GITHUB_ENV
139
142
@@ -170,42 +173,16 @@ jobs:
170
173
exit 0
171
174
fi
172
175
176
+ # Validate supported event types
173
177
if ! [[ "${{ github.event_name }}" == "workflow_dispatch" || \
174
178
"${{ github.event_name }}" == "issue_comment" || \
175
- "${{ github.event_name }}" == "pull_request" || \
176
- "${{ github.event_name }}" == "push" ]]; then
179
+ "${{ github.event_name }}" == "pull_request" ]]; then
177
180
echo "Error: Unsupported event type ${{ github.event_name }}"
178
181
exit 1
179
182
fi
180
183
181
- # Set DO_DEPLOY based on event type and conditions
182
- if [[ "${{ github.event_name }}" == "pull_request" && \
183
- ("${{ github.event.action }}" == "opened" || \
184
- "${{ github.event.action }}" == "synchronize" || \
185
- "${{ github.event.action }}" == "reopened") ]]; then
186
- echo "DO_DEPLOY=true" >> $GITHUB_ENV
187
- elif [[ "${{ github.event_name }}" == "push" ]]; then
188
- echo "DO_DEPLOY=true" >> $GITHUB_ENV
189
- elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
190
- echo "DO_DEPLOY=true" >> $GITHUB_ENV
191
- elif [[ "${{ github.event_name }}" == "issue_comment" ]]; then
192
- if [[ "${{ github.event.issue.pull_request }}" ]]; then
193
- # Trim spaces and check for exact command
194
- COMMENT_BODY=$(echo "${{ github.event.comment.body }}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
195
- if [[ "$COMMENT_BODY" == "/deploy-review-app" ]]; then
196
- echo "DO_DEPLOY=true" >> $GITHUB_ENV
197
- else
198
- echo "DO_DEPLOY=false" >> $GITHUB_ENV
199
- echo "Skipping deployment - comment '$COMMENT_BODY' does not match '/deploy-review-app'"
200
- fi
201
- else
202
- echo "DO_DEPLOY=false" >> $GITHUB_ENV
203
- echo "Skipping deployment for non-PR comment"
204
- fi
205
- fi
206
-
207
184
- name : Setup Control Plane App if Not Existing
208
- if : env.DO_DEPLOY == 'true ' && env.APP_EXISTS == 'false'
185
+ if : env.DO_DEPLOY != 'false ' && env.APP_EXISTS == 'false'
209
186
env :
210
187
CPLN_TOKEN : ${{ secrets.CPLN_TOKEN_STAGING }}
211
188
run : |
@@ -222,7 +199,17 @@ jobs:
222
199
owner: context.repo.owner,
223
200
repo: context.repo.repo,
224
201
issue_number: process.env.PR_NUMBER,
225
- body: '🚀 Starting deployment process...\n\n' + process.env.CONSOLE_LINK
202
+ body: [
203
+ `🏗️ Building Docker image for PR [#${process.env.PR_NUMBER}](${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/pull/${process.env.PR_NUMBER}), commit [${context.sha.substring(0, 7)}](${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/commit/${context.sha})`,
204
+ '',
205
+ '🚀 Deploying to Control Plane...',
206
+ '',
207
+ '⏳ Waiting for deployment to be ready...',
208
+ '',
209
+ `📝 [View Build and Deploy Logs](${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}/job/${context.job})`,
210
+ '',
211
+ process.env.CONSOLE_LINK
212
+ ].join('\n')
226
213
});
227
214
core.setOutput('comment-id', result.data.id);
228
215
@@ -252,7 +239,7 @@ jobs:
252
239
};
253
240
254
241
const workflowUrl = await getWorkflowUrl(context.runId);
255
- core.exportVariable('WORKFLOW_URL ', workflowUrl);
242
+ core.exportVariable('BUILD_LOGS_URL ', workflowUrl);
256
243
core.exportVariable('CONSOLE_LINK',
257
244
'🎮 [Control Plane Console](' +
258
245
'https://console.cpln.io/console/org/' + process.env.CPLN_ORG + '/gvc/' + process.env.APP_NAME + '/-info)'
@@ -309,25 +296,6 @@ jobs:
309
296
token : ${{ secrets.CPLN_TOKEN_STAGING }}
310
297
org : ${{ vars.CPLN_ORG_STAGING }}
311
298
312
- - name : Update Status - Building
313
- uses : actions/github-script@v7
314
- with :
315
- script : |
316
- const buildingMessage = [
317
- '🏗️ Building Docker image for PR #${{ needs.process-deployment.outputs.pr_number }}, commit ${{ needs.process-deployment.outputs.pr_sha }}',
318
- '',
319
- '📝 [View Build Logs](${{ env.WORKFLOW_URL }})',
320
- '',
321
- process.env.CONSOLE_LINK
322
- ].join('\n');
323
-
324
- await github.rest.issues.updateComment({
325
- owner: context.repo.owner,
326
- repo: context.repo.repo,
327
- comment_id: ${{ needs.process-deployment.outputs.comment_id }},
328
- body: buildingMessage
329
- });
330
-
331
299
- name : Build Docker Image
332
300
id : build
333
301
uses : ./.github/actions/build-docker-image
@@ -355,21 +323,43 @@ jobs:
355
323
uses : actions/github-script@v7
356
324
with :
357
325
script : |
358
- const deployingMessage = [
359
- '🚀 Deploying to Control Plane...',
360
- '',
361
- '⏳ Waiting for deployment to be ready...',
362
- '',
363
- '📝 [View Deploy Logs](${{ env.WORKFLOW_URL }})',
364
- '',
365
- process.env.CONSOLE_LINK
366
- ].join('\n');
326
+ // Create deployment status for deploying state
327
+ await github.rest.repos.createDeploymentStatus({
328
+ owner: context.repo.owner,
329
+ repo: context.repo.repo,
330
+ deployment_id: ${{ needs.process-deployment.outputs.deployment_id }},
331
+ state: 'in_progress',
332
+ description: 'Deployment in progress',
333
+ log_url: process.env.BUILD_LOGS_URL
334
+ });
335
+
336
+ // Get the current job URL and ID
337
+ const { data: jobs } = await github.rest.actions.listJobsForWorkflowRun({
338
+ owner: context.repo.owner,
339
+ repo: context.repo.repo,
340
+ run_id: context.runId
341
+ });
367
342
343
+ const currentJob = jobs.jobs.find(job => job.name === context.job);
344
+ const currentJobUrl = `${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}/job/${currentJob.id}?pr=${process.env.PR_NUMBER}`;
345
+
346
+ // Update the PR comment with correct job URLs
368
347
await github.rest.issues.updateComment({
369
348
owner: context.repo.owner,
370
349
repo: context.repo.repo,
371
- comment_id: ${{ steps.create-comment.outputs.comment-id }},
372
- body: deployingMessage
350
+ comment_id: ${{ needs.build.outputs.comment_id }},
351
+ body: [
352
+ `🏗️ Built Docker image for PR [#${process.env.PR_NUMBER}](${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/pull/${process.env.PR_NUMBER}), commit [${process.env.PR_SHA.substring(0, 7)}](${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/commit/${process.env.PR_SHA})`,
353
+ '',
354
+ '🚀 Deploying to Control Plane...',
355
+ '',
356
+ '⏳ Waiting for deployment to be ready...',
357
+ '',
358
+ process.env.CONSOLE_LINK,
359
+ '',
360
+ `📝 [View Build Logs](${process.env.BUILD_LOGS_URL}?pr=${process.env.PR_NUMBER})`,
361
+ `📝 [View Deploy Logs](${currentJobUrl})`
362
+ ].join('\n')
373
363
});
374
364
375
365
- name : Deploy to Control Plane
@@ -395,14 +385,24 @@ jobs:
395
385
396
386
const consoleLink = process.env.CONSOLE_LINK;
397
387
388
+ // Get current job ID for accurate logs URL
389
+ const { data: jobs } = await github.rest.actions.listJobsForWorkflowRun({
390
+ owner: context.repo.owner,
391
+ repo: context.repo.repo,
392
+ run_id: context.runId
393
+ });
394
+
395
+ const currentJob = jobs.jobs.find(job => job.name === context.job);
396
+ const logsUrl = `${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}/job/${currentJob.id}?pr=${prNumber}`;
397
+
398
398
// Create GitHub deployment status
399
399
const deploymentStatus = {
400
400
owner: context.repo.owner,
401
401
repo: context.repo.repo,
402
402
deployment_id: ${{ steps.init-deployment.outputs.result }},
403
403
state: isSuccess ? 'success' : 'failure',
404
404
environment_url: isSuccess ? appUrl : undefined,
405
- log_url: workflowUrl ,
405
+ log_url: logsUrl ,
406
406
environment: 'review'
407
407
};
408
408
@@ -415,21 +415,21 @@ jobs:
415
415
'🚀 [Review App for PR #' + prNumber + '](' + appUrl + ')',
416
416
consoleLink,
417
417
'',
418
- '📋 [View Completed Action Build and Deploy Logs](' + workflowUrl + ')'
418
+ `📝 [View Build and Deploy Logs](${logsUrl})`,
419
419
].join('\n');
420
420
421
421
const failureMessage = [
422
422
'❌ Deployment failed for PR #' + prNumber + ', commit ' + '${{ env.PR_SHA }}',
423
423
'',
424
424
consoleLink,
425
425
'',
426
- '📋 [View Deployment Logs with Errors](' + workflowUrl + ')'
426
+ `📝 [View Build and Deploy Logs with Errors](${logsUrl})`,
427
427
].join('\n');
428
428
429
429
// Update the existing comment
430
430
await github.rest.issues.updateComment({
431
431
owner: context.repo.owner,
432
432
repo: context.repo.repo,
433
- comment_id: ${{ steps.create-comment .outputs.comment-id }},
433
+ comment_id: ${{ needs.build .outputs.comment_id }},
434
434
body: isSuccess ? successMessage : failureMessage
435
435
});
0 commit comments