JenkinsのスレーブをWindowsサービスとして動かしたい

Author

スレーブ(Windows)側の設定

  1. Javaをインストールする
  2. レジストリエディタでHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\SystemにLocalAccountTokenFilterPolicyという名前で作って、DWord (32-bit) で1を設定
  3. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winregにマスターのノード設定で管理者(ここではjenkins)にするユーザーにフルコントロールを与える。
  4. HKEY_CLASSES_ROOT\CLSID\76A64158-CB41-11D1-8B02-00600806D9B6}を右クリック→アクセス許可→詳細設定→所有者を管理者(ここではjenkins)に変更。マスターのノード設定で管理者ユーザーにするユーザーにフルコントロールを与える。
  5. WindowsサービスのRemote Registry Serviceを起動
  6. ファイヤウォールでTCPのポート 135, 139, 445 を受信許可
  7. ファイヤウォールでUDPのポート 137, 138 を受信許可
  8. ファイヤウォールでC:\WINDOWS\system32\dllhost.exe を受信許可

マスター側の設定

  1. Jenkinsのページを開いて、新規ノードを追加
  2. リモートルートはスレーブに置かれるJenkinsのワークスペースの位置になるので好きなところを選択
  3. 起動方法は、WindowsサービスとしてこのWindowsスレーブを制御 を選択
  4. スレーブ(Windows)の管理者ユーザー名(ここではjenkins)とパスワードを入力
  5. スレーブのサービスを動かすユーザーは、基本Use Local System Userで良い。他のユーザーにしたり、管理者ユーザーを使うこともできる。Incredibuildを使用時に問題が発生したので Use Administrator account given above を選択して管理者ユーザーを指定して解決した。
  6. 保存
  7. Jenkinsマスター側が自動的にスレーブのルートの位置にjarとかexeをコピーします。しばらくするとWindowsサービスにJenkinsスレーブサービスが作成され起動します。

スレーブ(Windows)側の設定

  1. Jenkinsマスターからコピーされたjenkins-slave.exeがサービスに登録されるので、ログオンユーザーを管理者ユーザー名(ここではjenkins)に変更する

 

ユーザー名の先頭に .\ を付けなかった場合, 以下のようなログが出てスレーブの起動に失敗する

ERROR: Failed to create a service: Status Invalid Service Account

ERROR: Message not found for errorCode: 0xC0000001

at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKCR(JIWinRegStub.java:121)

139ポート (NetBIOS セッションサービス) と 445ポート (Windows共有) が利用できない場合は、次のようなメッセージが表示されます。

または、リモートレジストリサービスが起動が起動しているか確認して下さい。

 

該当のエントリ HKEY_CLASSES_ROOT\CLSID{76A64158-CB41-11D1-8B02-00600806D9B6} のOwnerをJenkinsで使うユーザーに変更し、そのユーザーのフルコントロールにする。