はじめに
やること
- Jenkins を使って Dockerfile のテストを自動化
- テストが通ったらコンテナをビルドして Docker Hub にコンテナイメージを push
必要なもの
以下のアカウントを既にお持ちであるという前提で資料を進める。
- Docker Hub のアカウント
- GitHub のアカウント
上記のアカウントが無い方は事前に取得しておきましょう。(※ 取っておいて損は無いと思います)
ハンズオンの流れ
- 仮想マシンに Jenkins を導入
- Jenkins プラグインを導入
- GitHub 上のハンズオンリポジトリを fork する
- fork したリポジトリと Jenkins を連携させる
- コンテナをビルドして Docker Hub に push するジョブ(ジョブ B)を作成する
- Dockerfile をテストするジョブ(ジョブ A)を作成する
- ビューにてパイプライン表示を設定する
- ローカルマシンで 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 する
- GitHub 上で https://github.com/inokappa/handson-serverspec を fork する
4. fork したリポジトリを Jenkins を連携させる
- fork したリポジトリの Webhooks & services にて Add services を選択、[Add Jenkins (GitHub plugin)] を選択
- GitHub から Jenkins の webhook URL にアクセス出来るように設定を行う
下図のようにGitHub の IP アドレスは https://api.github.com/meta にアクセスして確認、hooks の IP アドレスを利用する
5. コンテナをビルドして Docker Hub に push するジョブ(ジョブ B)を作成する
ジョブ設定
- プロジェクト名 … Docker_Build_Push
- ソースコード管理 … なし
- ビルド … Docker Build and Publish を選択
Docker Build and Publish の設定
- Repository Name … ${your_dockerhub_account}/serverspec-handson
- Tag … latest
- Registry credentials … 追加をクリックして下図のように Docker Hub の設定を追加する
設定を追加すると ${JENKINS_HOME}/credentials.xml に設定した認証情報が追記される。
続いて、「高度な設定…」をクリックして以下のように設定する。
- 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 を選択
- ビルド … 「シェルの実行」を選択して以下のようなシェルスクリプトを書いておく
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. ビューにてパイプライン表示を設定する
ジョブ一覧より + をクリックする
ビュー名を入力して Build Pipeline View にチェック
Build Pipeline View の設定
- 名前 … 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 のビルドパイプライン
git clone → Test
Build → Push
Docker Hub
ということで
明日からの皆さんの業務のお役に立てれば幸いです。
お疲れ様でした。