[Jenkins] 1つのPCで複数のスレーブを動かす

# 目次
1. 複数のスレーブを動かすための手順 (SlaveにWindows Serviceを使用する)
2. Slave Service の実行ユーザを変更する (トラブル対応)

# 1. 複数のスレーブを動かすための手順 (SlaveにWindows Serviceを使用する)
**1. slave-agent.jnlp を管理者権限で実行します。下記の「A, B」どちらかの方法で実行します。**

```
# A. コマンドライン
1. 管理者権限でコマンドライン(Power Shell or コマンドプロンプト)を開く
2. slave-agent.jnlp を実行する
> PS C:\Users\USER_NAME\Downloads> .\slave-agent.jnlp

# B. メニュー
slave-agent.jnlp を右クリックしてメニューから「管理者権限として実行」で実行する
```
---
**2. 起動後、メニューから`File > install as service`を選択する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153980/2f3f0b34-0f9d-c92a-3bf9-78a9ccf46891.png)

成功するとスレーブのワーキングディレクトリに **jenkins-slave.exe** と **jenkins-slave.xml** が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153980/9de6a5d4-7058-7ae3-9331-2a37f3299c07.png)

---
**3. `install as service` で作成されたスレーブのサービスを停止します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153980/c3b1005d-9abd-f653-1ba7-fe49b27f9501.png)

---
**4. スレーブのサービス設定を変更するためにWindows サービスから設定を削除します**
スレーブのワーキングディレクトリに移動し、
**管理者権限でコマンドライン(Power Shell or コマンドプロンプト)を開いて**下記を実行します。
※ タスクマネージャーのサービス一覧は自動更新されないので `表示 > 最新の情報に更新` が必要です。

```
(PowerShellの場合)
PS D:\JenkinsSlaveTest> .\jenkins-slave.exe uninstall
```

---
**5. jenkins-slave.xml を編集する**
スレーブのワーキングディレクトリ内にある jenkins-slave.xml をテキストエディタで編集します。
初めは下記のような状態になっているため、id と name を変更して保存します。

```
<service>
  <id>jenkinsslave-D__JenkinsSlaveTest</id>
  <name>Jenkins agent (jenkinsslave-D__JenkinsSlaveTest)</name>
  <description>This service runs an agent for Jenkins automation server.</description>

↓↓↓　id と name を変更　↓↓↓

<service>
  <id>jenkins-slave-two</id>
  <name>Jenkins Slave Two</name>
  <description>This service runs an agent for Jenkins automation server.</description>
```

---
**6. Windows サービスにスレーブを登録します**
スレーブのワーキングディレクトリに移動し、
**管理者権限でコマンドライン(Power Shell or コマンドプロンプト)を開いて**下記を実行します。

```
(PowerShellの場合)
PS D:\JenkinsSlaveTest> .\jenkins-slave.exe install
```

成功すると、このようにサービスで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153980/d0ebea26-f48a-3cfd-9273-62e86de647d0.png)
「実行中」が「停止」になっている場合は右クリックでメニューを開き、**開始**を選択してください。

以上でスレーブの移行は終了です。
マスターの設定画面で、先に新しいノードの設定を行った後、次のスレーブで同じ手順を行ってください。
※ 新たに設定したノードに割り当てられたURLと **jenkins-slave.xml** 中に記載している `<arguments>` のJnlpURLが同じになるようにして下さい。

# 2. Slave Service の実行ユーザを変更する
スレーブ立ち上げをする際に `slave-agent.jnlp` をユーザ実行している状態から `windows service` で実行している状態へ変わったため、
スレーブのタスクを実行するユーザが変わっています。
そのため、タスクの実行状況(環境変数など)が変わり、問題が起きる場合があります。

```
(slave-agent.jnlp をユーザ実行している場合)
D:\JenkinsSlaveTest\workspace\WhoamiTask> whoami
workpc\okazaki

(windows service で実行している場合)
D:\JenkinsSlaveTest\workspace\WhoamiTask> whoami
nt authority\system
```

問題が起きた場合は、windows service で実行しているスレーブのサービスの起動するユーザを変更してください。
[[Windows] サービスを起動するユーザを変更する](https://pasomaki.com/windows-service-user/)

また、下記のようなエラーで実行するユーザの変更に失敗した場合はこちらを試してみてください。
[実行アカウントに対してサービス ログオンアクセス許可を有効にする | Microsoft Docs](https://docs.microsoft.com/ja-jp/system-center/scom/enable-service-logon?view=sc-om-2019#enable-service-log-on-permission-for-run-as-accounts)

```
ローカルコンピューターのJenkinsサービスを開始できません。
エラー 1069: ログオンに失敗したため、サービスを開始できませんでした。
```


## 参考
**複数のスレーブを動かすための手順 (SlaveにWindows Serviceを使用する)**
[Distributed builds - 日本語 - Jenkins Wiki](https://wiki.jenkins.io/display/JA/Distributed+builds#Distributedbuilds-%E5%90%8C%E3%81%98%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A7%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%B9%E3%83%AC%E3%83%BC%E3%83%96%E3%82%92%E7%A8%BC%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B)
翻訳元: [Distributed builds](https://wiki.jenkins.io/display/JENKINS/Distributed+builds#Distributedbuilds-RunningMultipleAgentsontheSameMachine)