ようへいの日々精進XP

よかろうもん

Serverspec と Infrataster でテストした Docker コンテナイメージを Jenkins を介して Amazon ECR に push する考察

tl;dr

ニーズがあるかどうか解らないけど...Jenkins を触ってみたくて試してみた。Jenkins の Amazon ECR プラグインとの出会いに身震いした。

参考

やったことを一枚の絵にすると...

こんな感じ。

f:id:inokara:20160625193046p:plain

実際に動いている画面

f:id:inokara:20160625193614p:plain

サンプル

github.com

このサンプルでは以下のようなテストを行う。

  • Serverspec の Docker バックエンド(厳密に言えば Specinfra の Docker バックエンド)を利用してコンテナに対して Docker API を介してテスト
  • 合わせて Infrataster と Docker API を利用してコンテナ内に立ち上げた Apache に対して振る舞いのテスト

事前にやったこと

サマリ

  1. Jenkins の導入
  2. Jenkins ユーザーで Docker API を叩けるようにする
  3. 各種 Jenkins プラグインの導入(後述)
  4. GitHub に Jenkins の Jenkins (GitHub plugin) にて URL を設定する(後述)
  5. IAM ユーザーの払い出して Amazon ECR にリポジトリを作成
  6. IAM ユーザーのクレデンシャル情報を Jenkins の「認証情報」に設定
  7. ECR に push するジョブ(ジョブ (2))を作成
  8. ジョブ (2) にリポジトリ作成時に払いだされたレジストリ URL を Jenkins の Amazon ECR 用プラグインに設定する(後述)
  9. Serverspec と Infrataster でコンテナをテストするジョブ(ジョブ (1))を作成(後述)
  10. ジョブ (2)のビルドトリガにジョブ (1) を指定する(後述)
  11. ジョブ (2)の Amazon ECR 用プラグインに Build Context と Dockerfile Path を指定する(後述)
  12. Build Pipeline の View を作成する(後述)

各種 Jenkins プラグインの導入

以下のプラグインを順不同でインストール。(※ 以下のプラグイン以外でも依存関係で関連するプラグインがインストールされる)

GitHub に Jenkins の Jenkins (GitHub plugin) にて URL を設定する

対象となる GitHub リポジトリの設定で Jenkins (GitHub plugin) を追加して Jenkins の Webhook URL を設定する。

f:id:inokara:20160625195221p:plain

尚、Jenkins の Webhook を設定する際に GitHub 側の IP アドレスを制限したい場合には以下のように API を実行して GitHub 側の IP アドレスを確認することが出来る。(Webhook の接続元は hooks キーの値を利用した)

curl -s https://api.github.com/meta

リポジトリ作成時に払いだされたレジストリ URL を Jenkins の Amazon ECR 用プラグインに設定する

ビルドにて Docker Build and Publish を選択すると以下のようにレジストリの情報等を入力出来るようになる。

f:id:inokara:20160625195911p:plain

Registry credentials では 事前に Jenkins の「認証情報」に登録しておいた IAM ユーザーの設定を利用する。

Serverspec と Infrataster でコンテナをテストするジョブ(ジョブ (1))を作成

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

ジョブ (2)のビルドトリガにジョブ (1) を指定する

ビルドトリガにて「他のプロジェクトの後にビルド」を選択して、対象プロジェクトからジョブ (1) を選択する。

f:id:inokara:20160625200913p:plain

ジョブ(2)の Amazon ECR 用プラグインに Build Context と Dockerfile Path を指定する

ジョブ (1) の workspace に展開されている Dockerfile を利用してコンテナをビルドしたいので Build Context と Dockerfile Path を下図のように指定する。

f:id:inokara:20160625200925p:plain

Build Pipeline の View を作成する

特に難しいことは無く、Build Pipeline Plugin 導入後に Jenkins のダッシュボードの Job 一覧にある をクリックして作成する。

f:id:inokara:20160625193614p:plain

後は...

手元で Dockerfile を修正、spec ファイルを修正して push すれば Jenkins 先生がテストを走らせて、テストが合格であれば Dockerfile からコンテナイメージをビルドして Amazon ECR に push するという継続的デリバリー的な何かが動き始める。(これを継続的デリバリーと言うのかは解らないけど...)

そして、以下のように Amazon ECR のリポジトリにコンテナイメージが push されている。

f:id:inokara:20160625210720p:plain

また、Slack なんか絡めるとビルドの成功、失敗も以下のように通知してくれてナウい感じなるんぢゃないかと思ったり。

f:id:inokara:20160625203311p:plain