Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

前回、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を使ってビルドする)

  • 今回のリポジトリ: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 で実行します。

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

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

実行結果

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

drone-build.png

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

akiko-pusu
コツコツと学習しながらのメモを書いています。Redmineのプラグイン開発に関連するものが多めです。記事にご興味を持っていただけたら嬉しいです!
https://daily-postit.hatenablog.com
crowdworks
21世紀の新しいワークスタイルを提供する日本最大級のクラウドソーシング「クラウドワークス」のエンジニアチームです!
https://crowdworks.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした