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

# はじめに
* 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/ブラウザを組み替えてください

```rb: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内で日本時間に変更する設定書いてみました

```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必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください