[メモ] docker-compose による Groovy on Jenkins 実行環境の構築


## 概要

既存 Jenkins ジョブの Pipeline が Scripted による記法で Groovy を使用していることがある.
また、Pipeline だけでなく、Jenkins ジョブなどでも Groovy を使用していることがある.

これらの挙動調査のために、(Jenkins の WEB-IF や Jenkins ジョブを実行せずに) 実装した
Groovyコードのみで (Jenkins ジョブと同内容を) 実行できる環境を構築したときの記録である.


## 詳細

既存の Jenkins ジョブで Groovy が使用されていたが、ログと照し合せて見ても
処理がとても長く複雑で解読ができなかった.

かといって、Jenkins ジョブを実行するわけにもいかない、という状況であった.

そこで、Groovy on Jenkins (by docker) を構築して、コマンドライン (Bash Shell) から
Jenkins ジョブの一部を実行できるようにした、ということである.
(要は、Bash Shell コマンドラインで Jenkins Script Console と同等のことができるようにした.)

これにより、実装されていた処理を部分的に切り出して処理を追跡し、調査をしたという次第である.

## 手順

### 1. Jenkins (Master 1台、Slave 3台) の Docker を構築する

下記 URL の記した手順で構築すること.
同一物理ホスト上に Master 1台、Slave 3台 が JNLP 通信した状態で起動する.

・https://qiita.com/robozushi10/items/f6ff1aade15ab2bd06a1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/f20f86c2-1ed7-fe85-06eb-40b91e2e374c.png)

|役割|ホスト側ポート|コンテナ側ポート|補足|
|:--|:--|:--|:--|
|Jenkins Master|43080|43080||
|Jenkins Slave(1)| - | - |Docker on Docker も可能である|
|Jenkins Slave(2)| - | - |Docker on Docker も可能である|
|Jenkins Slave(3)| - | - |Docker on Docker も可能である|


### 2. コンテナ内の /var/jenkins_home の権限を jenkins:jenkins にする

余計なトラブル回避のためにも、
Jenkins の Master の /var/jenkins_home の権限を `jenkins:jenkins` にしておくと良い.

```bash
$ docker-compose exec jenkinsmaster \
    bash -c 'chown -R jenkins:jenkins /var/jenkins_home'
```


### 3. コンテナ内に Groovy をインストールする

#### 3-1. コンテナに Groovy インストールに必要な zip, unzip をインストールする

```bash
$ docker-compose exec jenkinsmaster \
    bash -c 'apt-get update -y; apt-get install -y zip unzip'
```

#### 3-2. コンテナに jenkins ユーザでログインする

```bash
$ docker-compose exec --user jenkins jenkinsmaster bash
```

#### 3-3. SDKMAN をインストールする

次のメッセージが表示されれば OK.

私は Java には疎い (2021.10時点) のでメモしておくが、
SDKMAN とは jvm で動く系モジュール ( `gradle` や `groovy` など) の管理ツールである. 
(The Software Development Kit Manager の略らしい)

```bash
$ docker-compose exec --user jenkins jenkinsmaster \
    bash 'curl -s http://get.sdkman.io | bash'
略

Please open a new terminal, or run the following in the existing one:

    source "/var/jenkins_home/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!
```

#### 3-4. Groovy をインストールする

```bash
$ docker-compose exec --user jenkins jenkinsmaster \
    bash -c 'source "$HOME/.sdkman/bin/sdkman-init.sh"; sdk install groovy'
```

(上記までの手順をバッチ化しておくと楽だと思う...)



### 4. インストールできたことを確認する

#### 4-1. 適当なサンプルコードを配置する

|コードの引用元|
|:--|
|https://devs.nobushige.net/groovy/26/|

コンテナ内の `/var/jenkins_home/testing/a.groovy' に作成する

```bash
$ docker-compose exec --user jenkins jenkinsmaster \
    bash -c 'mkdir -p $HOME/testing/'

$ cat <<'EOL' |tee PV/jenkinsmaster/jenkins_home/testing/a.groovy
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

def ldt = LocalDateTime.now()
def formatter = DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss.SSS')
println ldt.format(formatter)
EOL
```

#### 4-2. 実行する

```bash
$ docker-compose exec --user jenkins jenkinsmaster \
    bash -c 'source "$HOME/.sdkman/bin/sdkman-init.sh"; groovy $HOME/testing/a.groovy'
2021/07/31 04:37:26.238
```

### 5. Jenkins 用の jar ファイルを参照するようにする

Jenkins の WEB-UI から実行すると正常実行できるが、
ターミナルから直接 groovy ファイルを実行すると API が見つからずにエラーになることがある.

この場合は、Jenkins が提供する API (jar) を見つけ出せていないことが原因である.
そこで、Jenkins が公開する jar ファイルを探索パスに追加してやる

```bash
$ vim PV/jenkinsmaster/jenkins_home/.bashrc
略
export CLASSPATH=$CLASSPATH:/var/jenkins_home/war/WEB-INF/lib/jenkins-core-2.314.jar
略
```

　

以上.