[01] docker-compose を使って同一物理マシン上に Jenkins Master(docker) - Slave(docker) [SSH通信]を構築する


## 概要

次のように同一物理マシン上に、Jenkins Master と Slave (共に Docker) を構築する.
この環境は Pipeline を書くときの動作検証などに便利である.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/67fa46c5-396b-2dea-2d34-e6b6ae51be1e.png)

|役割|マシン名|ホスト側ポート|コンテナ側ポート|補足|
|:--|:--|:--|:--|:--|
|Jenkins Master|jenkinsmaster|43080|8080||
|Jenkins Slave(1)|slave001| - | - |Docker on Docker 可能である|
|Jenkins Slave(2)|slave002| - | - |Docker on Docker 可能である|


## 手順

### 1. docker-compose.yml を作成する

```yaml
version: '3.7'
 
services:
  jenkinsmaster:
    container_name: jenkinsmaster
    user: root
    image: jenkins/jenkins:latest
    ports:
      - 34080:8080
    volumes:
      - ./PV/jenkinsmaster/jenkins_home:/var/jenkins_home
  slave001:
    container_name: slave001
    user: root
    image: jenkinsci/ssh-slave
    volumes:
      - ./PV/jenkinsslave/slave001:/var/jenkins_home
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=  # 🛑今は空で良い
  slave002:
    container_name: slave002
    user: root
    image: jenkinsci/ssh-slave
    volumes:
      - ./PV/jenkinsslave/slave002:/var/jenkins_home
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=  # 🛑今は空で良い

```

### 2. docker-compose up -d を実行する

Master と slave001、slave002 を稼働させる.
ただし、この時点では Master と slave001、slave002  は通信できていない.

```bash
$ docker-compose up -d
```

### 3. Master のセットアップをする

`http://IP:34080/` にアクセスして、管理者権限を作成したり Plugin をインストールしたりする.

### 4. Master で RSA 公開鍵・秘密鍵ペアを作成する

#### 4-1. 

以下を実行すると、コンテナ内に公開鍵と秘密鍵がパスフレーズなしで作成される.

```bash
$ docker-compose exec -u jenkins jenkinsmaster \
    bash -c 'ssh-keygen -t rsa -N "" -f /var/jenkins_home/.ssh/id_rsa`
```

#### 4-2.

下記で表示される公開鍵の内容をコピーしておく.

```bash
$ docker-compose exec -u jenkins jenkinsmaster \
    bash -c 'cat /var/jenkins_home/.ssh/id_rsa.pub`
ssh-rsa AAAAB3NnnE4xa3EAAAADAQABAAABAQDAsJmu753NXhjEtkzMLLAxBs55/nSFJ/SqGooBDrSb06Q1lLRmRUdhj11SjHCTzoMwDt9kL7LE4VuxvVPsXxjU6tc31rAznEqj5i471y08mS94D4CUwsHOQvuo8wJiQOC8TAGyRIgKqaW5RKlDuMjlU6T2GdVRco1AAqSk5f+d0p3kAvYGVXmw7x4HX6fcjZZPVcK+xsDLVYy/073KBPDmsyost57OGeYrxDqzczoL79xQ3klPrqs/ZaO5bojEG6hhILCkqCHVv73eM24iUfxQAAnuIV0FXSahQ4keQrtd3YMbyVDK0iwwAxfmdIyLL+onfoPM8n4TFNWpJ9Gb7ZoV jenkins@be4702aeaecc
```

表示された内容を、上述の docker-compose.yml の「JENKINS_SLAVE_SSH_PUBKEY=」に定義してやる. (下記参考)

```yaml
version: '3.7'
 
