CircleCIのCI/CD結果をSlackに通知する

2024年05月20日

新たなプロジェクトを作るたびに検索しているので備忘録として残します。

2024年5月20日の情報であるため、古くなっている可能性があります。

CircleCIのSlackOrbのWikiを参照しています。

Home · CircleCI-Public/slack-orb Wiki: https://github.com/CircleCI-Public/slack-orb/wiki

Slackの設定

この設定は初回のみ行います。

https://api.slack.com/apps にアクセスして、From scratchでアプリを作ります。

generate slack app

権限を chat:write, chat:write.public, files:write を付与して、対象のWorkspaceに対してインストールします。

app scopes

インストールが完了したら、 OAuth Tokensをコピーします。

token

CircleCIの設定

Organization Settingsで Contextsを準備します。名前は判別しやすいように slack-secrets などのようにします。

CircleCI Context

作成したContext内で、アカウント(Organization)全体で使用するAccessTokenをセットします。このとき、名前は SLACK_ACCESS_TOKENにします。

また必要に応じて、送信する先のデフォルトのチャンネルIDも設定できます。 SLACK_DEFAULT_CHANNELで設定できます。チャンネルIDはSlackのデスクトップアプリからチャンネル名を右クリックし、「リンクをコピー」したテキストの末尾のパスの文字列をさします。

Context env

.circleci/config.yml の設定

全体を見通すと下記のようになります。RubyでのRSpecの実行やrubocopの実行も含まれています。

version: 2.1

orbs:
  ruby: circleci/ruby@2.1.2
  slack: circleci/slack@4.13.2

cop_steps: &cop_steps
  - checkout
  - ruby/install-deps
  - ruby/rubocop-check

spec_steps: &spec_steps
  - checkout
  - ruby/install-deps
  - run:
      name: run rspec
      command: bundle e rspec

slack_steps: &slack_steps
  - checkout
  - slack/notify:
      event: fail
      template: basic_fail_1
  - slack/notify:
      event: pass
      template: basic_success_1

jobs:
  ruby-spec:
    executor:
      name: ruby/default
      tag: "3.3"
    steps: *spec_steps
  cop:
    executor:
      name: ruby/default
      tag: "3.3"
    steps: *cop_steps
  slack:
    executor:
      name: ruby/default
      tag: "3.3"
    steps: *slack_steps

workflows:
  build:
    jobs:
      - ruby-spec
      - cop
      - slack:
          requires:
            - ruby-spec
            - cop
          context:
            - slack-secrets

Orbs

orbs:
  ruby: circleci/ruby@2.1.2
  slack: circleci/slack@4.13.2

Orbsを定義します。最新バージョンは CircleCIのOrbs詳細ページを確認してください。

CircleCI Developer Hub - circleci/slack: https://circleci.com/developer/ja/orbs/orb/circleci/slack

jobs

slack_steps: &slack_steps
  - checkout
  - slack/notify:
      event: fail
      template: basic_fail_1
  - slack/notify:
      event: pass
      template: basic_success_1

この例では切り出していますが、 jobs: 内でそのまま書いても同様に動作します。簡易的なテンプレートも使用できますが、SlackのBlockKitBuilderを使用してjsonを組み立てます。

https://app.slack.com/block-kit-builder

Workflows

workflows:
  build:
    jobs:
      - ruby-spec
      - cop
      - slack:
          requires:
            - ruby-spec
            - cop
          context:
            - slack-secrets

ここではRSpec、rubocopがパスしたらSlackに通知が行くようにしています(失敗したら通知がいかないので、そもそもymlを見直す必要がありますが一旦)。

SlackのJobを実行するときに上述したContextを読み込むようにします。

ここで実行しすべてがパスするとSlackに通知がいくようになります。

Slack Message
ProfilePicture

Yuta Goto

フリーランスのソフトウェアエンジニアです。現在はReact.jsを使用したWebフロントエンドの開発やRuby on Railsを使用したサーバサイドの開発を行っています。