drone.ioを使ってテストする (Redmine Plugin編)

[前回](http://qiita.com/akiko-pusu/items/dff76fb64a5dfb934a53)、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 で実行します。

以下、ビルドスクリプトになります。


```source:bash
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-banner.png](https://qiita-image-store.s3.amazonaws.com/0/27976/72e5fa6d-4727-69ab-7526-4c7742cf2dc6.png "drone-banner.png")

## 実行結果

drone.ioは、更新のあった全てのブランチを取り出して、都度ビルドを実施します。
はずかしながら、こんな感じです。

![drone-build.png](https://qiita-image-store.s3.amazonaws.com/0/27976/7e44a1da-c3b5-d845-edca-86e3968ece92.png "drone-build.png")

## 今回のdrone.io上のプロジェクト

こちらでプロジェクトの情報が参照できます。
ビルド履歴や簡単な設定も見えますので、参考になれば幸いです…。

* https://drone.io/github.com/akiko-pusu/redmine_banner

# メモ／制限など

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、質問をしてみます。なにか回答をいただけたら追記します。