TravisCIとSauceLabsを連携してテストクラウドでテストする

More than 3 years have passed since last update.


はじめに


  • TravisCI(クラウドCI)とSaucelabs(テストクラウド)の連携プレーを実現するための手順を書いていきます

  • 以下が備わっていると仮定して話を進めます


    • Railsアプリ

    • Railsアプリに対して行うcucumber+Selenium(+Capybaraなど)のテスト

    • bundle exec cucumberでcucumberのテストを実行できる



  • 以下はTravisCI上でCIを開始、SauceLabsを使ってテストクラウドでテストするまでの手順


TravisCIとSauceLabsを使うための下準備


アカウント登録


TravisCIの利用開始


SauceLabsのアカウントを登録


.travis.yml作成


  • ymlファイルにはいろんなことが書けます

  • なので、起動したRailsアプリに対してcucumberのテストを実行するまでの最低限必要なものを書きます


bundle install〜cucumber実行まで


  • addonsにSaucelabsに接続するための設定を記述する

  • bundle installは特に書かなければ自動で行われる


    • オプションなどを書く場合は以下のようにオーバーライドする




.travis.yml

language: ruby

addons:
sauce_connect:
username: "[ユーザ名]"
access_key: "[アクセスキー]"
install:
- bundle install [option]
before_script:
- bundle exec rake db:migrate
- bundle exec rake db:seed
script:
- bundle exec rails s -p 3000 -e development -d
- bundle exec cucumber


ssh経由のgit cloneをさせたい場合は以下をやる(任意)


  • .encファイル作成

$ ssh-keygen -f test-key

$ password=`cat /dev/urandom | head -c 10000 | openssl sha1`
$ openssl aes-256-cbc -k "$password" -in test-key -out test-key.enc -a
$ mkdir .travis
$ mv test-key.enc .travis/


  • .travis.ymlに追記

$ gem install travis

$ touch .travis.yml #Railsアプリ内で(app、configなどと同階層)
$ travis encrypt -r [ユーザ名]/[リポジトリ名] "SERVER_KEY='$password'" -a
$ cat .travis.yml #secureが追加されている
env:
global:
secure: abcdefghijklmn......


  • before installにsshの設定を追加

before_install:

- echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
- openssl aes-256-cbc -k "$SERVER_KEY" -in .travis/test-key.enc -d -a -out test-key
- cp test-key ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- eval `ssh-agent -s`
- ssh-add ~/.ssh/id_rsa


GemfileにsauceLabsで必要なgemを追加


  • 既にRailsアプリのためにGemfileに書いているものは省いてください


Gemfile

group :test, :development do

gem 'sauce', '~> 3.1.1'
gem 'sauce-connect'
gem 'parallel_tests'
gem "capybara", "~> 2.0.3"
gem "cucumber-rails", :require => false
gem "sauce-cucumber", :require => false
gem "execjs"
gem "therubyracer"
gem "database_cleaner"
end


sauce_helper.rbを配置


  • 必要に応じて実行するOS/ブラウザを組み替えてください


features/support/sauce_helper.rb

require "sauce"

require 'sauce/capybara'
require "sauce/cucumber"

Capybara.default_driver = :sauce

Sauce.config do |c|
c[:browsers] = [
["Windows 8", "Internet Explorer", "10"],
["Windows 7", "Firefox", "20"],
["OS X 10.8", "Safari", "6"],
["Linux", "Chrome", nil]
]
end



/etc/hostsを編集


  • ローカル起動したものに対してテストしようとすると名前解決ができず、400(Bad Request)が出たので自分の環境に合うように適宜いじってください


SauceLabsで実行したいテストにタグを付ける


  • SauceLabs上で実行したいテストには「@selenium」というタグを付ける必要があります

  • これ忘れがちですが、重要です!


おまけ


  • .travis.yml内で日本時間に変更する設定書いてみました


.travis.yml

before_script:

- sudo cp -p /etc/localtime /etc/localtime.bak
- sudo rm /etc/localtime
- sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime


実行


  • あとはgithubにpushしたら自動でTravisCIがビルドを始め、SauceLabsに対してテストを実行してくれる

  • SauceLabsにTravisCIのビルド番号がリンクしているため、どのビルドのテストか分かるようになっている


    • SauceLabs上のフィルター検索でもビルド番号での絞り込み可能





参考にしたサイト


~ただの宣伝~


  • 全国のSeleniumer必読

  • Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください