itamaeプラグインを
本気でCIした #omotesandorb

sue445

2016/04/07 表参道.rb #10

自己紹介 sue445

自己紹介

  • 株式会社ドリコム 所属
  • サーバサイドを浅く広く
    • 最近のお仕事はプロビジョニング周り
    • itamae, Serverspec, vagrant(ギリギリRuby)
  • TDDおじさん
  • プリキュアおじさん

代表作

https://rubygems.org/profiles/sue445

rubygems

代表作

https://github.com/sue445

github

近況:最近送ったPullRequest

今期の嫁:まだ未定

http://www.toei-anim.co.jp/tv/precure/

本妻:キュアピース

キュアエンジニア

今期のプリキュアはRubyがテーマ

https://www.youtube.com/watch?v=pFHtPqx-lBU

Agenda

  • itamaeについて
  • itamaeプラグインについて
  • itamaeプラグインのテスト事情
  • itamaeプラグインをテストする
  • ビルドの並列実行
  • 小ネタ

三行まとめ

  • Vagrant
  • Wercker
  • DigitalOcean

itamaeについて

itamaeプラグインについて

レシピ(ミドルウェアのインストール手順など)をgemにしてRubygems.orgで公開することができる

Gemfile

gem "itamae-plugin-recipe-git_now"

recipe.rb

include_recipe "git_now"

git-now がインストールされる

sue445製itamaeプラグイン

itamaeプラグインのテスト事情

https://rubygems.org/search?utf8=%E2%9C%93&query=itamae-plugin

  • 47個中、テストを書いてるgemは18個
    • bundle gem 直後の expect(Itamae::Plugin::Recipe::Hoge::VERSION).not_to be nil しかないやつはノーカン
  • CIしてるgemは5個(全部自分のやつw)
    • 自分以外でCIしてるのが 1つだけ あったので計6つ(ユニットテスト)
    • bundle gem 直後の .travis.yml しかないやつはノーカン
  • itamaeプラグインのCIの知見を広めたいのが今回の主旨

CIされてることのメリット

  • 複数OSテストしたい時に動作確認が楽(開発者視点)
  • リポジトリのトップにTravis CIとかのバッジが貼ってあれば安心感がある(利用者視点)
    • 常にビルドされているという安心感
    • PR送った時にビルドの結果が出る安心感

wercker_badge travis_badge

itamaeプラグインをテストする手順

  1. ローカルでVagrant + VirtualBox環境構築
  2. 自分自身を適用するレシピと、それに対するテストを書く
  3. VirtualBox内でitamaeのレシピ&Serverspec実行
  4. CIでレシピ&Serverspec実行

LTだと尺が足らないので駆け足でいきます。(詳しい手順は後日ブログに書きます)

1. ローカルでVagrant + VirtualBox環境構築

からバイナリをインストール

2. 自分自身を適用するレシピと、それに対するテストを書く

install.rb

include_recipe "git_now"

git_now_spec.rb

describe file("#{node[:git_now][:prefix]}/bin/git-now") do
  it { should be_file }
  it { should be_executable }
end

Serrverspec だとインフラの構成をrspecでテストすることができる

3. VirtualBox内でitamaeのレシピ&Serverspec実行

itamae実行

itamae

3. VirtualBox内でitamaeのレシピ&Serverspec実行

Serverspec実行

spec

4. CIでレシピ&Serverspec実行

  • DigitalOcean
  • Wercker

を使う方法について紹介

DigitalOcean

  • 海外の格安VPS
  • 最低プランなら1時間で$0.007から使える
    • 1ドル113円なら0.79円
    • $10のクーポンコードもあるので1428時間は無料で使える
    • https://m.do.co/c/7978f6d6167e (チラチラッ
  • 全部SSDなので速い
  • ビルドする時だけインスタンスを立ち上げれば費用を抑えることができる

Wercker

  • CIサービス(Travis CICircle CI的なやつ)
  • 「ワーカー」と読むらしい
  • box(実行環境)やstep(実行コマンド)がプラグインとして提供されているのが特徴
    • 自分で作ったプラグインを Registory で自由に公開できる

https://github.com/sue445/wercker-box-rvm-vagrant-digitalocean

  • wercker-box-rvm-vagrant-aws をforkしてrvmとvagrantとvagrant-digitaloceanプラグインをインストール済のboxを作った

wercker.yml

box: sue445/rvm-vagrant-digitalocean@1.0.0

CI設定

wercker.yml

build:
    steps:
        - script:
            name: test centos70
            code: ./ci/build.sh centos70

        - script:
            name: test debian8
            code: ./ci/build.sh debian8

build.sh

#!/bin/bash -xe

readonly HOST=$1

vagrant up $HOST --provider=digital_ocean
bundle exec rake itamae:$HOST
bundle exec rake spec:$HOST
vagrant destroy -f $HOST

ビルドの並列実行

直列実行だと遅い(2つ合わせて5分くらいかかる)ので並列実行できるようにした

Paraduct

  • Paraduct (parallel + parameterize + product)
  • .travis.ymlみたいな感じにいい感じにマトリックステストをするためのgem
  • 2年前に作ったgemなんだけどいろいろ書き直した
    • v0.0.3 -> v1.0.0 :muscle:

.paraduct.yml

script: |-
  ./ci/build.sh ${HOST}
after_script: |-
  vagrant destroy -f $HOST
variables:
  HOST:
    - debian8
    - centos70
max_threads: 4
  • この例だと ./ci/build.sh debian8./ci/build.sh centos70 が並列に実行される
  • after_script はビルドが失敗時しても必ず実行されるので確実にVMをdestroyしてくれる

capistranoみたいにホストごとに色がつくのが特徴

paraduct

https://app.wercker.com/#buildstep/56f46fa951d1ad950a01ad71

小ネタ

  • DigitalOceanのregionは当たり外れがある(気がする)
    • nyc1だとたまにVM起動後にsshが通らなくて固まることがあるけど、nyc3に変えたら起こらなくなった
    • ハマったら他のregionに変えてみるとよさげ
  • 不慮の事故でVMが残り続けるのを防ぐために古いVMを削除するスクリプトをheroku schedulerで動かしてる

参考文献

重要なことなので最後にもう一度

http://www.amazon.co.jp/registry/wishlist/3HH1FL88AQAG8/