はじめに
- TravisCI(クラウドCI)とSaucelabs(テストクラウド)の連携プレーを実現するための手順を書いていきます
- 以下が備わっていると仮定して話を進めます
- Railsアプリ
- Railsアプリに対して行うcucumber+Selenium(+Capybaraなど)のテスト
- bundle exec cucumberでcucumberのテストを実行できる
- 以下はTravisCI上でCIを開始、SauceLabsを使ってテストクラウドでテストするまでの手順
TravisCIとSauceLabsを使うための下準備
アカウント登録
TravisCIの利用開始
- https://magnum.travis-ci.com
- Travisのサイトから手順通りに進めるだけ
- githubアカウントを取得していること
SauceLabsのアカウントを登録
- https://saucelabs.com
- メールが受信できるメールアドレスを取得しておくこと
.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上のフィルター検索でもビルド番号での絞り込み可能
参考にしたサイト
- http://qiita.com/oh_rusty_nail/items/8ed184db60571a75cce7
- http://blog.eiel.info/blog/2014/02/18/github-push-from-travis/
~ただの宣伝~
- 全国のSeleniumer必読
- Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください