TL;DR
- circleCIとslackの連携はOrbを利用する
- slack側ではオリジナルのアプリを作成する要領で構築する
- Pythonの単体テストの成功失敗有無の通知を行うconfigを記述した
- slackへのメッセージはBlock Kit Builderが使える
- 今回は面倒なのでtemplateをそのまま利用した
背景
- CI/CDツールを利用した経験が無いので何かしら導入してみたい。
- Jenkinsを導入するか悩んだが、そのうち触る機会がありそうなので今回はcircleCIを採用。
- githubと同じでslackにアプリがあるから紐づけるだけでいいだろうと思っていたが、どうやら主流なやり方では無いよう。
手順
基本的に公式に従う。
circleciサイト
ぼさっとしてるとハマったのでそこだけmemo。
circleCI側Contextに設定する値でミス
config.ymlは公式のものをまずは採用。
circleCIのContextに
SLACK_ACCESS_TOKEN
SLACK_DEFAULT_CHANNEL
を環境変数として設定する必要がある。
SLACK_ACCESS_TOKENはSlack側で生成したものをそのまま張り付ければよい。
SLACK_DEFAULT_CHANNELはslackのチャンネルのリンクの値を張ればよい
ここで取得したリンクをそのまま宛てるのではなく、このリンク中
https://example.slack.com/archives/C12ABCDE123 #<=C12ABCDE123の部分
C12ABCDE123の部分をSLACK_DEFAULT_CHANNELの値として設定する。
ここで間違うとinvalid_authとなる。
成功するとリクエストに成功した旨がcircleCI側からも確認できる。
単体テストを自動で行う
自分以外の人も今回プロジェクトに関わっているためレビューを簡素化したり、バグを手早く発見したりしたいので今回は自動テスト化を目指す。
作りたいもの
- masterにマージされたら、単体テストを実行。
- 成功したらコメントをチャンネルに流す
- 失敗した場合もチャンネルに流す
今回はpytestによるテストがpassしたか否かの通知を行ってもらう。
完成形
version: 2.1
orbs:
slack: circleci/slack@4.12.5
jobs:
build:
shell: /bin/bash
docker:
- image: "cimg/python:3.12.0"
steps:
- checkout # ~/project dir
- run:
name: install pytest
command: |
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
- run:
name: run unittest
command: |
source venv/bin/activate
cd backend
python -m pytest
- slack/notify:
template: basic_fail_1
event: fail
- slack/notify:
template: basic_success_1
event: pass
workflows:
unit_test:
jobs:
- build:
context: slack-secrets
補足
失敗成功による通知はslackのorbが用意してくれたものを利用する
この辺を読むとわかる。
https://circleci.com/developer/ja/orbs/orb/circleci/slack#usage-notify_on_fail_with_template
slackで送信するメッセージについて
今回は以下の通りに設定した。
event: fail
template: basic_fail_1
templateではなく、customを用いれば自由に設定できる。
今回は簡便なもので構わないため、templateを利用した。
ローカルcircleciで動作確認を実施
WSLを利用しているが、Dockerが利用できる環境であれば検証可能
https://circleci.com/docs/ja/local-cli/#alternative-installation-method
こちらを参照するとよい。
適当にローカルcircleciのコマンドを打つと一番初めは
「情報収集していいか?」と質問されるのでお好みで回答。
ローカルcircleCIで確認。
circleci local execute build #バージョンによってoptionの付け方が違うので公式サイト参照を推奨
dockerのimageをダウンロードするので、ネット帯域が細いとダウンロード時間が長すぎるために途中でコケるので注意。
無事に成功してればOK
pushしてテストが走るか確認
OK
今後の課題
- インフラを含めたデプロイ自動化
- フロントのデプロイ自動化