以前に Jenkins を公式の Docker イメージから構築する方法について書きましたが、今回は公式の Docker イメージに事前にプラグインをインストールした Docker イメージを作成する方法について書きます。
ちなみに、公式の説明は Docker イメージの GitHub リポジトリの README.md
に書いてあります。
現在の 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 にインストールされているプラグインをファイルでバージョン管理できるようになるのは便利だと思うので、知っておいて損はないと思います。