CircleCIでDangerを動かすためにOnly Build Pull Requestsの設定を調べてみた

Posted on
Circle CI
thumbnail

はじめに

巷にはDangerというPull Requestのチェックを自動化するツールがありまして、自分のプロジェクトにも導入してみたいなと考えています。ただ、このDangerをCircleCI上で実行するにはちょっとした問題があるようです。

CircleCIでDangerを使おうとして困ったこと

どんなところで困るかというと、まずCircleCIは通常、PRをオープンしたタイミングでbuildを走らせるようにはなっていません。
この時点で「あっ…」となるのですが、丁寧に説明しますと

  • コミットをGitHubにpushする
  • →CIが走る
  • →PRがまだないのでdangerは「PRがまだないよー」と終了してしまう
  • →その後PRをオープンしても、PRをオープンしたタイミングではbuildは走らない
  • →なので、もう一回GitHubにpushする or 手動でrebuildする必要がある(ここが面倒)
  • →今度はPRオープン済みの状態なのでDangerが動作する

というわけです。
できればPRをオープンしたタイミングでCIが走ってDangerにPRを自動チェックしてほしいものです。
回避策がないか調べてみると、公式でオススメしている方法がCircleCIの設定で‘Only build pull requests’を有効にするというものでした。

  # For setting up Circle CI, we recommend turning on "Only Build pull requests." in "Advanced Setting." Without this enabled,
  # it is _really_ tricky for Danger to know whether you are in a pull request or not, as the environment metadata
  # isn't reliable.

https://github.com/danger/danger/blob/1687f6d9d89b318900a488a8ea31cac78153e0e1/lib/danger/ci_source/circle.rb#L9-L11

しかしこの設定を有効にするとCircleCIの挙動はどうなるの?という疑問があったので実際に有効化して試してみました。

実際に試してみた

まず、Only build pull requestsをOnにすると、PRが存在しない状態だとgithubにpushしただけではCIが走らなくります。
下記のような感じでNOT RUNとなりCIは実行されません。PRをオープンする前にテストを走らせたい派としてはPRをオープンしないとCIが走らなくなるという変更はけっこう不便だなと感じました。

This is a image

次に先程pushしたブランチでPRをオープンしてみましょう。すると、今度はPRをオープンしたタイミングでCircleCIが走りました。Dangerも問題なくPRにコメントできています。
もちろん、PRをオープンした状態であれば、そのPRのブランチに追加でpushするたびにCIが走るようになります。

This is a image

まとめ

  • PRをオープンする前にCIを走らせる運用の場合は’Only build pull requests’だと都合が悪い。
  • PRをオープンした後にCIを走らせても問題ないよという運用であれば’Only build pull requests’をOnにする対応で問題ない。
  • 前者の運用を継続したい場合はWebHookを使ってLambdaか何かでWebAPI経由でCircleCIのbuildをキックするとかそんな感じでやるのが良いんでしょうか。近い内にやってみようと思います。