|
24 | 24 | # See also https://github.community/t/specify-check-suite-when-creating-a-checkrun/118380/10 |
25 | 25 |
|
26 | 26 | name: "On pull requests" |
27 | | -on: |
28 | | - pull_request_target: |
29 | | - types: [opened, edited, reopened] |
| 27 | +on: pull_request_target |
30 | 28 |
|
31 | 29 | jobs: |
32 | 30 | label: |
33 | 31 | name: Label pull requests |
34 | 32 | runs-on: ubuntu-latest |
35 | 33 | permissions: |
36 | 34 | contents: read |
37 | | - pull-requests: write |
38 | 35 | steps: |
39 | 36 | - uses: actions/labeler@v5 |
40 | 37 | with: |
41 | 38 | repo-token: "${{ secrets.GITHUB_TOKEN }}" |
42 | 39 | sync-labels: true |
43 | | - |
44 | | - jira-info: |
45 | | - name: Comment JIRA information |
46 | | - runs-on: ubuntu-latest |
47 | | - permissions: |
48 | | - pull-requests: write |
49 | | - steps: |
50 | | - - name: Extract JIRA IDs and comment |
51 | | - uses: actions/github-script@v7 |
52 | | - with: |
53 | | - github-token: ${{ secrets.GITHUB_TOKEN }} |
54 | | - script: | |
55 | | - const prTitle = context.payload.pull_request.title; |
56 | | - const prNumber = context.payload.pull_request.number; |
57 | | -
|
58 | | - // Extract JIRA IDs from PR title |
59 | | - const jiraIdRegex = /\bSPARK-\d+\b/g; |
60 | | - const jiraIds = prTitle.match(jiraIdRegex); |
61 | | -
|
62 | | - // If no JIRA IDs found, check for [MINOR] tag |
63 | | - if (!jiraIds || jiraIds.length === 0) { |
64 | | - const minorRegex = /^\[MINOR\]/i; |
65 | | - if (minorRegex.test(prTitle)) { |
66 | | - console.log('PR title has [MINOR] tag, skipping'); |
67 | | - return; |
68 | | - } |
69 | | -
|
70 | | - // Post reminder comment |
71 | | - const reminderComment = `## ⚠️ Pull Request Title Validation\n\nThis pull request title does not contain a JIRA issue ID.\n\nPlease update the title to either:\n- Include a JIRA ID: \`[SPARK-12345] Your description\`\n- Mark as minor change: \`[MINOR] Your description\`\n\nFor minor changes that don't require a JIRA ticket (e.g., typo fixes), please prefix the title with \`[MINOR]\`.\n\n---\n*This comment was automatically generated by GitHub Actions*`; |
72 | | -
|
73 | | - const comments = await github.rest.issues.listComments({ |
74 | | - owner: context.repo.owner, |
75 | | - repo: context.repo.repo, |
76 | | - issue_number: prNumber |
77 | | - }); |
78 | | -
|
79 | | - const botComment = comments.data.find(comment => |
80 | | - comment.user.type === 'Bot' && |
81 | | - (comment.body.includes('## JIRA Issue Information') || comment.body.includes('## ⚠️ Pull Request Title Validation')) |
82 | | - ); |
83 | | -
|
84 | | - if (botComment) { |
85 | | - await github.rest.issues.updateComment({ |
86 | | - owner: context.repo.owner, |
87 | | - repo: context.repo.repo, |
88 | | - comment_id: botComment.id, |
89 | | - body: reminderComment |
90 | | - }); |
91 | | - console.log('Updated reminder comment'); |
92 | | - } else { |
93 | | - await github.rest.issues.createComment({ |
94 | | - owner: context.repo.owner, |
95 | | - repo: context.repo.repo, |
96 | | - issue_number: prNumber, |
97 | | - body: reminderComment |
98 | | - }); |
99 | | - console.log('Created reminder comment'); |
100 | | - } |
101 | | - return; |
102 | | - } |
103 | | -
|
104 | | - // Remove duplicates |
105 | | - const uniqueJiraIds = [...new Set(jiraIds)]; |
106 | | - console.log(`Found JIRA IDs: ${uniqueJiraIds.join(', ')}`); |
107 | | -
|
108 | | - // Fetch JIRA information for each ID |
109 | | - const jiraBaseUrl = 'https://issues.apache.org/jira'; |
110 | | - const jiraInfos = []; |
111 | | -
|
112 | | - for (const jiraId of uniqueJiraIds) { |
113 | | - try { |
114 | | - const response = await fetch(`${jiraBaseUrl}/rest/api/2/issue/${jiraId}`); |
115 | | -
|
116 | | - if (!response.ok) { |
117 | | - jiraInfos.push({ |
118 | | - id: jiraId, |
119 | | - type: 'Unknown', |
120 | | - error: `Failed to fetch (HTTP ${response.status})` |
121 | | - }); |
122 | | - continue; |
123 | | - } |
124 | | -
|
125 | | - const data = await response.json(); |
126 | | - const fields = data.fields; |
127 | | -
|
128 | | - jiraInfos.push({ |
129 | | - id: jiraId, |
130 | | - type: fields.issuetype?.name || 'Unknown', |
131 | | - summary: fields.summary || 'N/A', |
132 | | - assignee: fields.assignee ? fields.assignee.displayName : 'None', |
133 | | - status: fields.status ? fields.status.name : 'Unknown', |
134 | | - affected: fields.versions ? fields.versions.map(v => v.name) : [] |
135 | | - }); |
136 | | - } catch (error) { |
137 | | - console.error(`Error fetching ${jiraId}:`, error); |
138 | | - jiraInfos.push({ |
139 | | - id: jiraId, |
140 | | - type: 'Unknown', |
141 | | - error: error.message |
142 | | - }); |
143 | | - } |
144 | | - } |
145 | | -
|
146 | | - // Format comment |
147 | | - let commentBody = '## JIRA Issue Information\n\n'; |
148 | | -
|
149 | | - for (const info of jiraInfos) { |
150 | | - if (info.error) { |
151 | | - commentBody += `=== ${info.type} ${info.id} ===\n`; |
152 | | - commentBody += `Error: ${info.error}\n\n`; |
153 | | - } else { |
154 | | - commentBody += `=== ${info.type} ${info.id} ===\n`; |
155 | | - commentBody += `Summary: ${info.summary}\n`; |
156 | | - commentBody += `Assignee: ${info.assignee}\n`; |
157 | | - commentBody += `Status: ${info.status}\n`; |
158 | | - commentBody += `Affected: ${JSON.stringify(info.affected)}\n\n`; |
159 | | - } |
160 | | - } |
161 | | -
|
162 | | - commentBody += '---\n*This comment was automatically generated by GitHub Actions*'; |
163 | | -
|
164 | | - // Check if there's an existing comment from this action |
165 | | - const comments = await github.rest.issues.listComments({ |
166 | | - owner: context.repo.owner, |
167 | | - repo: context.repo.repo, |
168 | | - issue_number: prNumber |
169 | | - }); |
170 | | -
|
171 | | - const botComment = comments.data.find(comment => |
172 | | - comment.user.type === 'Bot' && |
173 | | - (comment.body.includes('## JIRA Issue Information') || comment.body.includes('## ⚠️ Pull Request Title Validation')) |
174 | | - ); |
175 | | -
|
176 | | - if (botComment) { |
177 | | - await github.rest.issues.updateComment({ |
178 | | - owner: context.repo.owner, |
179 | | - repo: context.repo.repo, |
180 | | - comment_id: botComment.id, |
181 | | - body: commentBody |
182 | | - }); |
183 | | - console.log('Updated existing comment'); |
184 | | - } else { |
185 | | - await github.rest.issues.createComment({ |
186 | | - owner: context.repo.owner, |
187 | | - repo: context.repo.repo, |
188 | | - issue_number: prNumber, |
189 | | - body: commentBody |
190 | | - }); |
191 | | - console.log('Created new comment'); |
192 | | - } |
0 commit comments