Skip to content

Commit cd86224

Browse files
committed
Report release workflow failures
1 parent 571a043 commit cd86224

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

.github/workflows/release.yml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ on:
1313

1414
permissions:
1515
contents: write
16+
issues: write
1617

1718
env:
1819
RELEASE_REF: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }}
@@ -217,3 +218,79 @@ jobs:
217218
name: ${{ env.RELEASE_REF }}
218219
body: ${{ env.CHANGELOG_CONTENT }}
219220
draft: true
221+
222+
report-failure:
223+
needs: [ spotless-check, desktop-tests, discover-android-modules, android-tests, publish, github-release ]
224+
if: ${{ always() && (needs.spotless-check.result == 'failure' || needs.desktop-tests.result == 'failure' || needs.discover-android-modules.result == 'failure' || needs.android-tests.result == 'failure' || needs.publish.result == 'failure' || needs.github-release.result == 'failure') }}
225+
runs-on: ubuntu-latest
226+
steps:
227+
- name: Open GitHub issue
228+
uses: actions/github-script@v8
229+
with:
230+
script: |
231+
const owner = context.repo.owner;
232+
const repo = context.repo.repo;
233+
const releaseRef = '${{ env.RELEASE_REF }}';
234+
const title = `Release failed for ${releaseRef}`;
235+
const labels = ['release-failure'];
236+
const runUrl = `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`;
237+
const results = {
238+
'spotless-check': '${{ needs.spotless-check.result }}',
239+
'desktop-tests': '${{ needs.desktop-tests.result }}',
240+
'discover-android-modules': '${{ needs.discover-android-modules.result }}',
241+
'android-tests': '${{ needs.android-tests.result }}',
242+
'publish': '${{ needs.publish.result }}',
243+
'github-release': '${{ needs.github-release.result }}',
244+
};
245+
246+
const body = [
247+
`Release failed for \`${releaseRef}\`.`,
248+
'',
249+
`Workflow run: ${runUrl}`,
250+
'',
251+
'Job results:',
252+
...Object.entries(results).map(([job, result]) => `- \`${job}\`: ${result}`),
253+
'',
254+
'Please inspect the failed job logs and rerun the release once the issue is fixed.',
255+
].join('\n');
256+
257+
const { data: existingIssues } = await github.rest.issues.listForRepo({
258+
owner,
259+
repo,
260+
state: 'open',
261+
labels: labels.join(','),
262+
per_page: 10,
263+
});
264+
const existingIssue = existingIssues.find(issue => issue.title === title);
265+
266+
if (existingIssue) {
267+
await github.rest.issues.createComment({
268+
owner,
269+
repo,
270+
issue_number: existingIssue.number,
271+
body,
272+
});
273+
return;
274+
}
275+
276+
try {
277+
await github.rest.issues.createLabel({
278+
owner,
279+
repo,
280+
name: labels[0],
281+
color: 'd73a4a',
282+
description: 'Release workflow validation or publishing is failing.',
283+
});
284+
} catch (error) {
285+
if (error.status !== 422) {
286+
throw error;
287+
}
288+
}
289+
290+
await github.rest.issues.create({
291+
owner,
292+
repo,
293+
title,
294+
body,
295+
labels,
296+
});

0 commit comments

Comments
 (0)