OpenShiftに組み込まれたJenkinsは、パイプラインビルドを開始したときにコンテナをOpenShift上に起動し、その上でパイプラインを実行します。
このようなJenkinsからビルドするために起動、破棄されるコンテナをAgentコンテナとかSlaveコンテナとか呼ぶようです。
このAgentとして使われるコンテナイメージは簡単に追加、変更できるのですが、方法がいまいち分かりにくいというか目立たない気がするので紹介させてください。
ここでは、hugo
を使って静的なサイトをOpenShiftのJenkinsでビルドする想定で、hugo
がインストールされた以下のコンテナイメージをJenkinsのagentとして使用します。
https://github.com/literalice/agent-hugo/blob/master/Dockerfile
|
|
ImageStream
OpenShiftは、内部で使用するイメージの管理を ImageStream
というAPIオブジェクトで行っています。
また、OpenShiftとJenkinsの設定には、以下の二つのプラグインが使われます。
- kubernetes-plugin
- KubernetesのPodをJenkinsのagentとして起動できるようにする
- openshift-jenkins-sync-plugin
- OpenShiftのビルドとJenkinsのジョブとビルドを同期する。OpenShift上でビルドが作られて実行されたときにJenkins上でジョブが作られてビルドされる、など
Jenkinsのagentに関して言えば、openshift-jenkins-sync-plugin
のおかげで以下のことが実現されています。
- OpenShift上で
role=jenkins-slave
というラベルが付けられたImageStream
が作成されると、 kubernetes-plugin
で、このImageStream
のコンテナイメージが使われるように設定される
つまり、OpenShiftでagentとして使いたいイメージを指すImageStream
オブジェクトを作ってrole=jenkins-slave
というラベルを付ければ、JenkinsのAgentとして使えるようになるということですね。
どうでもいいんですが、Jenkinsのネーミングガイドラインでslave
をagent
にする、というのをどこかで聞いた気がするんですが、現時点ではネーミングが混ざってて混乱しますね。
使用したいコンテナイメージを参照するImageStreamを作成する
では、さっそくJenkinsから使うagentイメージを追加してみましょう。
OpenShift内でビルドしてもいいのですが、面倒なので既存のイメージからこれからImageStream
を作りましょう。
quay.io/literalice/agent-hugoにイメージを挙げているのでこれを使うことにします。
|
|
これで、quay.io/literalice/agent-hugo
を示すImageStream
ができました。
ImageStreamにラベルを付ける
このイメージがJenkinsのagentとして使われるよう、ラベル付けします。
|
|
コンテナイメージをagentにしてJenkinsビルドする
上記で準備したImageStream
を使ってJenkinsビルドを行います。
|
|
pipeline.agent.node.label
に、使用するImageStream
名を指定します。
上記を、buildconfig.yml
という名前で保存して適用します。
|
|
ここで、作成されるPodを確認してみてください。
|
|
Jenkinsのコンテナとagentであるagent-hugo
のコンテナ、両方が立ち上がっていることが分かります。
結果確認
では、以下コマンドでJenkisのURLを確認し、アクセスしてビルド結果を確認してみましょう。
|
|
無事、ビルドできているようです。
まとめ
OpenShiftのJenkinsで利用するagentのコンテナは簡単に追加できます。
個人的には、agentを追加してビルド環境を追加するよりも、OpenShiftのs2i
に投げるほうがキャッシュの仕組みなどカプセル化度が高く好きですが、
Jenkinsのビルド環境もお手軽に追加できると嬉しいケースもありそうですので紹介してみました。