Shippableって何?
無料で使えるCIサービス!!(https://www.shippable.com/)
Githubもしくは、BitBucketと連携してCI/CD(Continuous Integration/Deployment)できるサービス。
しかも、プライベートリポジトリでも無料で使える!!
BitBucket・Herokuと組み合わせることで、無料でCIして、デプロイできる。
Shippableのバージョンアップに伴い、Herokuデプロイ部分のスクリプトを修正
目的
BitBucketで管理しているRailsアプリをCIする。
更にプッシュされたリポジトリがmasterなら、自動的にHerokuへデプロイする。
手順
- アカウントの作成
BitBucketのアカウントか、Githubのアカウントでログインできる。 - CIしたいリポジトリを選択し、「Enabled」にする
- 対象リポジトリの直下に、
shippable.yml
を作成する。
このファイルが、Shippableの設定ファイル。ローカルで編集してpushする。 - railsアプリを編集して、CIできるようにする。
- 「リポジトリにpush→自動テスト→Herokuにデプロイ」ができれば成功!!
ビルドの流れ
- minion(ビルド実行環境)にGitリポジトリをクローンする
- ワークスペースに移動する
- プロジェクトをチェックアウトする
- 設定ファイルの
before_install
セクションを実行する。
ここでは、minionの準備と、パッケージの更新を行う。 - 設定ファイルの
install
セクションを実行する。
ここでは、プロジェクト固有のライブラリや、パッケージのインストールを行う。 - 設定ファイルの
before_script
セクションを実行する。
ここでは、テストに必要なフォルダの作成や、DBのリストアを行う。 - 設定ファイルの
script
セクションを実行して、ビルドとテストを実行する。 - 設定ファイルの
after_script
セクションを実行する - scriptの実行結果に従って、
after_success
かafter_failure
のどちらかを実行する。
プロジェクトをデプロイする場合は、after_success
にデプロイコマンドを指定すればOK。 - 成果物をアーカイブするために、
before_archive
セクションを実行する。
Shippableは、./shippableフォルダに格納されたファイルが成果物としてダウンロードできるようになる。 -
after_archive
セクションを実行する
※ 必要な部分だけ作成すれば、OK!
RailsアプリのCIについて
- CI用にgemを追加する。
今回は、rspecの実行と、カバレッジの取得を行いたいので、以下のgemを追加する
Gemfile
# for CI using Shippable
group :test do
gem 'spork-rails'
gem 'rspec-rails'
gem 'simplecov'
gem 'simplecov-csv'
gem 'ci_reporter'
end
- Shippableで、テスト結果を集計できるように、以下のファイルを追加する。
lib/tasks/ci_reporter.rake
if ENV['GENERATE_REPORTS'] == 'true'
require 'ci/reporter/rake/rspec'
task :spec => 'ci:setup:rspec'
end
-
spec_helper
を修正し、カバレッジを取得できるようにする。
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
-
Shippable.yml
を編集して、テストが実行されるようにする
shippable.yml
# 環境変数の定義
env:
global:
- CI_REPORTS=shippable/testresults COVERAGE_REPORTS=shippable/codecoverage GENERATE_REPORTS=true
# テストの実行
script:
- rspec
Herokuへのデプロイについて
- Shippableで、
Deployment key
を取得する。
Settings -> Deployment key - HerokuのAccountページで、
SSH Key
にDeployment key
を追加する。 -
Shippable.yml
にデプロイ設定を追加する。
Shippableでは、 常にmasterブランチとしてチェックアウトするので、Herokuにデプロイするときは、要注意!!
以下の用に条件分岐してあげれば、デプロイするブランチを制限できる!
shippable.yml
# 環境変数
env:
global:
- APP_NAME=YOUR_APPLICATION_NAME
# ビルド・テスト成功時
after_success:
# masterブランチのビルドに成功したら、Herokuにpush
# Shippableでは、常にmasterブランチとしてチェックアウトするため要注意。
# BitBucketのブランチ名は環境変数BRANCHに設定されているため、その値で判断する必要あり。
# if文は全て1行で記述しないと、デプロイに失敗する。
- if [ "$BRANCH" == "master" ] ; then git push git@heroku.com:$APP_NAME.git master ; fi
出来上がった設定ファイル
マニュアルを参考に頑張れば、OK!
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のプライベートリポジトリ1つ無料のCIサービス「Shippable」を使ってみた - atskimura-memo: