quattro_4's diary

また同じ過ちを繰り返すと気付かんのか!?

自分専用のCIを使ってRailsの開発効率を上げる

テストをわざと壊して効率的に開発する - quattro_4's diary
の記事に書いた内容に関連して、最近自分専用のCI的なものを欲しいと思っていた

幾つかの手軽な方法として思い浮かんだのは

  • Travis CIを使う
  • 自分専用のCIをMac miniなど別のマシンで構築

Travis CIについては、会社で有料プランの2 Concurrent jobsで動いていて、現状運用としては十分なレベル
一つレガシーなプロジェクトが1時間くらいかかるものがあって、それが更新されると2つのjobsを占有して待ちが生じて多少効率悪いことがある
3 Concurrent jobsのプランがあればぜひ利用したいが、次のプランは5 Concurrent jobsでそこまでは必要ない

プランを上げても起こるデメリットとしては、テストを壊す目的で使うブランチがTravis CI上やgitレポジトリ上で他の人にとってノイズになる
Concurrencyが増えても、レガシープロジェクトにブロックされる可能性は残るなどがある

自分専用のCIをMac miniなど別のマシンで構築について
自分だけテスト専用のMac miniを置いておくというようなのは正直他の人から見たら少し変。
オフィス内で利用できるテスト専用端末を会社で導入というのも考えられる。
他の人も使ったらどうかという話になる。その端末のメンテも結局は必要。とか結局いろいろ面倒になりそう。
マシンの初期費用がかかるし、ベストとは言い切れない


最終的に落ち着いた方法は、自宅のiMacを利用する方法
最初はwemuxなどを使ってできないかと思ったが、リモートネットワーク経由で何かしないですむならその方が良いと思った
結果的にはかなりシンプルな方法になった

使うものは

Dropbox上に対象のプロジェクトを置く(コピーまたは、新規にチェックアウト)
pushを許可

cd ~/Dropbox/path/to/my_project
git config --add receive.denyCurrentBranch ignore

作業プロジェクト上からそのDropbox上のものへ参照

git remote add share ~/Dropbox/path/to/my_project

iMac上でjenkinsを動かして、ローカルのDropbox上のレポジトリをポーリングする
通常使う失敗時のEmailと合わせて、毎回失敗した内容を確認したいので「拡張Email通知」で「Always」を設定し、常時通知するようにする

あとは作業したブランチをDropbox上にpushするだけ

結果として、MacBook上で全テスト走らせるより多少早いフィードバックが得られるようになった(iMacは16Gのメモリがある)
後場合によってはjenkins上で早く結果の出るspecごと細分化・パイプラインまたは並列化してみる方法も考えられる
(models -> controllers -> features他)


一つつまづいた点としてはgitの"--bare --shared"などのオプションでレポジトリを使おうとしたけど、参照する側でなんかうまくいかなかったので諦めた
結果、なんらかのリスクがありそうな"receive.denyCurrentBranch"を使わざるを得なかった

SMTPで使っているGMailアカウントはメインのとは別の無くなってもそれほど困らないアカウント


今回のような方法に行き着いた流れとしては、別でMacBookの調子が悪かったのがあった
Macがkernel panicで予期せず再起動していたのを直した話 - quattro_4's diary

調子が悪くなったことで、最悪自宅のiMac上で開発できる状態に持っていくこと、wemuxなど試したことがヒントになった