前回、drone.ioについて触れましたが、その続きです。
はじめに / drone.io について
- drone.io とは、Dockerをプラットフォームにした、CI環境を提供するサービスです。
- GitHub上にdrone.io (drone) のソースコードが提供されています。
- 各自でCI環境を構築することができます。
今回やること / やらないこと
-
やること
-
drone.io のサービスを利用して、Redmine用の自作プラグインのテストをします。
-
どんな設定にしてテストを通しているかを提示します。
-
テストコード、ソースコードに対してのツッコミはご勘弁を…
-
やらないこと
-
自分の環境にdroneをインストールすること。
-
Redmineのプラグインの書き方。
drone.ioでのセットアップ
ログイン&ビルドプロジェクトの作成
drone.ioはGitHubやBitbucketに連携しているため、どちらかのアカウントでログインが可能です。(両方にリポジトリを持っていても大丈夫です)
今回は、GitHub上のリポジトリを使います。リポジトリの指定、実行環境の指定までは、こちらもご参考に…。([drone.ioを使ってビルドする](http://qiita.com/akiko-pusu/items/
dff76fb64a5dfb934a53))
- 今回のリポジトリ:Redmine Banner Plugin
- 言語:Ruby2.0.0 (2.1系はまだ選択できませんでした)
ビルドの設定調整
Redmineのプラグインのテストには、Redmineが必要です…。このため、プラグインのソースに加えて、Redmineの本体コードもリポジトリから取得する必要があります。
おおまかな流れ
- プラグインのソースを取得(droneのプロジェクトのリポジトリとして紐づいているなら、コミットのたびに自動でcloneされてきます)
- Redmine本体のソースを取得(ビルドステップに追加しないとだめ)
- Redmineのbundle install実施
- DBのMigration (test用) を実施
- PluginのMigrationを実施
ここまでが準備段階です。ここまでやってから、実際のテストです。
- プラグインのテスト実施
プラグイン本体をテストするまでにいろいろ手順が必要なので、自動化したほうがいいですね。
DBの選択
基本はSQLite3でテストしているので、MySQL/PostgreSQLなどは設定していません。
わたしが選択したRuby2.0.0入りの環境(Dockerのイメージ) には、SQLiteが標準で入っているようなので、SQLite3を使います。
Environment Variables (環境変数)
ビルドのステップ(コマンド)記載には、環境変数が設定できます。
ここでは、Redmine本体のソースコードはリポジトリの2.5 (2.5-stable) を指すようにしています。また、プラグイン名を指定したコマンドが数回あるので、これも変数化しておきます。
REDMINE_VERSION=2.5
PLUGIN_NAME=redmine_issue_templates
Commands(ビルドの処理)
drone.ioの場合はビルドの手順はテキストエリアに記載になります。
選んだ言語によって、mvnとかrakeとか、処理が分かれますが、シェルで色々書けますので、結構なんでも有りだったりします。
ポイント
- database.yml はRedmineソース本体では定義されていないので、ビルドスクリプトの途中でconfig/database.ymlを作成しています。
- ここでDBにSQLite3を指定しています。
- Redmineのプラグインをテストする場合、RedmineのRakefileに定義がされているので、rake redmine:plugins:test RAILS_ENV=test で実行します。
以下、ビルドスクリプトになります。
cd ..
# Redmineの本体ソースがあったら削除
rm -fr redmine-2.*
hg clone --updaterev ${REDMINE_VERSION}-stable https://bitbucket.org/redmine/redmine-all redmine-${REDMINE_VERSION}
# database.ymlを作成します(SQLite利用)
cat << HERE >> redmine-${REDMINE_VERSION}/config/database.yml
test:
adapter: sqlite3
database: db/test.sqlite3
HERE
# 作業ディレクトリの一つ上の階層にいるので、drone.ioがcloneしたプラグインのソースを
# Redmine本体のplugins/ ディレクトリに異動させます
mv $PLUGIN_NAME redmine-${REDMINE_VERSION}/plugins
cd redmine-${REDMINE_VERSION}
# ここは追加なので無くても良い
gem install simplecov simplecov-rcov yard
cat << HERE >> Gemfile
gem 'minitest', '~> 4.7', :platforms => :ruby_19
gem "simplecov"
gem "simplecov-rcov"
HERE
# bundle install実施
bundle check || bundle install --path vendor/bundle --without mysql postgreql rmagick
# migration 実施
bundle exec rake db:migrate RAILS_ENV=test
bundle exec rake db:migrate_plugins RAILS_ENV=test
# ここまででRedmineの準備完了 / テストに移る
# Redmineプラグインのテストをしたい場合は、このコマンド
bundle exec rake redmine:plugins:test RAILS_ENV=test
cd plugins/$PLUGIN_NAME
pwd
# テスト実施 & yardoc生成実施
rake yardoc
ちなみに、オープンソース版では、.drone.yml という設定ファイルでビルドの手順を記載します。
スクリーンショット
settingsの画面は管理者かメンバーしか参照できないみたいなので、画面を載せておきます。
実行結果
drone.ioは、更新のあった全てのブランチを取り出して、都度ビルドを実施します。
はずかしながら、こんな感じです。
今回のdrone.io上のプロジェクト
こちらでプロジェクトの情報が参照できます。
ビルド履歴や簡単な設定も見えますので、参考になれば幸いです…。
メモ/制限など
drone.ioでのRubyは2.0.0までなので、たとえば2.1xで回したい場合はOSS版のdroneを各自の環境にセットアップし、Ruby2.1入りのdockerイメージを用意するような感じがいいでしょうか。
また、ビルドの時間は15分くらいが目安のようです。
- Ref. http://docs.drone.io/buildscript.html
- フリープランの場合はビルドの時間は15分。
- 成果物は10ファイルまで。(tarなどで固めたほうがいい)
- 成果物の保存サイズは10MBまで。
以上です。
サクッとテストするのに如何でしょう?
追記
20140705 Rubyバージョンを切り替えて実行したい場合
制限に関しての追記になります。
Redmineは今のところ1.8 - 2.1のrubyで動くので、バージョンを切り替えてテストしたいと思ったのですが、1リポジトリに対して1プロジェクトしか割り当てできない模様。
バージョンを切り替えてテストしたい場合は、リポジトリを分けるか、drone.io側のプロジェクト設定でrubyのバージョンを一時的に変更して、手動ビルド(テスト)する感じとなっています。
このあたりは、Feedback、質問をしてみます。なにか回答をいただけたら追記します。