proxy 環境化の CentOS に Ansible で Jenkins をインストール

# はじめに

GitHub の絶大な人気と相まって、近年では [Travis CI](https://travis-ci.org/) などの名前も多く見かけるようになりましたが、今なお CI (Continuous Integration:継続的インテグレーション) と言えば [Jenkins](http://jenkins-ci.org/) の名前を思い浮かべる方が多いかと思います。

Jenkins を動作させるためには以下のようにいくつかの方法があり、どれもとても簡単です。

1. .war ファイルをダウンロードし、サーブレットコンテナにデプロイして動作させる
1. .war ファイルをダウンロードし、組み込みの Jetty サーバで動作させる
1. ネイティブパッケージをダウンロードし、サービスとして動作させる

今回は Ansible を使って Jenkins のネイティブパッケージをインストールし、以下の構成で動作させる手順を紹介します。

- OpenJDK 1.7.0
- Jenkins
- apache


## 前提

プロキシサーバが存在する企業内 LAN で、以下の手順に従って仮想環境を構築しているものとします。

- [Vagrant と Ansible で Windows でも快適開発 - Qiita](http://qiita.com/garbagetown/items/d9a4eb64b778bd7d659c)

以下、上記手順に従って構築した仮想環境を作業マシン、jenkins を構築する環境を対象マシンと呼びます。


## 手順

### 対象マシンの準備

まず対象マシンを用意します。ここでは Vagrant 上に仮想サーバとして作成しますが、すでに対象マシンが存在する場合、この手順は不要です。

適当な box をダウンロードしていない場合は、[proxy 環境化の CentOS に Ansible で Redmine をインストール - Qiita](http://qiita.com/garbagetown/items/d55291b2b78f1c165adb#3-1) と同様の手順で box をダウンロードします。

box が用意できたら、適当なディレクトリを作成、移動して box を初期化します。

```bash
bash-3.1$ mkdir -p /c/vagrants/jenkins
bash-3.1$ cd /c/vagrants/jenkins/

bash-3.1$ vagrant init CentOS-6.3-x86_64-v20130101
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

作成された Vagrantfile を開いて IP アドレスを設定します。ここでは 192.168.33.200 としました。

```bash
bash-3.1$ vi Vagrantfile
bash-3.1$ grep private_network Vagrantfile
  config.vm.network "private_network", ip: "192.168.33.200"
```

最後に box を起動します。

```bash
bash-3.1$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS-6.3-x86_64-v20130101'...
==> default: Matching MAC address for NAT networking...
(snip)
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => C:/vagrants/jenkins
```

### 鍵交換

[proxy 環境化の CentOS に Ansible で Redmine をインストール - Qiita](http://qiita.com/garbagetown/items/d55291b2b78f1c165adb#3-2) を参照して、作業マシンの公開鍵を対象マシンに登録します。

### プロビジョニング

以下のようにして作業マシンに playbook を clone します。

```zsh
# vagrant at precise64 in ~ [13:22:25]
$ g clone https://github.com/garbagetown/ansible-jenkins.git
Cloning into 'ansible-jenkins'...
remote: Reusing existing pack: 75, done.
remote: Total 75 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (75/75), done.
```

clone したディレクトリに移動し、プロキシサーバの情報を設定します。`your.proxy.host` と `9999` は自身の環境に読み替えてください。

認証が必要な場合は `http://username:password@your.proxy.host:9999/` のように設定します。

```zsh
# vagrant at precise64 in ~ [13:23:18]
$ ansible-jenkins

# vagrant at precise64 in ~/ansible-jenkins on git:master o [13:24:12]
$ echo 'http_proxy: http://your.proxy.host:9999' >> roles/proxy/vars/main.yml
```

続いて、hosts ファイルの内容を確認します。対象マシンの IP アドレスと異なる場合は適宜修正してください。

```zsh
# vagrant at precise64 in ~/ansible-jenkins on git:master x [13:24:28]
$ cat hosts
[jenkins]
192.168.33.200
```

最後に playbook を実行します。

```zsh
# vagrant at precise64 in /vagrant/ansible-jenkins on git:master x [13:29:50]
$ ansible-playbook -i hosts site.yml

PLAY [install jenkins] ********************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.33.200]
(snip)
NOTIFIED: [jenkins | restart httpd] *******************************************
changed: [192.168.33.200]

PLAY RECAP ********************************************************************
192.168.33.200             : ok=19   changed=17   unreachable=0    failed=0


# vagrant at precise64 in /vagrant/ansible-jenkins on git:master x [13:34:35]
```


## 確認

プロビジョニングが正常に完了したら、ブラウザから `192.168.33.200` にアクセスし、Jenkins の画面が表示されることを確認します。

![20140408_001.JPG](https://qiita-image-store.s3.amazonaws.com/0/6755/06369953-01ed-d8f6-70c2-feb690209f3e.jpeg)

Jenkins 自体の使い方については、下記書籍や [Java - Jenkins使い方メモ - Qiita](http://qiita.com/opengl-8080/items/a1ca02673c6ab86d173c) などが参考になるでしょう。

- [Jenkins John Ferguson Smart](http://www.amazon.co.jp/dp/4873115345)
- [Jenkins実践入門　~ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus) 佐藤 聖規](http://www.amazon.co.jp/dp/4774148911)


# まとめ

以上のように、とても簡単な手順でプロキシサーバの存在する企業 LAN 内に Jenkins を構築することができました。

はじめに書いた通り、Jenkins 自体のインストールはとても簡単ですが、それでもプロキシサーバや apache との連携は自分で設定しなければなりません。また、apache と連携する際にサブドメインでアクセスするのか、サブディレクトリでアクセスするのか、またはサーバ自体を Jenkins 専用としてしまうのかなど、判断に困る場合もあるでしょう。

これらの作業や判断をコード化、自動化することで、もともと簡単な Jenkins のインストールを更に簡単にすることができます。

なにより、どれだけ簡単な作業でもコード化し、バージョン管理していくという方針を徹底することが肝要です。パラメータを少し変更するだけでも playbook を修正し、serverspec によるテストを追加し、バージョン管理するとなると、とても負荷が高く感じますが、これを徹底することでサーバ構築作業の属人化を排除することができます。

クラウド、ブルーグリーンデプロイ、イミュータブルインフラストラクチャなどの単語が飛び交う昨今、サーバ構築作業のコード化、自動化の価値はとても高く、導入を検討する価値は充分にあると思います。