前回の記事ではcircleciを利用してdocker imageをbuildし、alibaba cloudのACRにpushするまでやりました。
CIの結果は、CircleCIのダッシュボードから確認する必要があります。コミットの度に発火するCIの結果を、都度確認しに行くのはちょっと面倒です。
本記事では、CircleCIのテスト結果をSlackに通知する方法について解説します。
Slack Integrationsの設定手順
ちなみに以前からCircleCIを利用されている方は、このSlackアプリとWebhookを利用して連携を行っていたかもしれません。ですが現在では、この方法は推奨されておらず、本エントリーで紹介するOrbを使う必要があるようです。
以下にて手順を解説します。なお具体的な手順はドキュメントにも詳しく記載されていますので、こちらも参照してください。
CircleCIからSlackへ通知を送るための手順:
- Slackワークスペースにアプリをインストールし、OAuthトークンを発行する
- 発行されたトークンをCircleCIのコンテキストに登録する
- CircleCIのワークフロー内に通知処理を実装する
1. Slackワークスペースにアプリをインストールし、OAuthトークンを発行する
-
まずSlackのYour Appsを開き、
Create an App
をクリックしてください。
-
アプリの名前と、インストールするワークスペースを決めます。ここでは名前を
CircleCI-notification
にする
-
画面を下へスクロールさせると、Scopesという項目の中にBot Token Scopesという項目があります。Add an OAuth Scopeをクリックして、アプリに必要な権限をつけましょう。CircleCIからの通知に必要な権限はchat:write、files:write、chat:write.publicの3つです。
2. 発行されたトークンをCircleCIのコンテキストに登録する
続いてCircleCIのワークフロー内から、先ほど発行されたトークンを利用できるようにします。これにはコンテキストと呼ばれる仕組みを利用するのが一般的です。
コンテキストは組織内の各プロジェクトで、環境変数を安全に共有できる仕組みです。
コンテキストはSlackのトークンだけでなく、AWSのアクセスキーやk8sのクレデンシャルなど、様々な機密情報を安全に保管するために利用できます。
またコンテキストへのアクセスは、GitHubのOrganization内に設けたTeamsごとに制限することができます。デフォルトでコンテキストは全員が読み取ることが可能なため、他プロジェクトのメンバーに見えてはならない情報は、アクセス制限をかけることも検討してください。
- CircleCIにログインし、
Organization Settings
→Contexts
を開いてCreate Context
をクリックします。
- コンテキストの名前を決めましょう。ここでは
slack_oauth_token
としました。Create Context
をクリックします。
- 先ほどのコンテキスト一覧画面に、作成したslack_oauth_tokenコンテキストが表示されますので、コンテキスト名をクリックしてください。
- 環境変数の登録画面に遷移します。Add Environment Variableをクリックします。
-
SLACK_ACCESS_TOKEN
とSLACK_DEFAULT_CHANNEL
という名前の環境変数を作成- SLACK_ACCESS_TOKEN : 先ほど発行されたトークンを入力
- SLACK_DEFAULT_CHANNEL:デフォルトで通知を行うチャンネルIDを入力
SLACK_DEFAULT_CHANNELは表示上のチャンネル名ではなく、チャンネルIDであることに注意してください。
Slackのデスクトップアプリを利用しているなら、該当のチャンネル名を右クリックしてリンクをコピーし、得られるURLの末尾にある文字列がチャンネルIDです)
3. CircleCIのワークフロー内に通知処理を実装する
CircleCI Orbは, パッケージ化されたビルドコマンド/パイプラインです。
プログラミング言語に例えるなら、外部ライブラリをインポートして関数を使えるようにする機能に該当します。Orbを使えば様々なジョブやコマンドを再利用できます。
本来であれば何行にも渡って記述していた処理を, ほんの数行で管理することができます.
AWS連携やSlack連携など, 需要が高いジョブは幸いCircleCI公式経由でリリースされています。
また今回のSlack通知のような、一般的な機能は公式にOrb化され公開されているため、自分で実装する必要がありません。
ここではOrbを利用することで、Slackに通知を行うslack/notifyというコマンドを利用可能にしています。
- 上記のOrbs Registryにアクセスし、slackを検索してください。
- 以下のページを参考にして、circleci上でconfig.ymlを編集
- slackのorbをtopレベルに追加
orbs: slack: circleci/slack@4.12.0
- 以下を既存の
step
に追加- slack/notify: event: pass template: basic_success_1
- context追加
ワークフロー内では、Slackのトークンを読み込むため、コンテキストにアクセスする設定を行っています。context: コンテキスト名を指定しておけば、該当ジョブ内では環境変数にコンテキストの内容が自動的に読み込まれます。なおワークフロー内に複数のジョブがある場合、それぞれのジョブは独立したコンテナ内で実行されるため、コンテキストを利用する必要があるすべてのジョブそれぞれに、contextの記述を追加する必要がある点に気をつけてください。workflows: say-hello-workflow: jobs: - build-docker-image: context: - acr - slack_oauth_token