Suggested plugins インストール済みのJenkins Dockerイメージの作成

##### 動作環境
* Ubuntu Ubuntu 16.04.6 LTS
* Docker version 18.09.4, build d14af54

# 目的
公式リポジトリからJenkinsのDockerイメージ取得し、それを使ってコンテナを起動した際、
Jenkinsのサーバ側に問題？が発生し、Jenkinsの立ち上げ（初期設定）に手間取ったことがありましたので、
予めSuggested pluginsをインストールした環境を用意しておきます。

※既に問題が発生している場合は問題を調査して対処するしかないと思います。
　使いたいときに使えないのでは困るので、予めワークアラウンドとして環境を用意しておくのが目的です。

※同様の手順にて自分のよく使うプラグインをインストールした環境を用意しておくことも可能です。

# 問題点
Jenkinsの起動時に、本来ではAdministrator Passwordの入力後に
Suggested pluginsをインストールする画面が表示されるはずですが、
（既に手元では問題が再現できない＆ログを削除してしまったため確証はないのですが）
https://updates.jenkins.io へのアクセスに失敗し、当該画面に遷移しなかった模様です。

# 手順

<details><summary>面倒な方向け（作成済みのDockerイメージとDockerfileを公開しています）(クリックすると展開されます)</summary><div>

## 作成済みのDockerイメージを取得する
```shell
$ docker pull tkomagata/jenkins
```

## 作成済みのDockerfileを使用してDockerイメージを作成する
```shell
$ git clone git://github.com/tkomagata/Dockerfile
$ cd Dockerfile/jenkins/lts
$ docker build . -t ${tagname}
```

</div></details>


## Suggested plugins のリストを作成
ここではベース環境として、公式リポジトリで配布されているJenkinsのDockerイメージのLTS版を使用します。
### Jenkinsの起動
```shell
$ docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
```

#### インストール済みのプラグインの取得
##### コマンドラインで取得する場合 (2019/4/22 追記)
```shell
$ JENKINS_HOST=admin:${initialAdminPassword}@myhost.com:8080
$ curl -sSL "http://$JENKINS_HOST/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([\w-]+).*?<version>([^<]+)()(<\/\w+>)+/\1 \2\n/g'|sed 's/ /:/'
```
##### Jenkinsのスクリプトコンソールを使用する場合
スクリプトコンソールから以下を実行し、インストール済みのプラグイン一覧を取得します。
（スクリプトコンソールは"Manage Jenkins"->"Script Console"で表示できます）

```JavaScript
Jenkins.instance.pluginManager.plugins.each{
    plugin ->
        println ("${plugin.getShortName()}")
}
```
そこで表示された結果をplugins.txtとして任意のディレクトリに作成する。

<details><summary>plugins.txtの例(クリックすると展開されます)</summary><div>

```:plugins.txtの中身
cloudbees-folder
jdk-tool
script-security
command-launcher
structs
workflow-step-api
scm-api
workflow-api
bouncycastle-api
junit
antisamy-markup-formatter
token-macro
build-timeout
credentials
ssh-credentials
plain-credentials
credentials-binding
timestamper
workflow-support
durable-task
workflow-durable-task-step
matrix-project
resource-disposer
ws-cleanup
ant
gradle
pipeline-milestone-step
jquery-detached
jackson2-api
ace-editor
workflow-scm-step
workflow-cps
pipeline-input-step
pipeline-stage-step
workflow-job
pipeline-graph-analysis
pipeline-rest-api
handlebars
momentjs
pipeline-stage-view
pipeline-build-step
pipeline-model-api
pipeline-model-extensions
apache-httpcomponents-client-4-api
jsch
git-client
git-server
workflow-cps-global-lib
display-url-api
mailer
branch-api
workflow-multibranch
authentication-tokens
docker-commons
workflow-basic-steps
docker-workflow
pipeline-stage-tags-metadata
pipeline-model-declarative-agent
pipeline-model-definition
lockable-resources
workflow-aggregator
github-api
git
github
github-branch-source
pipeline-github-lib
mapdb-api
subversion
ssh-slaves
matrix-auth
pam-auth
ldap
email-ext
```
</div></details>


### Dockerfile の作成
以下の内容でDockerfileを作成します。
(ここではplugins.txtとDockerfileを同じディレクトリに配置する想定です)

```:Dockerfile
# 公式リポジトリのLTS版のイメージをベースとする
FROM jenkins/jenkins:lts

# セットアップウィザードを無効化する
# （Suggested pluginsのインストールをスキップできる）
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

# デフォルトのログインユーザに"jenkins"を指定
USER jenkins
```

### Dockerイメージのビルド
```shell
$ docker build . -t jenkins:2.164.2
```
("jenkins:2.164.2"は任意のタグ名)
ここでは執筆当時、ベースとなったLTSのJenkinsのバージョンをタグのバージョンに入れています。
なお、LTS指定時のJenkinsのVersionは以下のコマンドで確認可能です。

```shell
$ docker run jenkins/jenkins:lts --version
```


##### その他
上記の方法ではSetupWizardで作る初期アカウントをイメージの中に含むことができないのですが、
(どうやらDockerfileからdocker buildでイメージを作成する場合はNGとのこと)
docker-composeを使うと外から指定できるみたいですので、後日、試してみたいと思います。