services:
  jenkinsmaster:
    container_name: jenkinsmaster
    user: root
    image: jenkins/jenkins:latest
    ports:
      - 34080:8080
      - 34000:34000 #! slave との通信ポート
    volumes:
      - ./PV/jenkinsmaster/jenkins_home:/var/jenkins_home
  slave001:
    container_name: slave001
    user: root
    image: jenkinsci/ssh-slave
    volumes:
      - ./PV/jenkinsslave/slave001:/var/jenkins_home
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAB3NnnE4xa3EAAAADAQABAAABAQDAsJmu753NXhjEtkzMLLAxBs55/nSFJ/SqGooBDrSb06Q1lLRmRUdhj11SjHCTzoMwDt9kL7LE4VuxvVPsXxjU6tc31rAznEqj5i471y08mS94D4CUwsHOQvuo8wJiQOC8TAGyRIgKqaW5RKlDuMjlU6T2GdVRco1AAqSk5f+d0p3kAvYGVXmw7x4HX6fcjZZPVcK+xsDLVYy/073KBPDmsyost57OGeYrxDqzczoL79xQ3klPrqs/ZaO5bojEG6hhILCkqCHVv73eM24iUfxQAAnuIV0FXSahQ4keQrtd3YMbyVDK0iwwAxfmdIyLL+onfoPM8n4TFNWpJ9Gb7ZoV jenkins@be4702aeaecc
  slave002:
    container_name: slave002
    user: root
    image: jenkinsci/ssh-slave
    volumes:
      - ./PV/jenkinsslave/slave002:/var/jenkins_home
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAB3NnnE4xa3EAAAADAQABAAABAQDAsJmu753NXhjEtkzMLLAxBs55/nSFJ/SqGooBDrSb06Q1lLRmRUdhj11SjHCTzoMwDt9kL7LE4VuxvVPsXxjU6tc31rAznEqj5i471y08mS94D4CUwsHOQvuo8wJiQOC8TAGyRIgKqaW5RKlDuMjlU6T2GdVRco1AAqSk5f+d0p3kAvYGVXmw7x4HX6fcjZZPVcK+xsDLVYy/073KBPDmsyost57OGeYrxDqzczoL79xQ3klPrqs/ZaO5bojEG6hhILCkqCHVv73eM24iUfxQAAnuIV0FXSahQ4keQrtd3YMbyVDK0iwwAxfmdIyLL+onfoPM8n4TFNWpJ9Gb7ZoV jenkins@be4702aeaecc
```


#### 4-3.

下記で表示される秘密鍵の内容をコピーしておく.

```bash
$ docker-compose exec -u jenkins jenkinsmaster \
    bash -c 'cat /var/jenkins_home/.ssh/id_rsa`
略
```

### 5. Slave のセットアップをする

slave002 の場合を例にする (`slave001` も同じ要領で作成すれば良い)

#### 5-1.

WEB-UI より、「新規ノード作成」で下図のように入力する. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/b9467675-41f8-a0db-a27a-fea97c0adfe9.png)

「認証情報」より次のように入力する.
下図中の「リモートFSルート」は “Slave コンテナ内でのパス” である.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/c4356ff6-cbd5-68fa-8b09-7c4251f8c55e.png)

#### 5-2.

次の要領で上記 [4-3](#4-3) でコピーした秘密鍵の内容を貼り付ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/d1aa1fe4-c691-3b32-ced3-d008a18f2f0b.png)

#### 5-3.

「高度な設定」より Java のパスを設定する.
パスの確認方法は、Slave コンテナにログインをして `which java` をすれば良い.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/b62aa49b-04ec-4765-8255-a2955686e9dd.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/aa787f47-8991-a362-2cee-a5fb49e01e5c.png)


### 6. Slave 用の永続ボリュームの権限を 1000:1000 に変える

コンテナ内の UID, GID 1000 は jenkins である.

```bash
$ sudo chown -R 1000:1000 PV/jenkinsslave/slave002
```

### 7. Master を再起動する

```bash
$ docker-compose restart jenkinsmaster
```

### 8. Slave と通信できていれば OK

WEB-UI から次のようになっていれば OK.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/7d858034-c100-7fd8-2d7d-ddabae48b51c.png)


### 9. PV を丸ごとバックアップしておく

PV を丸ごとコピーしておけば、今後、別 PC でも即座に構築できる

```bash
|-- docker-compose.yml
`-- PV/
    |-- jenkinsmaster
    |   `-- jenkins_home
    `-- jenkinsslave
        |-- slave001
        `-- slave002
```

　

以上