ShippableでRailsアプリをCI＆CD


## Shippableって何？
無料で使えるCIサービス！！(https://www.shippable.com/)  
Githubもしくは、BitBucketと連携してCI/CD(Continuous Integration/Deployment)できるサービス。
しかも、プライベートリポジトリでも無料で使える！！
BitBucket・Herokuと組み合わせることで、無料でCIして、デプロイできる。

__Shippableのバージョンアップに伴い、Herokuデプロイ部分のスクリプトを修正__

## 目的

BitBucketで管理しているRailsアプリをCIする。
更にプッシュされたリポジトリがmasterなら、自動的にHerokuへデプロイする。

## 手順

1. アカウントの作成  
BitBucketのアカウントか、Githubのアカウントでログインできる。
2. CIしたいリポジトリを選択し、「Enabled」にする  
3. 対象リポジトリの直下に、 `shippable.yml` を作成する。  
このファイルが、Shippableの設定ファイル。ローカルで編集してpushする。
4. railsアプリを編集して、CIできるようにする。
5. 「リポジトリにpush→自動テスト→Herokuにデプロイ」ができれば成功！！

## ビルドの流れ

1. minion(ビルド実行環境)にGitリポジトリをクローンする
2. ワークスペースに移動する
3. プロジェクトをチェックアウトする
4. 設定ファイルの `before_install` セクションを実行する。  
ここでは、minionの準備と、パッケージの更新を行う。
5. 設定ファイルの `install` セクションを実行する。  
ここでは、プロジェクト固有のライブラリや、パッケージのインストールを行う。
6. 設定ファイルの `before_script` セクションを実行する。  
ここでは、テストに必要なフォルダの作成や、DBのリストアを行う。
7. 設定ファイルの `script` セクションを実行して、ビルドとテストを実行する。
8. 設定ファイルの `after_script` セクションを実行する
9. scriptの実行結果に従って、 `after_success` か `after_failure` のどちらかを実行する。  
プロジェクトをデプロイする場合は、 `after_success` にデプロイコマンドを指定すればOK。
10. 成果物をアーカイブするために、 `before_archive` セクションを実行する。  
Shippableは、./shippableフォルダに格納されたファイルが成果物としてダウンロードできるようになる。
11. `after_archive` セクションを実行する

※ 必要な部分だけ作成すれば、OK！

## RailsアプリのCIについて
1. CI用にgemを追加する。  
今回は、rspecの実行と、カバレッジの取得を行いたいので、以下のgemを追加する  

 ```ruby:Gemfile
# for CI using Shippable
	group :test do
		gem 'spork-rails'
		gem 'rspec-rails'
		gem 'simplecov'
		gem 'simplecov-csv'
		gem 'ci_reporter'
	end
```

2. Shippableで、テスト結果を集計できるように、以下のファイルを追加する。  

 ```ruby:lib/tasks/ci_reporter.rake
	if ENV['GENERATE_REPORTS'] == 'true'
		require 'ci/reporter/rake/rspec'
		task :spec => 'ci:setup:rspec'
	end
```

3.  `spec_helper` を修正し、カバレッジを取得できるようにする。

 ```ruby:spec/spec_helper.rb
	def init_simplecov
		require 'simplecov'
		if ENV["COVERAGE_REPORTS"]
			# for Sippable
			require 'simplecov-csv'
			SimpleCov.formatter = SimpleCov::Formatter::CSVFormatter
			SimpleCov.coverage_dir(ENV["COVERAGE_REPORTS"])
		end
		SimpleCov.start 'rails'
	end
	Spork.prefork do
		・・・（省略）・・・
		unless ENV['DRB']
			init_simplecov
		end
	end
	Spork.each_run do
		# This code will be run each time you run your specs.
		if ENV['DRB']
			init_simplecov
		end
	end
```

4. `Shippable.yml` を編集して、テストが実行されるようにする

 ```ruby:shippable.yml
# 環境変数の定義
	env:
	  global:
	    - CI_REPORTS=shippable/testresults COVERAGE_REPORTS=shippable/codecoverage GENERATE_REPORTS=true
	# テストの実行
	script:
	  - rspec
```


## Herokuへのデプロイについて
1. Shippableで、 `Deployment key` を取得する。  
Settings -> Deployment key
2. HerokuのAccountページで、 `SSH Key` に `Deployment key`を追加する。
3.  `Shippable.yml` にデプロイ設定を追加する。
Shippableでは、 **常にmasterブランチとしてチェックアウトする**ので、Herokuにデプロイするときは、要注意！！
以下の用に条件分岐してあげれば、デプロイするブランチを制限できる！

 ```ruby:shippable.yml
	# 環境変数
	env:
	  global:
	    - APP_NAME=YOUR_APPLICATION_NAME  
	# ビルド・テスト成功時
	after_success:
	  # masterブランチのビルドに成功したら、Herokuにpush
	  # Shippableでは、常にmasterブランチとしてチェックアウトするため要注意。
	  # BitBucketのブランチ名は環境変数BRANCHに設定されているため、その値で判断する必要あり。
	  # if文は全て１行で記述しないと、デプロイに失敗する。
	  - if [ "$BRANCH" == "master" ] ; then git push git@heroku.com:$APP_NAME.git master ; fi
```

## 出来上がった設定ファイル
[マニュアル](http://docs.shippable.com/en/latest/config.html)を参考に頑張れば、OK!


```ruby:shippable.yml
# ビルド環境
build_environment: ubuntu1204

# 言語指定（必須）
language: ruby

# rubyのバージョン
rvm: 2.0.0

# gemfileの保存先
gemfile: Gemfile

# 環境変数の定義
env:
  global:
    - APP_NAME=YOUR_APPLICATION_NAME CI_REPORTS=shippable/testresults COVERAGE_REPORTS=shippable/codecoverage GENERATE_REPORTS=true

# ビルド結果の通知設定
notifications:
  email:
    - sample@example.com

# gemのインストール
install:
  - bundle install

# テストの準備。DBの作成・テスト結果出力フォルダの作成
before_script:
  - psql -c 'create database test_db;' -U postgres
  - bundle exec rake db:create
  - bundle exec rake db:schema:load
  - mkdir -p shippable/testresults

# テストの実行
script:
  - rspec

# ビルド・テスト成功時
after_success:
  # masterブランチのビルドに成功したら、Herokuにpush
  # Shippableでは、常にmasterブランチとしてチェックアウトするため要注意。
  # BitBucketのブランチ名は環境変数BRANCHに設定されているため、その値で判断する必要あり。
  - if [ "$BRANCH" == "master" ] ; then git push git@heroku.com:$APP_NAME.git master ; fi

```

## 参考サイト
[Githubのプライベートリポジトリ１つ無料のCIサービス「Shippable」を使ってみた - atskimura-memo:](http://atskimura.hatenablog.com/entry/2014/03/05/221357)