旧ブログ

sambaiz.net に引っ越しました

chef soloで入れたjenkinsでserverspecを走らせる準備

前回の続き。 真っ新な状態から実行したら、jenkins-cli.jarを持ってくるところで

Connecting to localhost|127.0.0.1|:8080... failed: Connection refused.

で失敗するのと、 install-plugin gitするところでgit pluginが入らず、実際の端末で実行してみたら

git is neither a valid file, URL, nor a plugin artifact name in the update center
No update center data is retrieved yet from: http://updates.jenkins-ci.org/update-center.json
Git looks like a short plugin name. Did you mean ‘null’?

こんな感じのエラーが出てきたので、レシピを分けて以下のように修正

site-cookbooks/jenkins/recipes/plugin.rb

JENKINS_URL = "http://localhost:8080"

remote_file "/jenkins-cli.jar" do
  source "#{JENKINS_URL}/jnlpJars/jenkins-cli.jar"
end

execute "install-git-plugin" do
  user "root"
  command <<-_EOH_
    curl  -L http://updates.jenkins-ci.org/update-center.json | sed '1d;$d' | curl -X POST -H 'Accept: application/json' -d @- #{JENKINS_URL}/updateCenter/byId/default/postBack
    java -jar jenkins-cli.jar -s #{JENKINS_URL} install-plugin git -restart
  _EOH_
  action :run
end

nodes/chef_test.json

{"run_list":[
    "java",
    "jenkins",
    "git",
    "simple_iptables",
    "iptables",
    "vagrant",
    "jenkins::plugin"]}

ついでに、vagrantのrecipeにadd box centosするのを追加した。

execute "add-box-centos" do
  user "root"
  command "vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.5-x86_64-v20140110.box"
  action :run
  not_if { (/centos/ =~ `vagrant box list`) == 0 }
end

それで、本当はVagrantで立ち上げたCentOS(ゲスト)の中でJenkinsを動かして、 Jenkinsにその中でVagrantCentOS(ゲストのゲスト)立ち上げさせてserverspecのテストを走らせたかったんだけど、 仮想環境の中でVagrantを立ち上げられなかったので、ローカルの物理サーバ上で動かすことにした。

サーバの方にknife solo prepareknife solo cookで必要なものをいれたあとに、vagrant init centosvagrant up したら、以下のようなエラーが出て立ち上がらない。

VirtualBox is complaining that the kernel module is not loaded. Please
run `VBoxManage --version` or open the VirtualBox GUI to see the error
message which should contain instructions on how to fix this error.

指示通りに辿っていくと、kernel-develとgccをインストールする必要があるみたいなのでyum installしたあとに export KERN_DIRして/etc/init.d/vboxdrv setupを実行。これでvagrant upできるようになった。 これもchefでやる。

vagrant/recipes/default.rb

yum_package "gcc" do
  action :install
end

yum_package "kernel-devel" do
  action :install
  version "2.6.32-431.17.1.el6"
end

execute "vboxdrv-setup" do
  user "root"
  command <<-_EOH_ 
    export KERN_DIR=/usr/src/kernels/2.6.32-431.17.1.el6.x86_64 
    /etc/init.d/vboxdrv setup"
  _EOH_
  action :run
end

jenkinsからsudoを使うためにvisudoで編集する。visudoの一番下に

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

とあるので、chefでここに設定を放り投げる。

jenkins/files/default/visudo

Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD:ALL

これをサーバの/etc/sudoers.dに置く。

jenkins/recipes/default.rb

cookbook_file "/etc/sudoers.d/jenkins" do
  source "visudo"
  mode "0644"
end

これでjenkinsからsudoでシェルが実行できるようになった。

ここまでのcookbookをchef-repo/でvagrant init centosした後に、githubに上げた。 とりあえずこれをjenkinsで引っ張ってきて、vagrant upしてvagrant destroyできることを確認。

実行するシェルはこんな感じ。

sudo vagrant up
sudo vagrant ssh-config --host=jenkins_vagrant > vagrant-ssh.conf
sudo rm -f vagrant-ssh.conf
sudo vagrant destroy -f

成功した。

f:id:sambaiz:20140603032207p:plain

ここまで長かった。次こそようやくserverspecが動かせるはず。

続く

参考

update jenkins Updatecenter from CLI

Jenkinsでsudoが必要な場合 - Qiita

Vagrant + Chef Solo + serverspec + Jenkins でサーバー構築を CI - naoyaのはてなダイアリー