tl;dr
ニーズがあるかどうか解らないけど…Jenkins を触ってみたくて試してみた。Jenkins の Amazon ECR プラグインとの出会いに身震いした。
参考
- http://serverspec.org/
- http://infrataster.net/
- https://blog.mikesir87.io/2016/04/pushing-to-ecr-using-jenkins-pipeline-plugin/
- https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR
- https://wiki.jenkins-ci.org/display/JENKINS/CloudBees+Docker+Pipeline+Plugin
- https://wiki.jenkins-ci.org/display/JENKINS/CloudBees+Docker+Build+and+Publish+plugin
- http://www.ryuzee.com/contents/blog/4470
図
やったことを一枚の絵にすると…
こんな感じ。
実際に動いている画面
サンプル
github.com
このサンプルでは以下のようなテストを行う。
- Serverspec の Docker バックエンド(厳密に言えば Specinfra の Docker バックエンド)を利用してコンテナに対して Docker API を介してテスト
- 合わせて Infrataster と Docker API を利用してコンテナ内に立ち上げた Apache に対して振る舞いのテスト
事前にやったこと
サマリ
- Jenkins の導入
- Jenkins ユーザーで Docker API を叩けるようにする
- 各種 Jenkins プラグインの導入(後述)
- GitHub に Jenkins の Jenkins (GitHub plugin) にて URL を設定する(後述)
- IAM ユーザーの払い出して Amazon ECR にリポジトリを作成
- IAM ユーザーのクレデンシャル情報を Jenkins の「認証情報」に設定
- ECR に push するジョブ(ジョブ (2))を作成
- ジョブ (2) にリポジトリ作成時に払いだされたレジストリ URL を Jenkins の Amazon ECR 用プラグインに設定する(後述)
- Serverspec と Infrataster でコンテナをテストするジョブ(ジョブ (1))を作成(後述)
- ジョブ (2)のビルドトリガにジョブ (1) を指定する(後述)
- ジョブ (2)の Amazon ECR 用プラグインに Build Context と Dockerfile Path を指定する(後述)
- Build Pipeline の View を作成する(後述)
各種 Jenkins プラグインの導入
以下のプラグインを順不同でインストール。(※ 以下のプラグイン以外でも依存関係で関連するプラグインがインストールされる)
- Amazon ECR plugin
- Build Pipeline Plugin
- CloudBees Docker Pipeline
- CloudBees Docker Build and Publish plugin)
- GitHub plugin
GitHub に Jenkins の Jenkins (GitHub plugin) にて URL を設定する
対象となる GitHub リポジトリの設定で Jenkins (GitHub plugin) を追加して Jenkins の Webhook URL を設定する。
尚、Jenkins の Webhook を設定する際に GitHub 側の IP アドレスを制限したい場合には以下のように API を実行して GitHub 側の IP アドレスを確認することが出来る。(Webhook の接続元は hooks
キーの値を利用した)
curl -s https://api.github.com/meta
リポジトリ作成時に払いだされたレジストリ URL を Jenkins の Amazon ECR 用プラグインに設定する
ビルドにて Docker Build and Publish を選択すると以下のようにレジストリの情報等を入力出来るようになる。
Registry credentials では 事前に Jenkins の「認証情報」に登録しておいた IAM ユーザーの設定を利用する。
Serverspec と Infrataster でコンテナをテストするジョブ(ジョブ (1))を作成
- プロジェクト名 … Serverspec_Handson
- ソースコード管理 … Git をチェックして Repository URL にはhttps://github.com/inokappa/handson-serverspec.git を指定
- ビルドトリガ … Build when a change is pushed to GitHub を選択
- ビルド … 「シェルの実行」を選択して以下のようなシェルスクリプトを書いておく
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) を選択する。
ジョブ(2)の Amazon ECR 用プラグインに Build Context と Dockerfile Path を指定する
ジョブ (1) の workspace に展開されている Dockerfile を利用してコンテナをビルドしたいので Build Context と Dockerfile Path を下図のように指定する。
Build Pipeline の View を作成する
特に難しいことは無く、Build Pipeline Plugin 導入後に Jenkins のダッシュボードの Job 一覧にある + をクリックして作成する。
後は…
手元で Dockerfile を修正、spec ファイルを修正して push すれば Jenkins 先生がテストを走らせて、テストが合格であれば Dockerfile からコンテナイメージをビルドして Amazon ECR に push するという継続的デリバリー的な何かが動き始める。(これを継続的デリバリーと言うのかは解らないけど…)
そして、以下のように Amazon ECR のリポジトリにコンテナイメージが push されている。
また、Slack なんか絡めるとビルドの成功、失敗も以下のように通知してくれてナウい感じなるんぢゃないかと思ったり。
元記事はこちら
「Serverspec と Infrataster でテストした Docker コンテナイメージを Jenkins を介して Amazon ECR に push する考察」