こんにちは。マネーフォワードエンジニアの鈴木です。
最近ではCIもすっかり定着し、みなさんの職場にもJenkinsサーバないし何かしらのCIが稼動していることかと思います。
YumやAPTなどのパッケージ管理ツールでインストールすることも多いかと思われますが、最近では様々な仮想化ソフトウェアの台頭もあって、Ansibleのようなプロビジョニングツールがよく使われるようになりました。 セットアップ手順をコード化することには以下のようなメリットがあります。
- 手順を明確にしオープンにすることで、属人性をなくせる
- 仮想環境への構築が容易になるので、serverspecなどでテストしやすくなる
- 管理コストを削減できる
Ansibleには、Ansible galaxyというrole(ノードの役割設定)を共有できるhubサービスがあり、世界中のユーザが作成したroleを利用することができます。
今回はAnsible galaxyを使ってJenkinsをセットアップする手順をご紹介します。
前準備
構築するためのテスト環境として、仮想マシンを用意しましょう。VirtualBoxがおすすめです。
Vagrantで適当なOSを立ち上げます。運用環境で使うものと同じOSが良いでしょう。今回はCentOSにします。
vagrantbox.esにOSのリストがあります。
mkdir jenkins_test cd !$ vagrant box add centos6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box vagrant init
Vagrantfileは以下のようにします。config.vm.define
を追加してください。
もともと複数台セットアップするための仕組みのようですが、名前を付けておかないとserverspec-init
のジェネレータがdefaultという名前でホストを認識し、困ったことになるのでこうしています。
Vagrantfile
Vagrant.configure(2) do |config| config.vm.box = 'centos6.5' config.vm.box_url = 'https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box' config.vm.define 'jenkins' do |jenkins| jenkins.vm.network 'forwarded_port', guest: 8080, host: 8080 jenkins.vm.network 'private_network', ip: '192.168.33.10' end config.vm.provider 'virtualbox' do |vb| vb.memory = '1024' end end
vagrant up jenkins
とすると起動します。
Serverspecを書く
いきなりJenkinsをインストールしても良いですが、せっかくなのでテストファーストでやってみましょう。
serverspecがインストールされていない場合は、こんなGemfileを書いてbundle install
します。
Gemfile
source 'https://rubygems.org' gem 'rake' gem 'serverspec'
serverspec-init
を実行し、以下のようにします。
spec/jenkins/sample_spec.rb
が生成されるので、これをspec/jenkins/jenkins_spec.rb
にリネームし、以下のようにspecを書きます。
spec/jenkins/jenkins_spec.rb
require 'spec_helper' describe package('jenkins') do it { should be_installed } end describe service('jenkins') do it { should be_enabled } it { should be_running } end describe port(8080) do it { should be_listening } end
bundle exec rake
を実行し、テストが失敗することを確認します。
Ansible galaxyでJenkinsを探してインストールする
ここでAnsible galaxyの登場です。
galaxy.ansible.comでJenkinsを探します。
Jenkinsで検索するとたくさん出てきますが、CentOSをサポートしていてメンテナンスされているように見えるgeerlingguy.jenkinsにしてみます。
Githubへのリンクも貼られていますので、必ず実装を確認しましょう。
gemに近いイメージで、メタファイルに記述された依存情報を元に自動的に解決してくれます。 インストールするrole名は、直接コマンドラインに指定することもできますし、列挙したファイルを指定するインターフェースも用意されています。 今回は依存関係を明示する意味でもファイルに書くことにします。
echo "geerlingguy.jenkins" >> requirements ansible-galaxy install -r requirements
これでインストール完了です。(手元の環境では/usr/local/etc/ansible/
にインストールされました)
このroleを利用して、inventoryとplaybookファイルを書きます。
inventoryはplaybookで使用する論理的なグループを定義します。
test-servers
[jenkins] 192.168.33.10 [jenkins:vars] ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/jenkins/virtualbox/private_key ansible_sudo=true
playbookは論理的なサーバの役割や、セットアップ時に渡す変数などが記述できます。
site.yml
- hosts: jenkins roles: - jenkins
実行します。
ansible-playbook -i test-servers site.yml
Serverspecで確認する
無事起動していることを確認したら、serverspecでも確認しておきましょう。
bundle exec rake
Jenkinsをカスタマイズする
これでJenkinsの起動までは確認できました。
必要に応じて、Jenkins pluginを増やしたりjobを追加したりしましょう。
pluginについてはhost_vars
を利用して追加インストールできますが、jobの管理は今回インストールしたroleには実装されていません。
Ansible galaxyにあるコードや公式ドキュメントを参考に、ぜひカスタマイズしてみてください。
最後に
マネーフォワードでは何でもコードで自動化したいエンジニアを募集しています。 みなさまのご応募お待ちしております!