Serverspec ハンズオン資料（Jenkins おじさんお届け編）


## はじめに

### やること

![2016070101.png](https://qiita-image-store.s3.amazonaws.com/0/87189/9cf7b23e-4650-4fb5-57e8-3e49086d039c.png "2016070101.png")

- Jenkins を使って Dockerfile のテストを自動化
- テストが通ったらコンテナをビルドして Docker Hub にコンテナイメージを push

### 必要なもの

以下のアカウントを既にお持ちであるという前提で資料を進める。

- Docker Hub のアカウント
- GitHub のアカウント

上記のアカウントが無い方は事前に取得しておきましょう。（※ 取っておいて損は無いと思います）

### ハンズオンの流れ

1. 仮想マシンに Jenkins を導入
2. Jenkins プラグインを導入
3. GitHub 上のハンズオンリポジトリを fork する
4. fork したリポジトリと Jenkins を連携させる
5. コンテナをビルドして Docker Hub に push するジョブ（ジョブ B）を作成する
6. Dockerfile をテストするジョブ（ジョブ A）を作成する
7. ビューにてパイプライン表示を設定する
8. ローカルマシンで Dockerfile を弄ったり、Spec ファイルを弄って、テストの自動実行等を体感する

***

## 手順

### 1. 仮想マシンに Jenkins を導入

#### Jenkins の導入

~~~sh:command
sudo apt-get update
sudo apt-get -y install openjdk-7-jre openjdk-7-jdk
wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get -y install jenkins
~~~

#### Jenkins ユーザーが Docker コマンドを実行出来るようする

~~~sh:command
sudo usermod -G docker jenkins
~~~

念のために確認。

~~~sh:command
sudo -u jenkins docker version
~~~

以下のように出力されることを確認する。

~~~sh:command
Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:47:50 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:47:50 2016
 OS/Arch:      linux/amd64
~~~

### 2. Jenkins プラグインを導入

以下のプラグインを導入する。

- Build Pipeline Plugin
- CloudBees Docker Build and Publish plugin
- GitHub plugin

以下を実行してコマンドラインで Jenkins プラグインを導入する。

~~~sh:command
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin github
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin build-pipeline-plugin
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin docker-build-publish
~~~

プラグインを導入したら Jenkins を再起動する。

~~~sh:command
sudo service jenkins restart
~~~

### 3. GitHub 上のハンズオンリポジトリを fork する

- GitHub 上で https://github.com/inokappa/handson-serverspec を fork する

### 4. fork したリポジトリを Jenkins を連携させる

- fork したリポジトリの Webhooks & services にて Add services を選択、[Add Jenkins (GitHub plugin)] を選択

![2016070102.png](https://qiita-image-store.s3.amazonaws.com/0/87189/a2fca1e4-4cf0-d756-c7f1-718f241e118a.png "2016070102.png")

- GitHub から Jenkins の webhook URL にアクセス出来るように設定を行う

下図のようにGitHub の IP アドレスは https://api.github.com/meta にアクセスして確認、hooks の IP アドレスを利用する。

![2016070302.png](https://qiita-image-store.s3.amazonaws.com/0/87189/cc13dbf5-8fc3-1418-7168-d33c3c3c6ab2.png "2016070302.png")

### 5. コンテナをビルドして Docker Hub に push するジョブ（ジョブ B）を作成する

#### ジョブ設定

- プロジェクト名 ... Docker_Build_Push
- ソースコード管理 ... なし
- ビルド ... Docker Build and Publish を選択

#### Docker Build and Publish の設定

![2016062902.png](https://qiita-image-store.s3.amazonaws.com/0/87189/8c4d6cd7-917a-29e2-4a2f-fd64a36e3227.png "2016062902.png")

- Repository Name ... ${your_dockerhub_account}/serverspec-handson
- Tag ... latest
- Registry credentials ... 追加をクリックして下図のように Docker Hub の設定を追加する

![2016062903.png](https://qiita-image-store.s3.amazonaws.com/0/87189/2c40c237-cae5-3029-efb4-e906f03cf098.png "2016062903.png")

設定を追加すると ${JENKINS_HOME}/credentials.xml に設定した認証情報が追記される。

続いて、「高度な設定...」をクリックして以下のように設定する。

![2016070301.png](https://qiita-image-store.s3.amazonaws.com/0/87189/03b63a5b-451d-0e41-b585-d4c5f5733fac.png "2016070301.png")

- No Cache ... チェック（`--nocache` オプションが有効になる）
- Build Context ... `/var/lib/jenkins/jobs/Serverspec_Handson/workspace/docker/` を設定
- Dockerfile Path ... `/var/lib/jenkins/jobs/Serverspec_Handson/workspace/docker/Dockerfile` を設定

### 6. Dockerfile をテストするジョブ（ジョブ A）を作成する

#### ジョブ設定

- プロジェクト名 ... Serverspec_Handson
- ソースコード管理 ... Git をチェックして
 - Repository URL には https://github.com/${your_account}/handson-serverspec.git を指定
- ビルドトリガ ... Build when a change is pushed to GitHub を選択
- ビルド ... 「シェルの実行」を選択して以下のようなシェルスクリプトを書いておく

~~~sh:script
PATH="/var/lib/jenkins/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
cd /var/lib/jenkins/workspace/$JOB_NAME
bundle install
bundle exec rspec spec/docker_*_spec.rb
~~~

- ビルド後の処理 ... 「他のプロジェクトのビルド」を選択

#### ビルド後の処理「他のプロジェクトのビルド」の設定

- 対象プロジェクトに Docker_Build_Push を指定
- 安定している場合のみ起動にチェック

### 7. ビューにてパイプライン表示を設定する

#### ジョブ一覧より ＋ をクリックする

![2016062905.png](https://qiita-image-store.s3.amazonaws.com/0/87189/76a780d4-19c8-a1e7-6575-0ad8ffddd74b.png "2016062905.png")

#### ビュー名を入力して Build Pipeline View にチェック

![2016062906.png](https://qiita-image-store.s3.amazonaws.com/0/87189/1b94c113-657c-b043-89fa-f5166056fc82.png "2016062906.png")

#### Build Pipeline View の設定

![2016062907.png](https://qiita-image-store.s3.amazonaws.com/0/87189/bfeeb55a-a61a-306d-439d-ea274406885a.png "2016062907.png")

- 名前 ... Serverspec_Handson
- Layout の Select Initial Job ... Serverspec_Handson
- No Of Displayed Builds ... 5

### 8. ローカルマシンで Dockerfile を弄ったり、Spec ファイルを弄って、テストの自動実行等を体感する

#### build ship run

ローカルマシンで Dockerfile や Spec ファイルを修正して GitHub に push する度に Jenkins でテスト、ビルド、Docker Hub への push が行われる。

まさに build ship run!!（run まではやってないけど）

#### Jenkins のビルドパイプライン

![2016070103.png](https://qiita-image-store.s3.amazonaws.com/0/87189/4c7648da-1b5f-957c-244d-3d858f34de4f.png "2016070103.png")

#### git clone → Test

![2016070105.png](https://qiita-image-store.s3.amazonaws.com/0/87189/1139790c-7ee8-ce99-bd63-d4523708cd5b.png "2016070105.png")

#### Build → Push

![2016070106.png](https://qiita-image-store.s3.amazonaws.com/0/87189/c7a1a873-918b-96e8-1494-10f616f8ea7e.png "2016070106.png")

#### Docker Hub

![2016070104.png](https://qiita-image-store.s3.amazonaws.com/0/87189/f36639b7-0715-f0f9-a5cc-8c9d4243ab3a.png "2016070104.png")

***

## ということで

明日からの皆さんの業務のお役に立てれば幸いです。
お疲れ様でした。