Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

2020年8月5日(水) CircleCI コミュニティミートアップのLTで話した内容です
https://circleci.connpass.com/event/178558/

Futa HIRAKOBA

August 05, 2020
Tweet

More Decks by Futa HIRAKOBA

Other Decks in Technology

Transcript

  1. テスト漏れを無くしたい!
    ワークフロー単位でトリガーを
    ⾃由に設定したい要望
    サイボウズ株式会社 ⽣産性向上チーム
    平⽊場 ⾵太(@shitimi_613)
    2020年8⽉5⽇(⽔) CircleCI コミュニティミートアップ

    View Slide

  2. 簡単なプロフィール
    2020/08/05
    2
    平⽊場 ⾵太(Futa HIRAKOBA)
    • 4⽉にサイボウズ新卒⼊社
    • 6⽉末から⽣産性向上チームにJoin!
    これまでの主な業務
    • CI/CDパイプラインの整備
    • dockerfile職⼈
    • AWSリソースのゴミ掃除⾃動化
    • ⿅児島に帰省したいけどコロナで帰れない...
    • 対⾺にはよく⾏く(ゲーム)
    • 最近はk8sの勉強やってる
    Shitimi_613
    korosuke613

    View Slide

  3. 2020/08/05
    3
    とつぶやいたら
    3~4⽇前...

    View Slide

  4. 2020/08/05
    4
    まさかの公式さんから連絡が来て
    いろいろあってLTすることになりました
    3~4⽇前...

    View Slide

  5. TL;DR
    ワークフロー単位で
    トリガーをPRに設定できるよう
    になってほしい!
    2020/08/05
    5

    View Slide

  6. 背景
    2020/08/05
    6

    View Slide

  7. Garoonという製品がある
    2020/08/05
    7
    https://garoon.cybozu.co.jp/

    View Slide

  8. phpcsコマンドでコーディング規約を
    チェックしてコメントするジョブ
    Garoon開発のざっくりとした流れ
    2020/08/05
    8
    コーディング 静的解析 テスト デリバリー
    lint-php
    lint-js
    phan
    ...
    phpcs
    phpcs: https://github.com/squizlabs/PHP_CodeSniffer
    QA
    リリースなど
    コーディング規約を継続的に確認している

    View Slide

  9. 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. 差分に対して⾏う理由はすでに規約違反のコードが⼤量に存在するためです...

    View Slide

  10. こんな感じでコメントしてくれる
    2020/08/05
    10

    View Slide

  11. もしかしてこれpushじゃ
    うまくいかないんじゃ...
    2020/08/05
    11
    と思われた⽅もいると思います。

    View Slide

  12. phpcsジョブを包含する
    ワークフローを動かすには
    プルリクエストが必要*
    2020/08/05
    12
    * 2つのcommitの⽐較もできるっちゃできる

    View Slide

  13. CircleCIでプルリクエストを
    ワークフローのトリガーとする
    2020/08/05
    13
    1. 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。

    View Slide

  14. Garoonはコミットでも
    ワークフローを⾛らせたい
    2020/08/05
    14

    View Slide

  15. CIRCLE_PULL_REQUEST環境変数で
    PRかどうかを判断してる
    2020/08/05
    15
    https://circleci.com/docs/ja/2.0/env-vars/
    CIRCLE_PULL_REQUEST: 関連付けられたプルリクエストのURLが格納される環境変数
    • プルリクエストでないなら
    circleci step halt
    でジョブを途中で終了させる
    • プルリクエストなら
    ジョブを続⾏する

    View Slide

  16. コーディング規約を継続的に確認
    2020/08/05
    16
    PR作成

    push
    comment
    PR
    phpcsジョブ: PASSED or FAILED
    コーディング規約を守れていない変更のマージを未然に防げる
    プルリクエストがあるので
    phpcsコマンドを実⾏できる

    View Slide

  17. 常にきれいなコード!
    みんなハッピー!
    2020/08/05
    17

    View Slide

  18. 常にきれいなコード!
    みんなハッピー!
    2020/08/05
    18
    とはならなかった...

    View Slide

  19. 問題
    2020/08/05
    19

    View Slide

  20. もしプルリクエスト作成後に
    pushしなかったら...?
    2020/08/05
    20

    View Slide

  21. PR作成後にpushした場合
    2020/08/05
    21
    規約違反のコードをpush
    comment
    PR
    プルリクエストがあるので
    phpcsコマンドを実⾏できる
    PR作成
    phpcsジョブ: FAILED

    View Slide

  22. push後にPRを作成した場合
    2020/08/05
    22
    規約違反のコードをpush
    プルリクエストがないので
    phpcsコマンドを実⾏できない
    PR作成
    (ワークフローは実⾏されない)
    phpcsジョブ: PASSED
    ヨシ!
    https://kumamine.blogspot.com/2019/12/blog-post_27.html

    View Slide

  23. push後にPRを作成した場合
    2020/08/05
    23
    規約違反のコードをpush
    プルリクエストがないので
    phpcsコマンドを実⾏できない
    PR作成
    (ワークフローは実⾏されない)
    phpcsジョブ: PASSED
    ヨシ!
    https://kumamine.blogspot.com/2019/12/blog-post_27.html
    良くない

    View Slide

  24. もしこれがガチのテストだったら..
    2020/08/05
    24
    バグを⾒過ごしてしまうかも...
    テストしていないのに
    あたかもテストが通過したと勘違いして
    マージしてしまう

    View Slide

  25. 2020/08/05
    25
    運⽤でカバー(PRを先に作る or Re-Runする)
    ➡ヒューマンエラーは避けられないし、⾯倒
    マージ先ブランチを特定して⽐較する
    ➡特定が⼤変1
    GitHub Actionsを使ってPR作成時にワークフローを動かす
    ➡本末転倒感がある2
    etc...
    もちろん回避策はある
    1. garoonはmasterブランチと呼べるものが複数個あるので...
    2. しかも、GitHub Enterprise Serverではまだ使えない
    ベストな⽅法は無い...

    View Slide

  26. ワークフロー単位でトリガー
    をPRに設定できればな〜〜
    はるかに楽なのにな〜〜〜
    2020/08/05
    26

    View Slide

  27. 2020/08/05
    27
    • 今回はだいぶ狭いユースケースでしたが、CircleCIのコ
    ミュニティでも多くの需要があるようです*。
    • コード上(config.yml)で設定できるようになるのが個⼈
    的な理想です。
    ワークフロー単位で
    トリガーにPRを設定できるよう
    になってほしいです!!
    * https://ideas.circleci.com/ideas/CCI-I-316
    なので、

    View Slide

  28. というわけで、
    CircleCIのみなさん、
    ご検討のほど
    よろしくお願いします!!

    2020/08/05
    28

    View Slide