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