[Obsoleted] BuildHiveでrubyを利用

## 20151123 追記：BuildHiveについて

BuildHiveを紹介させていただいたこちらの記事ですが、2012年から利用させていただいていたサービスは、2015年11月にクロージングとなった模様です。

- Ref. [BuildHive](https://www.cloudbees.com/blog/buildhive) on 20151109 @ CloudBees Blog

フリーのCI環境のホスティングサービスとして、拙いコードながらもいろいろと勉強させていただくことができ、個人的には本当に感謝しきれません！
いずれにしても、この記事は古くなってしまいましたが、記録として残させていただきたいと思います。

以下から、元記事となります。

-----------------------------------

Jenkinsを使ってプロジェクトをビルドしたりテストしたりする場合で、オープンソースなものは、[BuildHive](https://buildhive.cloudbees.com/)というオープンソース向けのCI環境が利用できます。

このBuildHiveですが、rubyも利用できますので、ご紹介してみます。また、簡単なビルド（テスト）のサンプルとして、Redmineのプラグインのテストを素材にします。

## はじめに：BuildHiveってなに？

BuildHiveとは、CloudBees社が無償で提供しているクラウド上のCI環境です。

### Dev@Cloudとの違いは？

同社からはDev@Cloudというサービスもあり、こちらはCPUの一定の閾値までの利用なら無料で使えるのですが、もちろん枠を超えれば課金対象になります。（と言っても100時間なので結構十分！）

また、Dev@Cloudでは、自分専用のJenkinsが割り当てられます。プラグインの追加や一部には制限がありますが、ほぼ普通にJenkinsとして使えます。
また、その他のCloudBeesのサービスやリポジトリも利用できます。

BuildHiveには、いまのところ、この利用時間の制限はありませんが、『ビルド』することだけにフォーカスしているので、成果物の保存などの機能がありません。

また、1つの巨大なJenkinsに、自分を含めたたくさんの人のアカウントが作られ、プロジェクトも同じJenkinsの上で走ります。このため、ダッシュボード、ビルドの一覧には、ものすごい数のプロジェクトが列挙されています。
（処理自体は、スレーブが勝手に起動して、ビルドが終わったら消えて行く感じです）

### どんなふうにビルドするの？

ベースはJenkinsなのですが、極限まで機能を削ぎ落とした感じになっています。

* pom.xmlやbuild.xmlがあれば、それを勝手に認識してビルドします。
* 上記のファイルが無い場合は、Unknown Projectとして、いわゆるフリースタイルプロジェクトとして生成されます。この場合、プラグインは全く利用できないので、Shellでステップを記載する必要があります。
 * たとえば、rubyのプロジェクトであれば、自分のSandboxな環境に、必要なrubyをインストールするところから始まります…。

## やりたいこと / 確認したいこと

こんなことが目標です。

* BuildHiveにGitHub上のソースをチェックアウト。
* rubyをインストールする。
* rubyのプロジェクトとしてビルド。
* サンプルは、テストではなく[yardoc](http://yardoc.org)のファイル（ドキュメント）をビルドする形。
 * yardocの処理の指定にはRakefileを使う。

## BuildHiveの利用準備

* GitHubにアカウントを持っているのが原則。
 * 特に無駄な処理はなく、GitHubとの認証連携で、アカウントが作成され、ログイン可能に。
 * Dev@Cloudは複数選べる。

ソースコードの選択は、以下の手順。

* プロジェクト作成時には、自分がオーナーもしくはウォッチしているプロジェクトの一覧が出る。
* ビルドしたいソースを選ぶと、内容を勝手に判断し、Jenkinsのプロジェクトが作られる。
* プロジェクト名は、ソースコードのプロジェクト名と一緒。
 * 1つのソースコードから、ちょっとずつ違う複数のプロジェクトを作ることはできない。
 * ただし、シェルの中で自分でgit cloneする分には問題なし。

## 実践：rubyを使ってなにかする

### GitHubからソースの取得

ログインして、『プロジェクトの作成』を選ぶと…。

* GitHubの自分のアカウントに紐づいたソースの一覧が出る。
* ソースコードを見てプロジェクトのテンプレートが適用される。
* チェックアウトするブランチに指定がなかった場合は、どうやら一番最初のタグのついたブランチが取り出される模様…。（デフォルトでmaster、とはいかなかった。masterなら、明示が必要）


![buildhive-gh.png](https://qiita-image-store.s3.amazonaws.com/0/27976/5204d527-6045-9d31-fae1-62ec622ed577.png "buildhive-gh.png")

### ビルドタスクの設定

Rakefile, Gemfieがそろったrubyのソースなら **Bundler + Rake project** として認識され、勝手にrubyが入ってbundle install & デフォルトのrake taskが走るようです。

ただし、わたしの場合は、Gemfileが無いので **Unknown Project**として認識された模様。
その分、泥臭いのですが、自分でShellを書いてビルドステップを指定できました。

* Shell Scriptを記載できる欄は一個だけ。
 * 普通のJenkinsのように、複数のステップに分けての記載ができない。
* 上記のように、masterならmasterと指定した方がベター。
* 成果物の保存とか、パーマリンクは無し。
 * ワークスペースにあるものが成果物とは言えるが、スレーブが必要に応じて接続してビルドするため、処理が終わりスレーブが分断されるとワークスペースが空になる！

![buildhive-sample.png](https://qiita-image-store.s3.amazonaws.com/0/27976/fcffa62d-9e66-362c-403b-6568d743ced5.png "buildhive-sample.png")


### rubyをインストールする方法

CloudBeesで提供している、専用のRubyのセットアップスクリプトを使います。

See: [Ruby Builds on CloudBees Developer Resources](http://wiki.cloudbees.com/bin/view/DEV/Ruby+Builds)

```source:bash
curl -s -o use-ruby https://repository-cloudbees.forge.cloudbees.com/distributions/ci-addons/ruby/use-ruby

# 使いたいrubyのバージョンを指定し、シェルを実行
RUBY_VERSION=2.1.0 . ./use-ruby

# 入ったらバージョンを表示させて確認
ruby -v

```

今回はruby2.1.0を指定してみたのですが、下記のリリースが入り、問題なくインストールできました。

```
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]
```

### 実験：yardocでドキュメントファイルをビルドさせてみる

rubyが入ったので、ソースのファイルを元に、yardocでのドキュメントを生成させてみます。
こんなRakefileを用意しました。

```source:ruby
require 'rake'
require 'rake/testtask'
require 'yard'

YARD::Rake::YardocTask.new(:yardoc) do |t|
  files = ['lib/**/*.rb', 'app/**/*.rb'] #exclude test file
  t.files = files
  t.options += ['--output-dir', './doc']
end
```

ビルド用のスクリプトは、こんな感じ。
yardをインストールしてから、rake yardocを実施。

```source:bash
curl -s -o use-ruby https://repository-cloudbees.forge.cloudbees.com/distributions/ci-addons/ruby/use-ruby
#RUBY_VERSION=1.9.3-p327 . ./use-ruby
RUBY_VERSION=2.1.0 . ./use-ruby
ruby -v
gem install bundler
gem install yard
rake yardoc
```

実行結果は、こちら。

![buildhive-yardoc.png](https://qiita-image-store.s3.amazonaws.com/0/27976/d023c6c3-77bb-8c28-15e8-b2e6e250c59e.png "buildhive-yardoc.png")

出来上がったドキュメントは、ワークスペースの doc フォルダ以下なので、確認してみます。

![buildhive-yardoc-result.png](https://qiita-image-store.s3.amazonaws.com/0/27976/ef3ce0e1-c433-3354-061b-6e3f25036640.png "buildhive-yardoc-result.png")

思ったようにできたようです :)

### 実験：Redmineのプラグインとしてテストしてみる

実は、対象のソースはRedmineのプラグインなので、単体では動きません。
また、テストもできません。

今回は、幸か不幸かUnknown Projectと認識されたので、Shellで頑張ってテストのための処理を書いてみました。試行錯誤しながらの、泥臭い処理でお恥ずかしいですが、掲載してみます。

* 本来は、自分のソースがワークスペースの直下に展開される。
* これではRedmineのセットアップとテストができないので、自分で改めてRedmine本体のソースを撮って来て、準備を進める。

```source:bash

# rubyのインストール
curl -s -o use-ruby https://repository-cloudbees.forge.cloudbees.com/distributions/ci-addons/ruby/use-ruby
RUBY_VERSION=2.1.0 . ./use-ruby
ruby -v
uname -a

# bundle追加
gem install bundler

# Redmine本体のソースを取得
# 無理矢理 sqlite3のdatabase.ymlを作成
rm -fr redmine-2.4
hg clone --updaterev 2.4-stable https://bitbucket.org/redmine/redmine-all redmine-2.4
cat << HERE >> redmine-2.4/config/database.yml
test:
  adapter: sqlite3
  database: db/test.sqlite3
HERE

cd redmine-2.4
cd plugins

# ほんとはワークスペース直下にcloneされているんだけど、Redmine/plugins 以下に
# 置く必要があるので、再度git cloneする
git clone https://github.com/akiko-pusu/redmine_banner

# Redmine直下のGemfileに、simplecov用の設定を無理矢理追加
cd ../
gem install simplecov simplecov-rcov
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の準備完了 / テストに移る
cd plugins/redmine_banner

# テスト実施 & yardoc生成実施
bundle exec rake -t test
bundle exec rake yardoc
```

上記の実行結果ですが、テスト、yardoc生成も通りました。
テストのカバレッジレポートも出来ました。

※プラグインや成果物の保存が使えませんので、もちろん自分でワークスペースをたどって参照しないといけません。

![buildhive-coverage-result.png](https://qiita-image-store.s3.amazonaws.com/0/27976/2db86fcf-a817-7b3d-4ecb-e8db0140b9d8.png "buildhive-coverage-result.png")



## BuildHive利用時の注意点

以上、BuildHiveでrubyをつかったプロジェクトを作ってみたレポートです。
例はいつも通りRedmine関係のため、芸が無くて申し訳ありません…。

実際に使ってみての、注意点です。

* タイムゾーンがUTCになっています。JSTではないので、通知などはご注意を。
* とにかくシンプルにビルドする機能だけなので、プラグイン追加とかはできません。
* 必要な処理はMavenか、ひたすらシェルに書く必要があります。
* 履歴数の調整や、成果物の指定（保存）ができません。
* 1つのソースコードから、ちょっとずつ違う複数のプロジェクトを作ることはできません。
* プロジェクトに依存関係を持たせることができません。
* ビルドトリガはGitHub側の更新、もしくは手動での実行のみ。
* 基本はビルドの様子も、ソースコードもオープンになりますのでご注意！

逆に、こういういいこともあります。

* 開いているノードを割り当てるので、常に綺麗な環境と言えばその通り。
* ビルド結果が常に自分のアイコンと、プロジェクトへのリンクと一緒にトップページに晒されます。
 * 失敗すると恥ずかしいので、やる気がでます（？）

![buildhive-top.png](https://qiita-image-store.s3.amazonaws.com/0/27976/5ea969bf-6c3e-9ba7-df3e-391313a8f83f.png "buildhive-top.png")


今のところ、割当たっているOSは、Fedoraっぽいです。

## まとめ

今回作ったProjectは、こちらです。
消さない限りは誰でもアクセス可能ですが、放っておくとワークスペースがクリアされます…。

 * https://buildhive.cloudbees.com/job/akiko-pusu/job/redmine_banner/

CloudBeesのDev@Cloud, BuildHiveとも、もちろんJenkinsの作者の川口さんご自身が、Blogなどを書いていますし、基本的にはJenkinsなので、サービス自体は英語のみでも、みなさん問題なく使えるのではないでしょうか。

* 成果物の保存はできませんが、せっせとビルドするには向いてます。
* ビルドの結果を、ソースコードやサイトに埋め込むための専用のアイコンが提供されます。
 * このドキュメントへ埋め込んだサンプル: [![Build Status](https://buildhive.cloudbees.com/job/akiko-pusu/job/redmine_banner/badge/icon)](https://buildhive.cloudbees.com/job/akiko-pusu/job/redmine_banner/)
 * travis ciみたい？
* なにかしらGitHubにソースが無いと使えませんが、Unknown Projectのテンプレートが適用されれば、がんばってShellで処理が書けます。
* UIも楽しいし、いろんなビルドプロジェクトがあるんだというのを見るのも楽しいです。
* まさにJenkinsの機能（スレーブ使い倒し）を堪能している感じです。

なにかの参考になれば、幸いです:)