はじめに
GitHub ActionでCI/CD環境を組んでいて、ビルドができても完了通知やビルドデータのダウンロードをするためには毎回 GitHubを開く必要があります。
かなり手間になっていたので、ビルドが環境するとアーティファクトがあるページのURLをDiscordに送信するシステムを作りました。
(デモリポジトリはUnity用に作成していますが、ほかのものでも代用できると思います)
public Repositoryではないと動かないことが判明したため、調査中です
成果物
以下のように Discordにビルドで作成されたアーティファクトがあるページのURLが、 discordでビルド環境時にメッセージとして送られてきます。
Repository
動作環境
使い方
1. Actions secretsの登録
まずは今回は GitHub APIと discordのwebHookを使っているため、以下の画像のように GitHub の環境変数に WebHookURL
と GitHub Personal Token
登録をします。
tokenは最低限のものを許可していれば大丈夫です。
この際に GitHub上の設定で、Setting → Actions → General → Workflow permissions
が Read and write permissions
になっていることを確認してください。
動かない可能性があります。
2. GitHub Actionのymlの作成
ymlの実行したい箇所に以下を追加します
- name: Set up Python 3.9 uses: actions/setup-python@v3.1.2 with: python-version: 3.9 - name: Install dependencies run: | pip install -r .github/send_download_artifact_url/requirements.txt - name: send download artifact page url env: GITHUB_REPOSITORY: ${{ github.repository }} run: | python .github/send_download_artifact_url/send-download-artifact-page-url.py
3. スクリプトの作成と配置
実行するスクリプト( send-download-artifact-page.py
) と requirements.txt
を以下のように .github/send_download_artifact_url
以下に配置します。
ファイル名や配置パスは、ymlを書き換えれば任意のものに変更しても大丈夫です。
discordに送信するスクリプトは以下になっています。
import os import requests from dotenv import load_dotenv load_dotenv() headers = { "Accept": "application/vnd.github.v3+json", "Authorization": os.getenv("PERSONAL_ACCESS_TOKEN"), } req = requests.get(f" https://api.github.com/repos/{os.getenv('GITHUB_REPOSITORY')}/actions/artifacts", headers=headers).json() def get_download_url(content): for artifact in content["artifacts"]: if artifact["name"] == "Build-StandaloneWindows64": run_id = artifact["workflow_run"]["id"] url = f"https://github.com/{os.getenv('GITHUB_REPOSITORY')}/actions/runs/{run_id}" return url return None def message(url): content = { "username": "ビルドダウンロードページ", "content": "ビルドが終了しました。" + f"\nダウンロードページ: {url}" } return content requests.post(os.getenv("DISCORD_WEBHOOK_URL"), message(get_download_url(req)))
実装の詳細
最新のビルドデータを取得
https://api.github.com/repos/OWNER/REPO/actions/artifacts
を使い、Repositoryのartifactのリストを取得しています。その中から ビルドデータ (今回の場合は、Build-StandaloneWindows64
) に一致するもので最新のものを取得しています。
https://docs.github.com/ja/rest/actions/artifacts#list-artifacts-for-a-repository
実際にAPIを叩いてみると、以下のようなデータが返ってくることが分かります。
artifactのあるページのURL作成
GitHub上でartifactがあるページは https://github.com/owner_name/repository_name/actions/runs/run_id
となっています。こちらは直接取得できないため、↑のでビルドデータの中に run_id
が含まれているので、そこからidを取得して URLを生成しています。
(ブックマークは気にしないでください)
リポジトリのownerとRepositoryNameを取得
Repositoryに依存しない実装にしたかったので、Repository名やowner名をスクリプト上に記載したくはなかったので この二つを 環境変数として取得しています。
${{ github.repository }}
で取得できるため、 ymlファイルでは以下のように設定をして Python上で環境変数を読んでいます。
env: GITHUB_REPOSITORY: ${{ github.repository }}
参考サイト
終わりに
本来は直接artifactをダウンロードできるURLが欲しかったのですが、以下のようにダウンロードURLは発行できるものの1分しか持たないみたいです。
そのため、今回は妥協してダウンロードできるページのURLを送信するようにしました。