生産性向上ブログ

継続的な生産性向上を目指すエンジニアのためのブログ

Jenkins で事前にプラグインがインストールされた Docker イメージを用意する方法

以前に Jenkins を公式の Docker イメージから構築する方法について書きましたが、今回は公式の Docker イメージに事前にプラグインをインストールした Docker イメージを作成する方法について書きます。

ちなみに、公式の説明は Docker イメージの GitHub リポジトリの README.md に書いてあります。

github.com

現在の Jenkins の Docker イメージの中には、install-plugin.sh という、イメージに事前にプラグインをインストールするためのスクリプトが存在します。

公式の Docker イメージをベースに Dockerfile を作成し、以下のように install-plugin.sh にプラグイン名を引数として渡せば、事前にプラグインがインストールされた Jenkins の Docker イメージになります。

FROM jenkins/jenkins:lts
RUN /usr/local/bin/install-plugins.sh docker-slaves github-branch-source:1.8

この Dockerfile があるディレクトリで docker build してみます。

$ docker build .
...
Installed plugins:
apache-httpcomponents-client-4-api:4.5.5-3.0
authentication-tokens:1.3
credentials-binding:1.16
credentials:2.1.18
display-url-api:2.2.0
docker-commons:1.13
docker-slaves:1.0.7
git-client:2.7.3
git:3.9.1
github-api:1.92
github-branch-source:1.8
github:1.29.2
jackson2-api:2.8.11.3
jsch:0.1.54.2
junit:1.25
mailer:1.21
matrix-project:1.13
plain-credentials:1.4
scm-api:2.2.7
script-security:1.46
ssh-credentials:1.14
structs:1.14
token-macro:2.5
workflow-api:2.29
workflow-scm-step:2.6
workflow-step-api:2.16

たしかに引数で指定したプラグインはインストールされているようですが、それ以外のプラグインもけっこうな数がインストールされます。デフォルトプラグインということなんですかね。

インストールするプラグイン一覧はファイルで渡すこともできて、以下のようになります。

FROM jenkins/jenkins:lts
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt

既存の Jenkins 環境にインストールされているプラグイン一覧をファイルに書き出すには、以下のよう Jenkins を curl で叩いてレスポンスを整形します。

$ curl -sSL "http://<username:password@host:port>/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([\w-]+).*?<version>([^<]+)()(<\/\w+>)+/\1 \2\n/g'|sed 's/ /:/' > plugins.txt

イメージで事前にインストールされたプラグインは GUI 上からインストールされたプラグインと少し扱いが異なります。例えば、イメージで事前にインストールされたプラグインのバージョンがインストール済みのプラグインより新しい場合、プラグインは新しいバージョンに更新されます。

一方で、イメージで事前にインストールされたプラグインとは別に GUI から新たにプラグインをインストールすることもできるので、プラグインを一元管理する仕組みとしては少し使いづらい部分もあるかもしれないです。また、プラグインを更新するたびに Docker イメージを作り直す必要があるというのもちょっと面倒でもあります。

とはいえ、Jenkins にインストールされているプラグインをファイルでバージョン管理できるようになるのは便利だと思うので、知っておいて損はないと思います。