@@ -9,70 +9,104 @@ permissions:
9
9
contents : read
10
10
11
11
jobs :
12
- trigger_tests_on_comment :
13
- name : Handle /test-workflows command
12
+ handle_comment_command :
13
+ name : Handle /test-workflows Command
14
14
if : github.event.issue.pull_request && startsWith(github.event.comment.body, '/test-workflows')
15
15
runs-on : ubuntu-latest
16
+ outputs :
17
+ permission_granted : ${{ steps.pr_check_and_details.outputs.permission_granted }}
18
+ git_ref : ${{ steps.pr_check_and_details.outputs.head_sha }}
19
+ pr_number : ${{ steps.pr_check_and_details.outputs.pr_number_string }}
16
20
17
21
steps :
18
- - name : Check User Permission and Get PR Details
19
- id : pr_check
22
+ - name : Validate User, Get PR Details, and React
23
+ id : pr_check_and_details
20
24
uses : actions/github-script@v7
21
25
with :
22
26
github-token : ${{ secrets.GITHUB_TOKEN }}
23
- result-encoding : json
24
27
script : |
25
28
const commenter = context.actor;
26
- const issue = context.issue;
27
- let hasPermission = false;
28
- let prDetails = null;
29
+ const issueOwner = context.repo.owner;
30
+ const issueRepo = context.repo.repo;
31
+ const commentId = context.payload.comment.id;
32
+ const prNumber = context.issue.number; // In issue_comment on a PR, issue.number is the PR number
29
33
34
+ // Function to add a reaction to the comment
35
+ async function addReaction(content) {
36
+ try {
37
+ await github.rest.reactions.createForIssueComment({
38
+ owner: issueOwner,
39
+ repo: issueRepo,
40
+ comment_id: commentId,
41
+ content: content
42
+ });
43
+ } catch (reactionError) {
44
+ // Log if reaction fails but don't fail the script for this
45
+ console.log(`Failed to add reaction '${content}': ${reactionError.message}`);
46
+ }
47
+ }
48
+
49
+ // Initialize outputs to a non-triggering state
50
+ core.setOutput('permission_granted', 'false');
51
+ core.setOutput('head_sha', '');
52
+ core.setOutput('pr_number_string', '');
53
+
54
+ // 1. Check user permissions
30
55
try {
31
56
const { data: permissions } = await github.rest.repos.getCollaboratorPermissionLevel({
32
- owner: issue.owner ,
33
- repo: issue.repo ,
57
+ owner: issueOwner ,
58
+ repo: issueRepo ,
34
59
username: commenter
35
60
});
36
61
37
62
const allowedPermissions = ['admin', 'write', 'maintain'];
38
- if (allowedPermissions.includes(permissions.permission)) {
39
- console.log(`User @${commenter} has '${permissions.permission}' permission.`);
40
- hasPermission = true;
41
- } else {
42
- core.setFailed(`User @${commenter} does not have sufficient permissions (admin/write/maintain) to trigger workflows.`);
63
+ if (!allowedPermissions.includes(permissions.permission)) {
64
+ console.log(`User @${commenter} has '${permissions.permission}' permission. Needs 'admin', 'write', or 'maintain'.`);
65
+ await addReaction('-1'); // User does not have permission
66
+ return; // Exit script, tests will not be triggered
43
67
}
68
+ console.log(`User @${commenter} has '${permissions.permission}' permission.`);
44
69
} catch (error) {
45
- core.setFailed(`Could not verify permissions for @${commenter}: ${error.message}`);
70
+ console.log(`Could not verify permissions for @${commenter}: ${error.message}`);
71
+ await addReaction('confused'); // Error checking permissions
72
+ return; // Exit script
46
73
}
47
74
48
- if (!hasPermission) {
49
- return { permission_granted: false };
50
- }
51
-
52
- const prNumber = issue.number;
75
+ // 2. Fetch PR details (if permission check passed)
76
+ let headSha;
53
77
try {
54
78
const { data: pr } = await github.rest.pulls.get({
55
- owner: context.repo.owner ,
56
- repo: context.repo.repo ,
79
+ owner: issueOwner ,
80
+ repo: issueRepo ,
57
81
pull_number: prNumber,
58
82
});
59
- prDetails = {
60
- head_sha: pr.head.sha,
61
- pr_number_string: prNumber.toString()
62
- };
63
- console.log(`Workspaceed PR details: SHA - ${prDetails.head_sha}, PR Number - ${prDetails.pr_number_string}`);
83
+ headSha = pr.head.sha;
84
+ console.log(`Workspaced PR details: SHA - ${headSha}, PR Number - ${prNumber}`);
85
+
86
+ // Set outputs for the next job
87
+ core.setOutput('permission_granted', 'true');
88
+ core.setOutput('head_sha', headSha);
89
+ core.setOutput('pr_number_string', prNumber.toString());
90
+ await addReaction('+1'); // Command accepted, tests will be triggered
91
+
64
92
} catch (error) {
65
- core.setFailed(`Failed to fetch PR details for PR #${prNumber}: ${error.message}`);
66
- return { permission_granted: true, pr_fetch_error: true };
93
+ console.log(`Failed to fetch PR details for PR #${prNumber}: ${error.message}`);
94
+ core.setOutput('permission_granted', 'false'); // Ensure this is false if PR fetch fails
95
+ await addReaction('confused'); // Error fetching PR details
67
96
}
68
97
69
- return { permission_granted: true, ...prDetails };
98
+ trigger_reusable_tests :
99
+ name : Trigger Reusable Test Workflow
100
+ needs : handle_comment_command
70
101
71
- - name : Call Reusable Test Workflow
72
- if : steps.pr_check.outcome == 'success' && fromJson(steps.pr_check.outputs.result).permission_granted == true && fromJson(steps.pr_check.outputs.result).head_sha
73
- uses : ./.github/workflows/test-workflows-callable.yml
74
- with :
75
- git_ref : ${{ fromJson(steps.pr_check.outputs.result).head_sha }}
76
- send_webhook_report : true
77
- pr_number : ${{ fromJson(steps.pr_check.outputs.result).pr_number_string }}
78
- secrets : inherit
102
+ if : >
103
+ always() &&
104
+ needs.handle_comment_command.result != 'skipped' &&
105
+ needs.handle_comment_command.outputs.permission_granted == 'true' &&
106
+ needs.handle_comment_command.outputs.git_ref != ''
107
+ uses : ./.github/workflows/test-workflows-callable.yml
108
+ with :
109
+ git_ref : ${{ needs.handle_comment_command.outputs.git_ref }}
110
+ send_webhook_report : true
111
+ pr_number : ${{ needs.handle_comment_command.outputs.pr_number }}
112
+ secrets : inherit
0 commit comments