DockerコンテナでJenkinsを起動する手順

# 主題
「勉強会で使いたいのでJenkinsに相乗りさせてほしい」という要望を頂いたので備忘です。

昔は、1人のJenkinsおじさんに頑張ってもらうこと多かったのですが。

最近は、ひと昔前に比べて環境クリーンに＆簡単に、Jenkins動かすことが出来るので。
これに取り組みたくなったときの手順をまとめます。

## 相乗りしない方がよい理由

* 一時利用で作った資源メンテが簡単
  * 「何このユーザ。。」や「このジョブ誰の？」みたいなことが無くなる
* 相乗り先の、Jenkins用途への影響を気にする必要なくなる
  * 「本番ノンデグ確認ジョブ実行したい。一時利用は、時間制限！」など調整が不要になる
    * 相乗りされる側も、する側も嬉しい 
* Jenkinsバージョンアップが楽
  * Dockerイメージのバージョン上げれば完了 
    * 移行したい資源あれば個別対応は必要
      * そもそも…一時利用で、持ち越したい資源、とは…？

## 手順まとめ時の前提条件

* 公式ガイドは[github.com jenkinsci/dockerのReadme](https://github.com/jenkinsci/docker/blob/master/README.md)を参照しました。
  * commit hashは以下でした。
    https://github.com/jenkinsci/docker/commit/0a28626ac3064d1b1e35934843e311dff01256cf

* docker hubは[こちら](https://hub.docker.com/r/jenkins/jenkins)でした。
  * newest tagは以下でした。
    `jenkins/jenkins:2.414.3-slim-jdk17`
  * 今回利用したimage tagは以下でした。
    `jenkins/jenkins:2.414.3-lts-jdk17`

* docker host側の環境情報は以下のとおりでした。

```text
docker host os :
Windows 11 Home
22621.2428

docker info:
Client:
 Version:    24.0.6

Server:
 Server Version: 24.0.6
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
```

## 手順まとめ

2つの観点で、まとめます。

* 「とりあえず動かしてみたい」場合の最小手順

以下の流れで取り組みます。

1. Jenkinsのdocker imageをpullする
1. Jenkinsのdocker containerをrunする
1. Jenkins初回設定Webページにアクセスする
1. 初期設定する
1. 実行確認:Jenkinsダッシュボードでジョブ作成＋ジョブ実行

* 「とりあえず動かせた」以降の気になるポイント

以下を補足します。

1. デフォルトから設定値を弄りたい
2. 停止した場合に、どうなるか知りたい(ジョブ実行結果は消えるか？)

## 「とりあえず動かしてみたい」場合の最小手順

### Jenkinsのdocker imageをpullする

以下コマンドでdocker imageをpullします。

```cmd
docker pull jenkins/jenkins:lts-jdk17
```

### Jenkinsのdocker containerをrunする

以下コマンドでdocker containerをrunします。

```cmd
# コンテナ起動失敗時に、自動で再起動したくない場合は`--restart=on-fairure`を削除。
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
```

runした際に、標準出力に、Jenkinsの`admin`ユーザのパスワードが表示されます。
後で使うのでメモします。

忘れた場合は、Jenkinsコンテナ内の以下ファイルにも載っています。

```
cat /var/jenkins_home/secrets/initialAdminPassword
```

### Jenkins初回設定Webページにアクセスする

docker hostから以下URLにアクセスします。
該当ポートを外部公開して、他の環境からアクセスしたい場合は`localhost`や`8080`を読み替えてください。

```text
http://localhost:8080/
```

### 初期設定する

初回設定Webページから、初期設定を行います。
先ほど控えたJenkinsの`admin`ユーザのパスワードを入れます。
![unlock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/248fe85d-7742-fdba-8874-712951d16e56.png)

プラグイン初期設定の画面が開きます。スクショ割愛。
  * 今回は左側（`Install Suggested Plugins`）を選びました。
  * 右側（`Select plugins to install`）を選ぶと、お好きなpluginを明示指定して導入できます。

プログレスバーが出るので待ちます。
![getting started.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/c9555dda-ae54-c9c2-6494-be372120f117.png)

セットアップが完了すると、今ログインした`admin`以外の管理ユーザ作成を提案されます。
`Skip and continue as admin`を選んで、
`admin`ユーザでの作業を継続します。
![create first admin user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/916580af-9e5e-99d1-7888-d1bb1e6dee34.png)

Jenkins URLの設定を確認されます。
今回は、デフォルト値のまま進めます。
![instance configuration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/d3b7f1f9-c855-1c96-b9a4-9734d7b63b50.png)

`Jenkins is ready!`となったら完了です。
`Start using Jenkins`ボタンを押しましょう。
![Jenkins is ready.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/fffee4c0-3cfb-5ba8-b358-0601eaedde82.png)

Jenkinsおじさんが出迎えてくれます。

![jenkins dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/bf8b7fb7-682f-0684-e6b1-f7c25d997493.png)

### 実行確認:Jenkinsダッシュボードでジョブ作成＋ジョブ実行

Jenkinsおじさんが仕事できることを確認します。

さきほどの画面で`Create a job`をクリックします。

![ジョブ名入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/02919615-5def-1e87-ab28-12fc3022d2b9.png)
お好きなジョブ名を入れて`フリースタイル・プロジェクトのビルド`を選び`OK`します。

ジョブ設定画面が表示されます。
スクショ後述してますので、入力前は割愛。

今回は動作確認として「ジョブ実行した直後のカレントパスを表示」してみます。
`Build Steps` から`ビルド手順の追加`を選び`シェルの実行`を設定します。

出てきたフォームに`pwd`コマンドを入れます。

![ジョブ設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/486eef3d-9ed0-ba7d-183b-181f2dc61329.png)

:::note info
注意点
docker container側のOS上で、ジョブ実行されます。
今回docker host側はWindowsですが、
docker container側はLinuxなので`シェルの実行`であり`pwd`です。
:::

画面下部から`保存`ボタンをクリック。
ジョブ設定を保存します。

以下の画面に遷移します。

![ビルド実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/9c8758f7-63b8-8c1e-47cf-cd0f0186570b.png)

続けて、いまほど作成したジョブを実行します。
同画面の`ビルド実行`を選びます。

左下に、ビルド履歴が表示されます。
`SUCCESS`で実行終了していれば正常動作です。

![ビルド実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/cf58f9b1-ec9f-b751-ce1a-80c724fafd8b.png)

ビルド履歴の`#1`をクリックして、実行結果を確認します。

![ビルド実行結果の確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32882/f910b82d-4f07-a1ad-1062-c67971d46ef8.png)

以上です。

## 「とりあえず動かせた」以降の気になるポイント

以下を補足します。

* デフォルトから設定値を弄りたい
* コンテナ停止した場合に、どうなるか知りたい(ジョブ実行結果は消えるか？)

### デフォルトから設定値を弄りたい

以下の手順で取り組みます。

1. Jenkinsのdocker imageをベースに、groovyスクリプトとDockerfile介して新規DockerImageを作成
1. 上記DockerImageからdocker containerをstartする

公式ガイド該当箇所は以下です。
`executors`(=Jenkinsジョブ並行実行の最大数)デフォルト設定値`2`を、書き換える事例で示しています。

https://github.com/jenkinsci/docker/blob/master/README.md#setting-the-number-of-executors

設定を変えるとJenkins設定ファイルが書き換わります。
ファイルパスは、docker container内の以下です。

```text
/var/jenkins_home/config.xml
```

### コンテナ停止した場合に、どうなるか知りたい(ジョブ実行結果は消えるか？)

docker containerのボリューム内にデータが残ります。
公式ガイド該当箇所は以下です。

https://github.com/jenkinsci/docker/blob/master/README.md#backing-up-data

コンテナ削除時に、データを永続化したい場合は
docker host側フォルダを適宜、docker containerにマウントします。