diff options
| author | QMK Bot <hello@qmk.fm> | 2023-04-07 06:37:46 +0000 |
|---|---|---|
| committer | QMK Bot <hello@qmk.fm> | 2023-04-07 06:37:46 +0000 |
| commit | 5bc514036b094560b16190edc65687d9ec4b82e3 (patch) | |
| tree | 0f33de9575fbba624184c72a55ca9b4ae07100a5 /util | |
| parent | b84b62c9679ea2180067f083fd71b398f0e7c334 (diff) | |
| parent | 2e766a9c7a0888a96ed9108f09a085f4298af0b3 (diff) | |
Merge remote-tracking branch 'origin/master' into develop
Diffstat (limited to 'util')
| -rwxr-xr-x | util/ci/discord-results.py | 49 | ||||
| -rw-r--r-- | util/ci/requirements.txt | 1 |
2 files changed, 50 insertions, 0 deletions
diff --git a/util/ci/discord-results.py b/util/ci/discord-results.py new file mode 100755 index 0000000000..0c09a4213a --- /dev/null +++ b/util/ci/discord-results.py | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | #!/usr/bin/env python3 | ||
| 2 | |||
| 3 | import argparse | ||
| 4 | import os | ||
| 5 | import re | ||
| 6 | import sys | ||
| 7 | from pathlib import Path | ||
| 8 | from discord_webhook import DiscordWebhook, DiscordEmbed | ||
| 9 | |||
| 10 | parser = argparse.ArgumentParser(prog='discord-results.py', description='Sends a Discord webhook notification at the end of a CI run.') | ||
| 11 | parser.add_argument('-b', '--branch') | ||
| 12 | parser.add_argument('-k', '--keymap') | ||
| 13 | parser.add_argument('-u', '--url') | ||
| 14 | args = parser.parse_args() | ||
| 15 | |||
| 16 | qmk_dir = Path(__file__).resolve().parents[2].resolve() | ||
| 17 | |||
| 18 | keyboard_re = re.compile(r'CI Metadata: KEYBOARD=(.*)$', re.MULTILINE) | ||
| 19 | keymap_re = re.compile(r'CI Metadata: KEYMAP=(.*)$', re.MULTILINE) | ||
| 20 | |||
| 21 | successful_builds = sum([len(list(qmk_dir.glob(f'*.{extension}'))) for extension in ['uf2', 'bin', 'hex']]) | ||
| 22 | failures = list(sorted([f.resolve() for f in (qmk_dir / '.build/').glob('failed.log.*')])) | ||
| 23 | failed_builds = [] | ||
| 24 | for f in failures: | ||
| 25 | with open(f) as fh: | ||
| 26 | data = fh.read() | ||
| 27 | kb = keyboard_re.search(data).group(1) | ||
| 28 | km = keymap_re.search(data).group(1) | ||
| 29 | failed_builds.append(f'{kb}:{km}') | ||
| 30 | |||
| 31 | webhook = DiscordWebhook(url=os.getenv('DISCORD_WEBHOOK'), username="QMK GitHub CI") | ||
| 32 | if len(failed_builds) > 0: | ||
| 33 | failstr = '' | ||
| 34 | for f in failed_builds: | ||
| 35 | if len(failstr) >= 1800: | ||
| 36 | failstr += '<<snip>>' | ||
| 37 | break | ||
| 38 | failstr += f'{f}\n' | ||
| 39 | |||
| 40 | embed = DiscordEmbed(title=f':infinity: CI Build Failure ({args.branch}, {args.keymap})', description=f'**{successful_builds}** builds succeeded, **{len(failed_builds)}** builds failed:```{failstr}```', color='ff9999') | ||
| 41 | else: | ||
| 42 | embed = DiscordEmbed(title=f':infinity: CI Build Success ({args.branch}, {args.keymap})', description=f'**{successful_builds}** builds succeeded.', color='99ff99') | ||
| 43 | |||
| 44 | embed.add_embed_field(name='Build Target', value=f'[**{args.branch}**](https://github.com/qmk/qmk_firmware/tree/{args.branch}) / **{args.keymap}** keymap') | ||
| 45 | embed.add_embed_field(name='Workflow Run', value=f'[**Link**]({args.url})') | ||
| 46 | embed.set_timestamp() | ||
| 47 | |||
| 48 | webhook.add_embed(embed) | ||
| 49 | webhook.execute() | ||
diff --git a/util/ci/requirements.txt b/util/ci/requirements.txt new file mode 100644 index 0000000000..3196568e1a --- /dev/null +++ b/util/ci/requirements.txt | |||
| @@ -0,0 +1 @@ | |||
| discord-webhook | |||
