Railsアプリケーションで、アプリ本体と管理画面を別リポジトリで管理しつつmigrationは共通(同じDBを参照する)という形で開発しているのだけど、管理画面側にmigrationが存在しないため、CircleCIのテストが実行できなくて困っていた。
migrationだけをsubmodule化する手もあるが、それもめんどくさいので、CircleCIの設定で何とかしたい。
CircleCIはcircle.ymlというファイルに記述することでビルド時に任意のコマンドを実行でき、migrationもこのファイルから実行している。
そこで、アプリ側のリポジトリをtmp以下にcloneしてmigrationだけコピーするという原始的な手段をとってみた。
(Thanks to Kakakakakku)
まず、github上でトークンを生成する。
上記のページからGenerate new tokenを選べばOK。名前は適当に。
そしてCircleCIのProject Settings -> Environment variablesで環境変数を追加する。
NameはGITHUB_TOKENとして、Valueに生成されたトークンを入れる。
これでテスト内部からトークンが参照できるようになるので、circle.ymlを以下のように設定すれば完了。
circle.yml
database:
override:
- mv config/circle/database.yml config/database.yml
- git clone "https://${GITHUB_TOKEN}:x-oauth-basic@github.com/nysalor/hoge.git" tmp/hoge
- cp tmp/hoge/db/migrate/*.rb db/migrate
- bundle exec rake db:create db:migrate db:seed --trace
もちろんcircle.ymlに直接トークンを書いてしまっても良いのだけれど、うっかり公開すると死ぬので環境変数経由が良いと思う。