3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CircleCIでRailsのテスト結果をSlackに通知してみた

Last updated at Posted at 2021-03-19

概要

この度、仲間内でチームで自分たちのしているサークルのホームページを共同開発することになったのでcircleciのテスト結果をslackで表示させたいなと思い執筆することにしました。

流れ

  1. slackにプロジェクト用のワークスペースとチャンネルを開設
  2. slack api で通知用のAppを作成する
  3. CircleCI の環境変数を設定する
  4. CircleCI の設定ファイルを作成する

1. slackのワークスペース&チャンネル開設

まずは赤丸で囲まれている + ボタンより通知用のチャンネルを作成して下さい。
私の場合はカフェサークル用のプロジェクトなのでcafe-projectというチャンネル名にしてあります。
さらにciecleciのテスト結果を表示て着る用のチャンネルを作成しておきましょう。
公式だとciecleci-<name>とするのがよいみたいです。

image.png

2. slack api で 通知用のAppの作成

slack apiより通知用appを作成していきます。

まずはCreate New Appを選択します。

image.png

すると、app名とどのworkspaceに通知を送るか選択する画面が出てくるので名前を自分で適当に設定し、workspaceには1で作成したworkspace名を選択します。

image.png

次にappに権限を与える画面に移ります。左のサイドバーからOAuth & Permissionsという項目があるので選択してその中のScopusを以下の画面のように設定します。

image.png

その後OAuth & Permissionsの選択画面のまま移動せずにOAuth Tokens & Redirect URLsという項目の中のInstall to Workspaceをクリックします。

image.png

そうすると以下の画面のようにアクセストークンを取得することができるのでCopyをクリックして値を控えておきます。

image.png

3. CircleCI の環境変数を設定する

次にCircleCIの環境変数を設定していきます。
circleciホームページのリンクに飛びGo to Appより自分のプロジェクトを選択します。
その後、

Project Settings → Environment Variable → Add Environment Variable

と選択していきSLACK_ACCESS_TOKENSLACK_DEFAULT_CHANNELを設定します。

image.png

環境変数 キー
SLACK_ACCESS_TOKEN 取得したアクセストークン
SLACK_DEFAULT_CHANNEL 通知したいslackのチャンネルID

slackのチャンネルIDを取得するにはslackのチャンネルを左クリックしてCopy linkを選択します。
コピーされたリンクの最後の大文字の英単語と数字の組み合わせの部分がチャンネルIDです。

https://{ワークスペース}.slack.com/archives/{チャンネルID}

4. CircleCI の設定ファイルを作成する

[Rails] Rails6 × PostgresSQL × heroku × CircleCI の環境を0から作る方法の徹底解説!!7.CircleCIの設定で設定したciecleciのファイルをベースに編集していきます。
最終的には以下のようになりました。

イメージとしてはorbsにslackのイメージを加えて、rspecの最後にpassしたときとfailしたときに通知が行くように設定を書いているという形になります。

.circleci/config.yml
version: 2.1

orbs:
  heroku: circleci/heroku@1.2.5
+  slack: circleci/slack@4.1

jobs:
  test_backend:
    docker:
    # dockerイメージで使っているrubyバージョンと一致させる
      - image: circleci/ruby:2.6.5-stretch-node
        environment:
          RAILS_ENV: test
          DB_USER: root
          DB_HOST: 127.0.0.1
          DB_PASSWORD: ''
      - image: circleci/postgres:9.6.2-alpine
        environment:
          POSTGRES_USER: root
          POSTGRES_DB: circleci_testdb
          POSTGRES_HOST_AUTH_METHOD: trust # パスワードなし

    working_directory: ~/repo

    steps:
      - checkout

      # restore gem from cache
      - restore_cache:
          keys:
            - gem-cache-v1-{{ checksum "~/repo/Gemfile.lock" }}
            - gem-cache-v1-
          working_directory: ~/repo

      # gem install
      - run:
          command: |
            gem install bundler
            bundle config set path 'vendor/bundle'
            bundle install --jobs=4 --retry=3
          working_directory: ~/repo

      - save_cache:
          key: gem-cache-v1-{{ checksum "~/repo/Gemfile.lock" }}
          paths:
            - ~/repo/backend/vendor/bundle
          working_directory: ~/repo

      # Database setup
      - run:
          command: bundle exec rails db:create
          working_directory: ~/repo
      - run:
          command: bundle exec rails db:migrate
          working_directory: ~/repo
      - run:
          command: bundle exec rails db:seed
          working_directory: ~/repo

      - run:
          name: yarn Install
          command: yarn install

      - run:
          command: bundle exec bin/webpack
          working_directory: ~/repo

      - run:
          name: create directory to store test results
          command: mkdir /tmp/test-results
          working_directory: ~/repo

      # run tests
      - run:
          name: RSpec
          command: |
            bundle exec rspec --profile 10 \
                              --format RspecJunitFormatter \
                              --out test_results/rspec.xml \
                              --format progress \
                              $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
          working_directory: ~/repo

      # collect reports
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results
      - store_artifacts:
          path: /home/circleci/repo/tmp/screenshots

      # slack notify
+      - slack/notify:
+          event: fail
+          template: basic_fail_1
+      - slack/notify:
+          event: pass
+          template: success_tagged_deploy_1

  deploy:
    executor: heroku/default
    steps:
      - checkout
      - heroku/install
      - run:
          name: Storing previous commit
          command: |
            git rev-parse HEAD > ./commit.txt
      - heroku/install
      - setup_remote_docker:
          version: 18.06.0-ce
      - run:
          name: Pushing to heroku registry
          command: |
            heroku container:login
            heroku container:push web -a $HEROKU_APP_NAME
            heroku container:release web -a $HEROKU_APP_NAME
      - run:
          name: db  migration
          command: |
            heroku run rails db:migrate --app ${HEROKU_APP_NAME}

+      # slack notify
+      - slack/notify:
+          event: fail
+          template: basic_fail_1
+      - slack/notify:
+          event: pass
+          template: success_tagged_deploy_1



workflows:
  version: 2
  test:
    jobs:
      - test_backend:
          filters:
            branches:
              ignore: master
  deploy:
    jobs:
      - deploy:
          # masterブランチへのpushでのみ反応
          filters:
              branches:
                  only:
                  - master

テストが通っていることを確認したことを確認します。
image.png

その後、slackを確認しに行くと無事にslackにメッセージが送られてきているを確認することができます。
image.png

ここまでお疲れさまでした!

自分のプロジェクトにslackの通知を取り入れて見ては如何でしょうか?

参考文献

  1. slackの設定方法
    slack-orb SETUP

  2. slack orbsのコードの書き方
    circleci/slack@4.3.1

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?