ようへいの日々精進XP

よかろうもん

Jenkins と ChefSpec で cookbook の CI 環境を構築してみようと思った一部始終(1)

注意

要件

  • chefspec でのテストを自動化してみよう
  • せっかくだから Jenkins と github を絡めて使ってみよう

設計

理想

以下のようなワークフローでやれれば嬉しいなあ。

1. 手元の環境で cookbook を作成する
2. 手元の環境から github に push する
3. push されたことを Jenkins に github から通知(こんな事が出来るんかい...)
4. Jenkins サーバーから最新の cookbook を pull してきて chefspec を使ってテスト
5. テスト結果を受けて cookbook を node に適用する

環境(登場人物)

  • Workstation(cookbook を作成する環境)
  • github
  • Jenkins サーバー(chefspec もインストール)
    • github からの push 通知を受ける為に github からアクセスが必要なので Amazon Linux を使う

手順

jenkins 環境の構築

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum -y install java-1.6.0-openjdk
sudo yum -y install jenkins

jenkins と github との連携

plugin のインストール(以下をインストール)
  • GitHub API Plugin
  • Jenkins GIT client plugin
  • Jenkins GIT plugin
jenkins ユーザーにて公開鍵の作成
cd /var/lib/jenkins
sudo -u jenkins mkdir .ssh
sudo -u jenkins chmod 700 .ssh
sudo -u jenkins -H ssh-keygen -t rsa -C jenkins@yourdomain
jenkins ユーザーの公開鍵を github に登録
  • 上記で作成した鍵を github に登録する

EC2 の SecurityGroup の設定

github からの push 通知を受ける為に必要な IP アドレスの開放が必要な為、AWS コンソールの SecurityGroup に以下の赤枠内の IP からのアクセスを許可する設定を行う。

f:id:inokara:20130507004900p:plain

連携が出来ない場合等は /var/log/jenkins/jenkins.log 辺りを確認する。

chefspec のインストール

gem install chefspec --no-ri --no-rdoc

chef までインストールやってくれた。

テスト用の job 作成と実際にビルドしてみる

Jenkins にテスト用の job を作成
cd /var/lib/jenkins/workspace/${job_name}
/usr/bin/rspec -fd --color ${cookbook}

※ cookbook を githubリポジトリ名にしていて、且つ、jenkins の job_name を cookbook 名にしてしまった場合には下記のようになるので注意する。

cd /var/lib/jenkins/workspace/
/usr/bin/rspec -fd --color ${cookbook}

結論、Jenkins のジョブ名は cookbook の名前と同じにしない方が良いと思う。

  • github 側の WebHook URL に登録
    • [ビルドの実行] URL を WebHook URL に設定する

f:id:inokara:20130507020822p:plain

テスト実行
  • Workstation にて cookbook のレシピを修正

f:id:inokara:20130507014109p:plain

  • git push

f:id:inokara:20130507014118p:plain

  • Jenkins が push 通知を受け、ビルドが実行される

f:id:inokara:20130507014137p:plain

  • テスト完了

f:id:inokara:20130507014540p:plain

まとめ

  • 現状は 1 job = 1 リポジトリになっているのでビルドの際に cookbook を指定しなければいけない...
  • 1 job = 1 cookbook で運用出来ないか検討
  • 「こんなことやりたい」と思ったことをやってみたら何となく出来た感じなので、もうちょっと詳細に詰めていきたい
  • Jenkins と github の連携が比較的簡単に行えたのは先人たちの努力の賜物...感謝!