1
- name : Deploy Review App to Control Plane
1
+ name : Deploy PR Review App to Control Plane
2
2
3
- run-name : Deploy Review App - ${{ github.ref_name }}
3
+ run-name : Deploy PR Review App - PR # ${{ github.event.pull_request.number || github.event.issue.number || github.event.inputs.pr_number }}
4
4
5
5
on :
6
6
pull_request :
37
37
(github.event_name == 'workflow_dispatch') ||
38
38
(github.event_name == 'issue_comment' &&
39
39
github.event.issue.pull_request &&
40
- github.event.comment.body == '/deploy-review-app')
40
+ contains( github.event.comment.body, '/deploy-review-app') )
41
41
runs-on : ubuntu-latest
42
42
permissions :
43
43
contents : read
@@ -91,51 +91,65 @@ jobs:
91
91
env :
92
92
GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
93
93
run : |
94
- # Get PR number based on event type
95
- case "${{ github.event_name }}" in
96
- "workflow_dispatch")
97
- PR_NUMBER="${{ github.event.inputs.pr_number }}"
98
- ;;
99
- "issue_comment")
100
- PR_NUMBER="${{ github.event.issue.number }}"
101
- ;;
102
- "pull_request")
103
- PR_NUMBER="${{ github.event.pull_request.number }}"
104
- ;;
105
- "push")
106
- # For push events, find associated PR
107
- PR_DATA=$(gh pr list --head "${{ github.ref_name }}" --json number --jq '.[0].number')
108
- if [[ -n "$PR_DATA" ]]; then
109
- PR_NUMBER="$PR_DATA"
110
- else
111
- echo "Error: No PR found for branch ${{ github.ref_name }}"
94
+ # For push events, try to find associated PR first
95
+ if [[ "${{ github.event_name }}" == "push" ]]; then
96
+ PR_DATA=$(gh pr list --head "${{ github.ref_name }}" --json number,headRefName,headRefOid --jq '.[0]')
97
+ if [[ -n "$PR_DATA" ]]; then
98
+ PR_NUMBER=$(echo "$PR_DATA" | jq -r .number)
99
+ else
100
+ echo "No PR found for branch ${{ github.ref_name }}, skipping deployment"
101
+ echo "DO_DEPLOY=false" >> $GITHUB_ENV
102
+ exit 0
103
+ fi
104
+ else
105
+ # Get PR number based on event type
106
+ case "${{ github.event_name }}" in
107
+ "workflow_dispatch")
108
+ PR_NUMBER="${{ github.event.inputs.pr_number }}"
109
+ ;;
110
+ "issue_comment")
111
+ PR_NUMBER="${{ github.event.issue.number }}"
112
+ ;;
113
+ "pull_request")
114
+ PR_NUMBER="${{ github.event.pull_request.number }}"
115
+ ;;
116
+ *)
117
+ echo "Error: Unsupported event type ${{ github.event_name }}"
112
118
exit 1
113
- fi
114
- ;;
115
- *)
116
- echo "Error: Unsupported event type ${{ github.event_name }}"
117
- exit 1
118
- ;;
119
- esac
120
-
119
+ ;;
120
+ esac
121
+ fi
122
+
121
123
if [[ -z "$PR_NUMBER" ]]; then
122
124
echo "Error: Could not determine PR number"
125
+ echo "Event type: ${{ github.event_name }}"
126
+ echo "Event action: ${{ github.event.action }}"
127
+ echo "Ref name: ${{ github.ref_name }}"
128
+ echo "Available event data:"
129
+ echo "- PR number from inputs: ${{ github.event.inputs.pr_number }}"
130
+ echo "- PR number from issue: ${{ github.event.issue.number }}"
131
+ echo "- PR number from pull_request: ${{ github.event.pull_request.number }}"
123
132
exit 1
124
133
fi
125
134
126
- # Set environment variables
135
+ # Get PR data
136
+ if [[ -z "$PR_DATA" ]]; then
137
+ PR_DATA=$(gh pr view "$PR_NUMBER" --json headRefName,headRefOid)
138
+ if [[ -z "$PR_DATA" ]]; then
139
+ echo "Error: PR DATA for PR #$PR_NUMBER not found"
140
+ echo "Event type: ${{ github.event_name }}"
141
+ echo "Event action: ${{ github.event.action }}"
142
+ echo "Ref name: ${{ github.ref_name }}"
143
+ echo "Attempted to fetch PR data with: gh pr view $PR_NUMBER"
144
+ exit 1
145
+ fi
146
+ fi
147
+
148
+ # Extract and set PR data
127
149
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV
128
150
echo "APP_NAME=${{ vars.REVIEW_APP_PREFIX }}-$PR_NUMBER" >> $GITHUB_ENV
129
-
130
- # Get PR data using GitHub CLI
131
- PR_DATA=$(gh pr view $PR_NUMBER --repo shakacode/react-webpack-rails-tutorial --json headRefName,headRefOid)
132
- if [[ $? -eq 0 ]]; then
133
- echo "PR_REF=$(echo $PR_DATA | jq -r .headRefName)" >> $GITHUB_OUTPUT
134
- echo "PR_SHA=$(echo $PR_DATA | jq -r .headRefOid)" >> $GITHUB_ENV
135
- else
136
- echo "Error: Could not fetch PR data for PR #$PR_NUMBER"
137
- exit 1
138
- fi
151
+ echo "PR_REF=$(echo $PR_DATA | jq -r .headRefName)" >> $GITHUB_OUTPUT
152
+ echo "PR_SHA=$(echo $PR_DATA | jq -r .headRefOid)" >> $GITHUB_ENV
139
153
140
154
- name : Checkout PR code
141
155
if : github.event_name == 'workflow_dispatch' || github.event_name == 'issue_comment'
@@ -152,7 +166,6 @@ jobs:
152
166
153
167
- name : Check if Review App Exists
154
168
id : check-app
155
- if : github.event_name == 'pull_request'
156
169
env :
157
170
CPLN_TOKEN : ${{ secrets.CPLN_TOKEN_STAGING }}
158
171
run : |
@@ -162,25 +175,64 @@ jobs:
162
175
exit 1
163
176
fi
164
177
165
- # Then check if app exists
178
+ # Check if app exists and save state
166
179
if ! cpflow exists -a ${{ env.APP_NAME }}; then
167
- echo "No review app exists for this PR"
168
- echo "DO_DEPLOY=false" >> $GITHUB_ENV
180
+ echo "APP_EXISTS=false" >> $GITHUB_ENV
169
181
else
170
- echo "DO_DEPLOY =true" >> $GITHUB_ENV
182
+ echo "APP_EXISTS =true" >> $GITHUB_ENV
171
183
fi
172
184
173
185
- name : Validate Deployment Request
174
186
id : validate
175
- if : env.DO_DEPLOY != 'false'
176
187
run : |
188
+ # Skip validation if deployment is already disabled
189
+ if [[ "${{ env.DO_DEPLOY }}" == "false" ]]; then
190
+ echo "Skipping validation - deployment already disabled"
191
+ exit 0
192
+ fi
193
+
177
194
if ! [[ "${{ github.event_name }}" == "workflow_dispatch" || \
178
- ("${{ github.event_name }}" == "issue_comment" && "${{ github.event.comment.body }}" == "/deploy-review-app") || \
179
- "${{ github.event_name }}" == "pull_request" ]]; then
180
- echo "Skipping deployment - not a valid trigger (event: ${{ github.event_name }})"
195
+ "${{ github.event_name }}" == "issue_comment" || \
196
+ "${{ github.event_name }}" == "pull_request" || \
197
+ "${{ github.event_name }}" == "push" ]]; then
198
+ echo "Error: Unsupported event type ${{ github.event_name }}"
181
199
exit 1
182
200
fi
183
201
202
+ # Set DO_DEPLOY based on event type and conditions
203
+ if [[ "${{ github.event_name }}" == "pull_request" && \
204
+ ("${{ github.event.action }}" == "opened" || \
205
+ "${{ github.event.action }}" == "synchronize" || \
206
+ "${{ github.event.action }}" == "reopened") ]]; then
207
+ echo "DO_DEPLOY=true" >> $GITHUB_ENV
208
+ elif [[ "${{ github.event_name }}" == "push" ]]; then
209
+ echo "DO_DEPLOY=true" >> $GITHUB_ENV
210
+ elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
211
+ echo "DO_DEPLOY=true" >> $GITHUB_ENV
212
+ elif [[ "${{ github.event_name }}" == "issue_comment" ]]; then
213
+ if [[ "${{ github.event.issue.pull_request }}" ]]; then
214
+ # Trim spaces and check for exact command
215
+ COMMENT_BODY=$(echo "${{ github.event.comment.body }}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
216
+ if [[ "$COMMENT_BODY" == "/deploy-review-app" ]]; then
217
+ echo "DO_DEPLOY=true" >> $GITHUB_ENV
218
+ else
219
+ echo "DO_DEPLOY=false" >> $GITHUB_ENV
220
+ echo "Skipping deployment - comment '$COMMENT_BODY' does not match '/deploy-review-app'"
221
+ fi
222
+ else
223
+ echo "DO_DEPLOY=false" >> $GITHUB_ENV
224
+ echo "Skipping deployment for non-PR comment"
225
+ fi
226
+ fi
227
+
228
+ - name : Setup Control Plane App if Not Existing
229
+ if : env.DO_DEPLOY == 'true' && env.APP_EXISTS == 'false'
230
+ env :
231
+ CPLN_TOKEN : ${{ secrets.CPLN_TOKEN_STAGING }}
232
+ run : |
233
+ echo "🔧 Setting up new Control Plane app..."
234
+ cpflow setup-app -a ${{ env.APP_NAME }} --org ${{ vars.CPLN_ORG_STAGING }}
235
+
184
236
- name : Create Initial Comment
185
237
if : env.DO_DEPLOY != 'false'
186
238
uses : actions/github-script@v7
@@ -228,7 +280,7 @@ jobs:
228
280
repo: context.repo.repo,
229
281
run_id: runId
230
282
});
231
- return run.html_url;
283
+ return run.html_url + '/job/' + context.job ;
232
284
};
233
285
234
286
const workflowUrl = await getWorkflowUrl(context.runId);
@@ -244,7 +296,7 @@ jobs:
244
296
with :
245
297
script : |
246
298
const buildingMessage = [
247
- '🏗️ Building Docker image for PR #' + process.env.PR_NUMBER + ', commit ' + process. env.PR_SHA,
299
+ '🏗️ Building Docker image for PR #' + process.env.PR_NUMBER + ', commit ' + '${{ env.PR_SHA }}' ,
248
300
'',
249
301
'📝 [View Build Logs](' + process.env.WORKFLOW_URL + ')',
250
302
'',
0 commit comments