2014年5月31日土曜日

[Chef]Berkshelfを利用したJenkinsクックブックを作成してserverspec+Kitchenでテストした話

このエントリーをはてなブックマークに追加 はてなブックマーク - [Chef]Berkshelfを利用したJenkinsクックブックを作成してserverspec+Kitchenでテストした話

最近、Chefの本も色々出てきたのでしっかり勉強しようと思い、クックブックを作成し、テストまでするようにしてみたのでその時のメモです。

作ったもの

  • Jenkinsをインストールするクックブック
  • 最新版をインストールする為にaptやyumリポジトリの追加もする
  • Javaのインストールもする

作成したものはGithubに登録してあります。 後述の通り、CentOS6.4とUbuntu12.04でテストしております。 利用はご自由にどうぞ。

toshihirock/jenkins

また、タイトルにも記載の通り、テストはserverspecとVagrantドライバを利用したkitchenで実施するようにしました。

環境

ChefやBerkshelfはインストール済みの状態で確認しました。

$gem list --local |grep -e chef -e knife -e berkshelf 
berkshelf (3.1.2)
berkshelf-api-client (1.2.0)
chef (11.12.4)
chef-zero (2.1.4)
knife-solo (0.4.1)

ホストマシンはMacでVagrantもインストール済みです。

インストールがまだの場合、ChefDKでのインストールが楽でおすすめです。

環境の話は以前詳しいものを書いたので良ければ参照下さい。

Berkshelf version3+Knife soloでnginx環境をVagrantに作ってみた話

準備する

以下のコマンドでクックブックのひながたを作成します。

$kinife cookbook create jenkins -o .

Berkshelfの為のファイルを作成します。

$cd jenkins
$berks init .
      create  Berksfile
      create  Thorfile
      create  chefignore
      create  .gitignore
         run  git init from "."
      create  Gemfile
      create  .kitchen.yml
      append  Thorfile
      create  test/integration/default
      append  .gitignore
      append  .gitignore
      append  Gemfile
      append  Gemfile
