natural born minority
SlackからDiscordに移行したんですが…あたりまえながら「CI通知系が全部ご破産」になりまして。
DiscordのWebhookは「互換のあるWebhook」とは聞くものの、多くの「Slack連携機能」は「Slack専用の機能」で、それ用の入力粋とか用意しているわけでして。
そりゃ「Webhookさえあれば通知なんて実装出来るはず」ったって、その「実装」に時間と手間が掛かるものです。
というわけで「CIの結果通知をDiscordに通知する方法」を、CIサービス別に調べました。
(他のサービスも分かり次第、追記する予定です。)
Github Actions
には、「CI自体の機能として通知用のWebhookを指定する」ような箇所はありません。
そのため「ワークフローファイル記述し、自力で飛ばす」必要があります。
(Githubに行った操作を、Webhookへ通知する手段は在りますが「ActionsのCIがコケたら」とかではありません。)
自力は自力なのですが、共通部品として便利な Actions
というものを使うことが出来ます。
https://github.com/marketplace から Discord
を検索すると、50以上の Actions
が見つかります。
一番Starが多かった Actions for Discord(Ilshidur/action-discord) を使って実現してみます。
ワークフローファイルのyamlに
- name: Notify Discord
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: {{ secrets.DISCORD_WEBHOOK_URL }}
with:
args: |
{{ GITHUB_REPOSITORY }} のテストが失敗しました。
{{ GITHUB_SERVER_URL }}/{{ GITHUB_REPOSITORY }}/actions/runs/{{ GITHUB_RUN_ID }} を確認して下さい。
if: failure()
のように書くと
のように通知されました。
前述例1は、本体部分がすべて自分なので自由に書けて良いのですが、もうちょっと楽に書式が整った表示をしてほしいなと思いました。(警告なら赤色とかにしたいし)
そこで「作者にコンタクトを取ること」も考慮して、日本の方が作られたActions を使わせて貰おうと思います。
- name: Notify Discord
uses: sarisia/actions-status-discord@v1
with:
webhook:
${{ secrets.DISCORD_WEBHOOK_URL }}
if: failure()
と書くと、
おお、ほしかった感じの結果です。満足しました。
前述の2例のように「良い感じの Actions
を自ら選んで仕込む」というのが、ActionsからのDiscrod通知の仕込み方のようです。
前述の例にあった GITHUB_RUN_ID
など、ワークフローファイル内では Githubが用意している組み込み変数
が使えます。
公式ドキュメントの一覧 から、自身が表示したい情報の変数を探すと良いでしょう。
前述の例にあった secrets.DISCORD_WEBHOOK_URL
など「ワークフローファイル内で使える自身が定義する変数」は、 Srcrets(機密情報)
としてGithubActions側に登録するのが定石のようです。
公式ドキュメント によれば、「Organizationごと」「リポジトリごと」「environmentごと」のレベルで登録出来るので「で複数リポジトリを同一チャンネルに流したい」などあれば、OrganizationレベルでWebhook情報を登録すれば良いかもしれません。
こちらも、サービス自体に機能は在りません(Slackは埋め込みで在る)し、yamlにも組み込み構文等は無いのですが、Orbs(CircleCIのプラグインのようなもの)に有志が作ったDiscord通知用のものが在ります。
上記のSource README
にある「書き方のサンプル」を元に、 ./.circleci/config.yml
に discord/status
記述を追加して下さい。
.circleci/config.yml
に
version: 2.1
orbs:
discord: antonioned/discord@0.1.0
jobs:
xxx:
steps:
...
- discord/status:
fail_only: true
failure_message: "Triggered User: **${CIRCLE_USERNAME}**\\nBranch: **${CIRCLE_BRANCH}**\\n\\nCircleCI テストに失敗しました。 JOB: **$CIRCLE_JOB**"
webhook: "${DISCORD_WEBHOOK}"
のように書くと
のように通知されました。
ドキュメントの例は DISCORD_WEBHOOK
など「環境変数を使う例」で書かれているため、サンプルどおりそのまま実践するためには、CircleCIの環境変数も仕込む必要があります。
こちらも、チーム等で「複数のプロダクト」を担当しているのであれば OrganizationのContext を利用すると、「複数プロダクトで環境変数共有できる」ので、Discordの同一チャンネルのWebhookURLを共有できて便利かと思います。
Orbsを使うには、当該組織(Organization)のセキュリティ設定で「Orbsを使う」設定を行う必要があります。
詳しくはこの記事の Orbsのセキュリティ設定
の手順に従い確認してください。
久しぶりにCircleCIを見たら「githubからのソースcheckoutできなくなっていた」ので直しました。
ゲーム文化で、かつラフ〜な感じのDiscord、自分は好きなんですが「自動化の情報」がSlackより少ない気がしています。(特に日本語情報)
なので、応援する意味でも「仕込み方」を紹介できたらなと思い、記事にしました。
ま、何より「自分こそが困ってる」ですしねー。
「Webhookがあれば、自力で書きゃあなんでも出来る」のは解ってるのですが、できるだけ楽に、できるだけオフィシャルな手段で、実現したいのです。
「もっと公式推奨の手段があるよ」などの情報あれば、教えて下さい。