November 26, 2018

CircleCIでdangerを動かすときのOnly Build Pull RequestsとDirty Hack

dangerは設定したリポジトリにPull Requestが作成された後に様々なcode reviewを行うgemです。

dangerはPlugin構造になっており、danger-mentiondanger-rubocopなどのpluginが作られています。トレタではtoreta-railsというメインAPIリポジトリでdangerを使ってbotに最低限のcode reviewを任せています。

このdangerをCircleCIで動かすときに少しハマるポイントがあります。

Pull Requestの作成とCircleCIのpushのタイミングが合わない

CircleCIはデフォルトの状態だとcommitをpushしたらすぐCIが起動します。dangerはCIの起動をフックにしてPull Requestを確認するため、以下のような現象が発生します。

  1. commitをpush
  2. CI起動
  3. danger起動
  4. Pull Requestが無いためdangerの実行がskipされる

この現象を回避するために、dangerではCircleCIのOnly build pull requestsを有効にすることを勧めています

Only build pull requestsの挙動

  • Pull Requestが存在しない状態だとgithubにpushしただけではCIが走らなくなる
  • Pull RequestをopenしたタイミングでCIが走る
  • Pull Requestをopenした状態であれば、そのPull Requestのbranchに追加でpushするたびにCIが走る

しかし、この設定を有効にするとDeploy Flowに影響を与えてしまいました。

トレタのDeploy Flow

  • developが開発用branch。developのcommitはdevelopにmergeされたらstaging環境にdeployされる。default branch。
  • masterが本番用branch。masterのcommitはmasterにmergeされたらproduction環境にdeployされる

default branchはOnly build pull requestsの影響を受けません。しかし、master branchはmergeしたらCIが起動して欲しいのにCIが起動しない状態になってしまいました。

CI起動用Pull Requestをopenし続ける

私はdangerを使ってcode reviewを自動化したかったのですが、既存のDeploy Flowは特に問題なかったため変えたくありませんでした。調べたところ、以下のようなhackで期待する挙動になりました。

masterから、masterから切った適当なbranchのPull Requestを作成します。このPull Requestをopenにし続けることで、Pull Requestをopenした状態であれば、そのPull Requestのbranchに追加でpushするたびにCIが走るという条件に当てはまり、developからmasterにmergeするときに無事にdeployできるようになりました。

© 2020 Masato Nakamura

Powered by Hugo & Kiss.