こんにちは。エンジニアのTsujimotoです。弊社では、広告クリエイティブのクラウド収集サービス「アドクロール」をRuby on Railsで開発しています。 今回は、Bitbucket上で利用できるCI/CDツール「Bitbucket Pipelines」を用いて、RailsアプリのRSpecを自動実行する方法について紹介します。

Bitbucket Pipelinesとは?

Bitbucket Pipelinesとは、Bitbucket上で利用できるCI/CDツールであり、ビルド/テスト/デプロイなどを自動実行できます。Bitbucketを既に利用しているユーザであれば、リポジトリ内に設定ファイルを1つ置くだけで簡単に利用することができます。公式ドキュメントに従って設定を進めていきます。

bitbucket-pipelines.ymlを作成

Bitbucket Pipelinesでは、bitbucket-pipelines.ymlというファイルに設定を書いていきます。このファイルがリポジトリに置かれた状態でプッシュすると、その設定をもとにパイプラインが処理されるという仕組みになっています。

①対象のリポジトリの画面の左のメニューからPipelinesを選択するとPipelinesの設定画面が表示されます。②利用する言語を選択すると、③設定ファイルのテンプレートが表示されます。今回はRailsアプリのRSpecを実行したいので、Rubyを選択します。

設定する項目については、「bitbucket-pipelines.yml を設定する」に説明が書かれています。今回は次のような設定にします。

  
pipelines:
  default:
    - step:
        image: ruby:2.4.3
        caches:
          - bundler
        script:
          - cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
          - apt-get update
          - apt-get install -y curl unzip xvfb libxi6 libgconf-2-4
          - curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
          - echo "deb [arch=amd64]  http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
          - apt-get -y update
          - apt-get -y install google-chrome-stable
          - wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip
          - unzip chromedriver_linux64.zip
          - mv chromedriver /usr/bin/chromedriver
          - chown root:root /usr/bin/chromedriver
          - chmod +x /usr/bin/chromedriver
          - gem install bundler
          - bundle config git.allow_insecure true
          - bundle install --path vendor/bundle
          - bundle exec rails db:setup RAILS_ENV=test
          - bundle exec rake db:migrate RAILS_ENV=test
          - bundle exec rspec
        services:
          - db
definitions:
  caches:
    bundler: ./vendor
  services:
    db:
      image: mysql:5.7
      environment:
        MYSQL_DATABASE: sample_app_test
        MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
        MYSQL_USER: sample_app_test
        MYSQL_PASSWORD: password
    

DockerイメージはRuby 2.4.3の公式イメージを使っています。bundler関連の設定の前に、featureスペックを実行するためのchromedriverをインストールしています。

DB周りの設定は、Rails側の設定ファイル(config/database.yml)と合わせておきます。下記が今回のdatabase.ymlです。ホストが「127.0.0.1」ではなく「localhost」だったり、パスワードが空のユーザを使っていたりするとPipelines上でうまく繋がらない場合がありました。

  
test:
  <<: *default
  host: 127.0.0.1
  database: sample_app_test
  username: sample_app_test
  password: password
  

commitボタンをクリックすると、bitbucket-pipelines.ymlがmasterにコミットされ、初回実行が始まります。

パイプラインの実行

bitbucket-pipelines.ymlが置かれた状態でBitbucketにプッシュすると、自動でパイプラインが実行されます。プルリクの画面から手動で実行することも可能です。

リポジトリの左のメニューからPipelinesを選択すると、実行結果の一覧を見ることができます。ビルド結果のステータスや実行時間を一覧できます。

パイプラインを選択すると、その実行内容を見ることができます。設定ファイルに書いたコマンドが順に実行されているのがわかります。最後には、RSpecの実行結果が記載されています。

プルリクの一覧・詳細画面からも、ビルドのステータスを確認することができます。これで、テストが落ちているブランチを誤ってマージするのを防ぐことができますね。

終わりに

今回は、Bitbucket Pipelinesを用いて、RailsアプリのRSpecを自動実行する方法をご紹介しました。外部サービスや専用サーバを利用しなくても、お手軽にCI/CDを実践することができますね。

今後は、Railsを使わず素のRubyとActiveRecordで開発しているリポジトリでの設定方法や、Dockerイメージをカスタマイズすることでテスト時間を短縮する方法なども、紹介していければと思っています。

Pocket