テスト漏れを無くしたい!
ワークフロー単位でトリガーを
⾃由に設定したい要望
サイボウズ株式会社 ⽣産性向上チーム
平⽊場 ⾵太(@shitimi_613)
2020年8⽉5⽇(⽔) CircleCI コミュニティミートアップ
簡単なプロフィール
2020/08/05 2
平⽊場 ⾵太(Futa HIRAKOBA)
• 4⽉にサイボウズ新卒⼊社
• 6⽉末から⽣産性向上チームにJoin!
これまでの主な業務
• CI/CDパイプラインの整備
• dockerfile職⼈
• AWSリソースのゴミ掃除⾃動化
• ⿅児島に帰省したいけどコロナで帰れない...
• 対⾺にはよく⾏く(ゲーム)
• 最近はk8sの勉強やってる
Shitimi_613
korosuke613
2020/08/05 3
とつぶやいたら
3~4⽇前...
2020/08/05 4
まさかの公式さんから連絡が来て
いろいろあってLTすることになりました
3~4⽇前...
TL;DR
ワークフロー単位で
トリガーをPRに設定できるよう
になってほしい!
2020/08/05 5
背景
2020/08/05 6
Garoonという製品がある
2020/08/05 7https://garoon.cybozu.co.jp/
phpcsコマンドでコーディング規約を
チェックしてコメントするジョブ
Garoon開発のざっくりとした流れ
2020/08/05 8
コーディング 静的解析 テスト デリバリー
lint-php
lint-js
phan
...
phpcs
phpcs: https://github.com/squizlabs/PHP_CodeSniffer
QA
リリースなど
コーディング規約を継続的に確認している
phpcsジョブが
やってくれること
2020/08/05 9
1.GitHub APIを叩いて1、
マージ先ブランチ(base)と
マージ元ブランチ(compare)との差分を取得
2.差分3に対してphpcsコマンドを実⾏
3.GitHubのPull Requestにコメント
1. h$ps://developer.github.com/v3/media/#commits-commit-comparison-and-pull-requests
2. 差分に対して⾏う理由はすでに規約違反のコードが⼤量に存在するためです...
こんな感じでコメントしてくれる
2020/08/05 10
もしかしてこれpushじゃ
うまくいかないんじゃ...
2020/08/05 11
と思われた⽅もいると思います。
phpcsジョブを包含する
ワークフローを動かすには
プルリクエストが必要*
2020/08/05 12* 2つのcommitの⽐較もできるっちゃできる
CircleCIでプルリクエストを
ワークフローのトリガーとする
2020/08/05 131. https://circleci.com/docs/2.0/oss/#build-pull-requests-from-forked-repositories
2. ただし、デフォルトブランチだけは従来通りpushでワークフローが動く
プロジェクト単位で、プルリクエスト時にワー
クフローを動かす設定ができる1。
設定⽅法
Project Settings > Advanced > Only build pull requests
ただし、設定を有効にすると、pushでワークフ
ローが動かなくなる2。
Garoonはコミットでも
ワークフローを⾛らせたい
2020/08/05 14
CIRCLE_PULL_REQUEST環境変数で
PRかどうかを判断してる
2020/08/05 15https://circleci.com/docs/ja/2.0/env-vars/
CIRCLE_PULL_REQUEST: 関連付けられたプルリクエストのURLが格納される環境変数
• プルリクエストでないなら
circleci step halt
でジョブを途中で終了させる
• プルリクエストなら
ジョブを続⾏する
コーディング規約を継続的に確認
2020/08/05 16
PR作成
&
push
comment
PR
phpcsジョブ: PASSED or FAILED
コーディング規約を守れていない変更のマージを未然に防げる
プルリクエストがあるので
phpcsコマンドを実⾏できる
常にきれいなコード!
みんなハッピー!
2020/08/05 17
常にきれいなコード!
みんなハッピー!
2020/08/05 18
とはならなかった...
問題
2020/08/05 19
もしプルリクエスト作成後に
pushしなかったら...?
2020/08/05 20
PR作成後にpushした場合
2020/08/05 21
規約違反のコードをpush
comment
PR
プルリクエストがあるので
phpcsコマンドを実⾏できる
PR作成
phpcsジョブ: FAILED
push後にPRを作成した場合
2020/08/05 22
規約違反のコードをpush
プルリクエストがないので
phpcsコマンドを実⾏できない
PR作成
(ワークフローは実⾏されない)
phpcsジョブ: PASSED
ヨシ!
https://kumamine.blogspot.com/2019/12/blog-post_27.html
push後にPRを作成した場合
2020/08/05 23
規約違反のコードをpush
プルリクエストがないので
phpcsコマンドを実⾏できない
PR作成
(ワークフローは実⾏されない)
phpcsジョブ: PASSED
ヨシ!
https://kumamine.blogspot.com/2019/12/blog-post_27.html
良くない
もしこれがガチのテストだったら..
2020/08/05 24
バグを⾒過ごしてしまうかも...
テストしていないのに
あたかもテストが通過したと勘違いして
マージしてしまう
2020/08/05 25
運⽤でカバー(PRを先に作る or Re-Runする)
➡ヒューマンエラーは避けられないし、⾯倒
マージ先ブランチを特定して⽐較する
➡特定が⼤変1
GitHub Actionsを使ってPR作成時にワークフローを動かす
➡本末転倒感がある2
etc...
もちろん回避策はある
1. garoonはmasterブランチと呼べるものが複数個あるので...
2. しかも、GitHub Enterprise Serverではまだ使えない
ベストな⽅法は無い...
ワークフロー単位でトリガー
をPRに設定できればな〜〜
はるかに楽なのにな〜〜〜
2020/08/05 26
2020/08/05 27
• 今回はだいぶ狭いユースケースでしたが、CircleCIのコ
ミュニティでも多くの需要があるようです*。
• コード上(config.yml)で設定できるようになるのが個⼈
的な理想です。
ワークフロー単位で
トリガーにPRを設定できるよう
になってほしいです!!
* https://ideas.circleci.com/ideas/CCI-I-316
なので、
というわけで、
CircleCIのみなさん、
ご検討のほど
よろしくお願いします!!
🙇🙇🙇🙇🙇🙇🙇🙇
2020/08/05 28

テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望