はじめに

やること

9cf7b23e-4650-4fb5-57e8-3e49086d039c

  • 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 の導入

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 コマンドを実行出来るようする

command

sudo usermod -G docker jenkins

念のために確認。

command

sudo -u jenkins docker version

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

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 プラグインを導入する。

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 を再起動する。

command

sudo service jenkins restart

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

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

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

a2fca1e4-4cf0-d756-c7f1-718f241e118a

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

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

cc13dbf5-8fc3-1418-7168-d33c3c3c6ab2

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

ジョブ設定
  • プロジェクト名 … Docker_Build_Push
  • ソースコード管理 … なし
  • ビルド … Docker Build and Publish を選択
Docker Build and Publish の設定

8c4d6cd7-917a-29e2-4a2f-fd64a36e3227

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

2c40c237-cae5-3029-efb4-e906f03cf098

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

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

03b63a5b-451d-0e41-b585-d4c5f5733fac

  • 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 をチェックして
  • ビルドトリガ … Build when a change is pushed to GitHub を選択
  • ビルド … 「シェルの実行」を選択して以下のようなシェルスクリプトを書いておく

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. ビューにてパイプライン表示を設定する

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

76a780d4-19c8-a1e7-6575-0ad8ffddd74b

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

1b94c113-657c-b043-89fa-f5166056fc82

Build Pipeline View の設定

bfeeb55a-a61a-306d-439d-ea274406885a

  • 名前 … 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 のビルドパイプライン

4c7648da-1b5f-957c-244d-3d858f34de4f

git clone → Test

1139790c-7ee8-ce99-bd63-d4523708cd5b

Build → Push

c7a1a873-918b-96e8-1494-10f616f8ea7e

Docker Hub

f36639b7-0715-f0f9-a5cc-8c9d4243ab3a

ということで

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

元記事はこちら

Serverspec ハンズオン資料(Jenkins おじさんお届け編)