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のコンソールを利用できるユーザを作成しておくことにします。
「custom.groovy」
import jenkins.model.* Jenkins.instance.setNumExecutors(0)
「default-user.groovy」
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は以下のようになります。
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