はじめに
JenkinsのマスターをLinuxで、スレーブをWindowsサービスで動かすということをやりたくて
色々調べたのですが、できるまでに結構時間がかかったので、メモ書きレベルですが残しておこうと思います。
マスター側の設定はハマるポイントがないので、かなり省略します。
環境
マスター:CoreOS on VirtualBox 5
スレーブ:Windows 7 64bit
スレーブ(Windows)側の設定
- レジストリエディタでHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\SystemにLocalAccountTokenFilterPolicyという名前で作って、1を設定 →詳細はこちら
- HKEY_CLASSES_ROOT\CLSID\76A64158-CB41-11D1-8B02-00600806D9B6}を右クリック→アクセス許可→所有者を管理者(Administorators)に変更。マスターのノード設定で管理者ユーザーにするユーザーにフルコントロールを与える。そのあとに、所有者をNT SERVICE¥TrustedInstallerに戻す
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winregにマスターのノード設定で管理者ユーザーにするユーザーにフルコントロールを与える。
- WindowsサービスのRemote Registry Serviceを起動
- ファイヤウォールでtcpのポート135, 139, 445を受信許可
- ファイヤウォールでudpのポート137, 138を受信許可
- ファイヤウォールでC:\WINDOWS\system32\dllhost.exe を受信許可
マスター(Linux)側の設定
- Jenkinsのページを開いて、新規ノードを追加
- リモートルートはスレーブに置かれるJenkinsのワークスペースの位置になるのでお好きなところを選択
- 起動方法は、WindowsサービスとしてこのWindowsスレーブを制御 を選択
- スレーブ(Windows)の管理者ユーザー名とパスワードを入力
- スレーブのサービスを動かすユーザーは、基本Use Local System Userで良い。他のユーザーにしたり、管理者ユーザーを使うこともできるが、それらのユーザーにWindowsでサービス起動権限を振らないと動かないので、Local System Userで特段問題ないはずです。
- 保存
- 保存した後は、Jenkinsマスター側が自動的にリモートルートの位置にjarとかexeとかをもりもりコピーし、気が付くとWindowsサービスにJenkinsスレーブサービスが出来上がり勝手に起動します。
動作の概要(推測)
おそらくスレーブのサービスが起動するまでは下図のようなことが起こっていると思っています。※推測なので誤りが多分に含まれているかもしれません。
その他
環境のせいなのか定かでないですがマスターからスレーブにjarやらを転送するのが、とてつもなく遅かったです。550KB程度のjar送るのに10分くらいかかったり、、、