LoginSignup
17
18

More than 5 years have passed since last update.

ShippableでRailsアプリをCI&CD

Last updated at Posted at 2014-07-13

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_successafter_failure のどちらかを実行する。
    プロジェクトをデプロイする場合は、 after_success にデプロイコマンドを指定すればOK。
  10. 成果物をアーカイブするために、 before_archive セクションを実行する。
    Shippableは、./shippableフォルダに格納されたファイルが成果物としてダウンロードできるようになる。
  11. after_archive セクションを実行する

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

RailsアプリのCIについて

  1. 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
  1. Shippableで、テスト結果を集計できるように、以下のファイルを追加する。
lib/tasks/ci_reporter.rake
    if ENV['GENERATE_REPORTS'] == 'true'
        require 'ci/reporter/rake/rspec'
        task :spec => 'ci:setup:rspec'
    end
  1. 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
  1. Shippable.yml を編集して、テストが実行されるようにする
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 KeyDeployment keyを追加する。
  3. 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:

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18