pluginsインストール済&ユーザ作成済のJenkins用Dockerイメージを作る手順

Jenkinsのdockerイメージを作成する手順を構築していたのですが、毎回プラグインのインストールをするのもなんだよね。。。

ということで、プラグインがあらかじめインストールされたdockerイメージを用意することにしました。

また、毎回jenkinsのユーザをつくるのもなんだよね。。。

ということで、ユーザも同時に作成するようにしています。

なお、開発環境がproxy背後なので、proxyの設定も入ったスクリプトになっていますが、そうでない方はproxyの記載は必要ないです。

Preinstalling pluginなjenkinsを作成する

「Suggested plugins」だけでなく、任意のプラグインがインストールされた状態のjenkinsを作るには、公式のgithubの情報がすごくためになります。

あ、公式と言っても、jenkinsの公式の方です。この記事にも書きましたが、jenkinsのイメージには似ているけど異なるものが2つあるので、混同しないようにしましょう。

今回は、jenkins/jenkinsの方です。

さて、この公式イメージには「/usr/local/bin/install-plugins.sh」という、プラグインを依存関係も含めてインストールしてくれるシェルが用意されているので、これを使います。

使い方は

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

のように、シェルにプラグイン名をスペースで区切って渡します。

ただ、結構たくさんのプラグインがあるので、

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

のように、あらかじめインストールしたいプラグインを書いた「plugins.txt」を用意しておき、それをイメージのbuild時にシェルに渡すことで、preinstallできます。

で、この「plugins.txt」に記載するプラグイン名ですが、

スクリプトコンソール(http://localhost:8080/script)に以下のgroovyスクリプトを入力して実行すると取得できます。

Jenkins.instance.pluginManager.plugins.each{
 plugin -> println("${plugin.getShortName()}")
}

デフォルトのユーザをあらかじめ作成しておく

プラグインインストール以外にも、あらかじめ環境をセットアップしたいという要望があるハズです。

この目的の実現のために、以下のような仕組みが用意されています。

/usr/share/jenkins/ref/init.groovy.d/

配下にgroovyスクリプトを配置しておくと、初回run時にそのスクリプトを実行してくれるのです。

今回は、前もってjenkinsのコンソールを利用できるユーザを作成しておくことにします。

import jenkins.model.*
Jenkins.instance.setNumExecutors(0)
import jenkins.model.*
import hudson.security.*
 
def env = System.getenv()
 
def jenkins = Jenkins.getInstance()
if(!(jenkins.getSecurityRealm() instanceof HudsonPrivateSecurityRealm))
    jenkins.setSecurityRealm(new HudsonPrivateSecurityRealm(false))
 
if(!(jenkins.getAuthorizationStrategy() instanceof GlobalMatrixAuthorizationStrategy))
    jenkins.setAuthorizationStrategy(new GlobalMatrixAuthorizationStrategy())
 
def user = jenkins.getSecurityRealm().createAccount(env.JENKINS_USER, env.JENKINS_PASS)
user.save()
jenkins.getAuthorizationStrategy().add(Jenkins.ADMINISTER, env.JENKINS_USER)
 
jenkins.save()

これらを記載したDockerFileは以下のようになります。

FROM jenkins/jenkins:2.184
 
ENV https_proxy "http://proxy_server:8080/"
ENV http_proxy "http://proxy_server:8080/"
 
MAINTAINER koji
 
 
# セットアップウィザードを無効化する
# (Suggested pluginsのインストールをスキップできる)
# proxy背後の場合は必要かも
# ENV JAVA_OPTS="-Djenkins.install.runSetupWizard=false -Dhttp.proxyHost=proxy_server -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy_server -Dhttps.proxyPort=8080"
ENV JAVA_OPTS="-Djenkins.install.runSetupWizard=false"
 
# rootユーザでplugins.txtに記載されたプラグインをインストールする
# install-plugins.shは公式イメージに同梱されているインストール用スクリプト
USER root
 
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt
 
 
ENV JENKINS_USER admin
ENV JENKINS_PASS admin
 
 
COPY custom.groovy /usr/share/jenkins/ref/init.groovy.d/
COPY default-user.groovy /usr/share/jenkins/ref/init.groovy.d/

このDockerFileでイメージを作成しrunすると、プラグインがインストールされ、あらかじめユーザが作成された状態でjenkinsが起動します。

docker build -t myimg/jenkins_plugin:1.0 .

docker run --name con_jenkins -p 8080:8080 -p 50000:50000 -v /jenkins_home:/var/jenkins_home --env JAVA_OPTS="-Dhttp.proxyHost=proxy_server -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy_server -Dhttps.proxyPort=8080" -d myimg/jenkins_plugin:1.0