You must run `bundle install' to fetch any new gems.
      create  Vagrantfile
Successfully initialized

今回のテストで利用するserverspecについてもインストールするようにGemfileを変更します。

source 'https://rubygems.org'

gem 'berkshelf'
gem 'serverspec'
gem 'test-kitchen', '~>1.2.0'
gem 'kitchen-vagrant', :group => :integration

Gemfileに記載したものをインストールします。

$bunle install

Berkshlefの利用

今回Jenkinsをインストールに当たり、以下のサードパーティのCookbookを使います。

上記を使う事をmetadata.rbに記載します。

name             'jenkins'
maintainer       'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures jenkins'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'

depends "java"
depends "apt"
depends "yum"

上記記載後、予め対象のクックブックをインストールします。

$berks install

上記によって、~/.berkshelf/cookbooks/配下にcookbookが格納されます。

今回はmetadata.rbに利用するクックブックを記載しましたが、Berksfileへの追記でも指定が可能です。こちらでは指定したGitのURLからダウンロードする事もでき、Opscodeなどに登録されていないサードパーティのクックブックの利用も可能です。

レシピを書く

以下のようなレシピをrecipes/default.rbに記載しました。

# install java
case node['platform']
when 'ubuntu'
  execute "apt-get update" do
    command "apt-get update"
  end
end
include_recipe 'java'

# add package control
case node['platform']
when 'ubuntu'
  apt_repository 'jenkins' do
    uri node['jenkins']['apt_uri']
    key node['jenkins']['apt_key']
    action :add
  end
when 'centos'
  yum_repository 'jenkins.repo' do
    baseurl node['jenkins']['yum_baseurl']
    description 'jenkins'
    gpgkey node['jenkins']['yum_gpgkey']
    action :create
  end
end

# install jenkins
package 'jenkins'

# start jenkins
service 'jenkins' do
  action [ :enable, :start ]
end

# move to jennkins setting file
cookbook_file 'jenkins' do
  case node['platform']
  when 'ubuntu'
    path node['jenkins']['ubuntu_setting_path']
  else
    path node['jenkins']['centos_setting_path']
  end
  action :create
  notifies :reload, 'service[jenkins]'
end

上記レシピでは以下を実施しています。

  • Javaをインストール
  • apt,yumのリポジトリにJenkinsを追加
  • Jenkinsのインストール
  • Jenkinsの起動
  • Jenkinsの設定ファイルの変更(Gitの文字化けをしないように文字コードをUTF–8にする設定ファイルに変更)
  • 設定ファイル変更後、Jenkinsの再起動

次に設定値をattributeに記載します。 attributesフォルダ配下にdefault.rbを作成し、記述します。

$vi attributes/default.rb

編集します。

# java
default['java']['jdk_version'] = '7'

# jenkins
default['jenkins']['apt_uri'] = 'http://pkg.jenkins-ci.org/debian binary/'
default['jenkins']['apt_key'] = 'http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key'
default['jenkins']['yum_baseurl'] = 'http://pkg.jenkins-ci.org/redhat'
default['jenkins']['yum_gpgkey'] = 'http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key'
default['jenkins']['ubuntu_setting_path'] = '/etc/default/jenkins'
default['jenkins']['centos'] = '/etc/sysconfig/jenkins'

Jenkinsの設定ファイルの上書きを行う為に、予め利用したい設定ファイルを配置します。 確認した所、centosとubuntuでは利用する設定ファイルが違うみたいなので、filesフォルダ配下にそれぞれのプラットフォーム名のフォルダを作成し、利用したいファイルを配置します。 利用するJenkinsの設定ファイルは各プラットフォームにJenkinsをインストールし、設定ファイルをコピーしておき、編集して配置しました。

$mkdir files/centos
$mkdir files/ubuntu
$cp foo/bar/jenkins files/centos/
$cp hoge/fuga/jenkins files/ubuntu/

なお、filesフォルダの詳細は以下を確認ください。

About Files

テストを書く

レシピの準備はできたのでテストを書きます。 以下のコマンドで必要なファイルを作成します。

$bundle exec kitchen init

.kitchen.ymlが作成されるので中身を確認します。

---
driver:
  name: vagrant

provisioner:
  name: chef_solo

platforms:
  - name: ubuntu-12.04
  - name: centos-6.4

suites:
  - name: default
    run_list:
      - recipe[jenkins::default]
    attributes:

今回、テスト環境としてVagrantを利用し、テスト対象のOSもUbuntuとCentOSのため、このままとしますが、テスト対象などを変更する場合にはこのファイルを編集する必要があります。

今回のテストはserverspecを利用する為、そのフォルダを作成します。

$mkdir -p test/integration/default/serverspec/localhost/

次にテストファイルを作成し、編集します。

$vi test/integration/default/serverspec/localhost/default_spec.rb

編集します。

require 'serverspec'
include Serverspec::Helper::Exec
include Serverspec::Helper::DetectOS

describe command('java -version') do
  it { should return_stdout /.*1.7/}
end

describe package('jenkins') do
    it { should be_installed }
end

describe service('jenkins') do
  it { should be_enabled }
  it { should be_running }
end

以下を確認するテストとしました。

  • インストールされたJavaのバージョンは1.7であること
  • Jenkinsがインストールされていること
  • Jenkinsのサービスが起動しており、かつOS起動時にサービスが起動する設定となっていること

準備ができたのでテストを実行します。

$bundle exec kitchen test

実行するとVagrantを利用してテストが実行されます。 なお、 テスト環境となるOSのイメージが存在しない場合(今回の場合にはCentOS6.4とUbuntu12.04)にはそのダウンロードが必要となり、かなり時間が掛かります。

テストやクックブックの適用に失敗するとエラー内容が出力されます。 その場合、再度bundle exec kitchen testとするとOSの再起動から始まるため、単純に適用だけの操作は以下で可能となります。

$bundle exec kitchen verify default-ubuntu-1204

0 件のコメント:

コメントを投稿