MAC(複数台)の分散ビルド
前提
-
用意するもの
- MAC複数台
- ツール/ライセンスをMAC数分 (私のケースだと「Unity Pro」ライセンスがMAC台数分必要でした)
-
できること
- ジョブ(ビルド)の分散
-
できないこと(やり方が分からないので誰か知ってたら教えてほしい)
- 分散の優先順変更
- ワークスペースのクリア(後述:カスタムワークスペースとの連携)
手順
指示を出すMAC=マスターMAC
処理をするMAC(たち)=スレーブMAC
とします。
※ MACのスペック差があるのでしたら、スレーブMAC の方に高スペックを割り当てた方が無難です。
1.マスターMACにJenkinsを入れる
2.「Jenkinsの管理」-「ノードの管理」-「新規ノード作成」を選択
「ダムスレーブ」→「OK」
「同時ビルド数」
スレーブMACに同時に任せられるジョブ数「リモートFSルート」
スレーブMACのどこにworkspaceを配置するか
例)/Users/Shared/hoge_mac_slave どのMACからのスレーブフォルダかわかるようにしておいた方がいいと思う。「用途」
「このスレーブをできるだけ~」とするとマスターMACの全てのジョブをスレーブでやろうとしちゃうので、個人的には「このマシーンを特定のジョブ専用にする」にしておく「起動方法」
「SSH経由で~」にして、「ホスト=スレーブMACのIPアドレス」、「認証情報=スレーブMACのログインIDとパスワード」
(※スレーブMACの共有設定-リモートログインに許可をいれておく)
で「保存」
3.マスターMACでジョブを作成
- 「実行するノードを制限」
「slave01(※さきほど作ったノード名) || master(自分自身)」
とすると、スレーブMAC→(忙しければ)マスターMACの順にビルドをしてくれる
※これをマスターMAC→(忙しければ)スレーブMAC にできないものか…
これでOK
Tips
Unityビルドをする場合
「Unity3d plugin」を入れている場合、
「jenkinsの管理」で「Unity3d」を設定していると思われる。
そのためマスターMACとスレーブMACのUnityの名前と置き場所は同じにしておかないとエラーになる!
MAC | Unityの名前 | Unityの置き場所 |
---|---|---|
マスターMAC | Unity5.0.2 | /Application/Unity5.0.2 |
スレーブMAC | /Application/Unity502 |
マスターMAC中心で「Unity5.0.2」でビルドと設定していると、スレーブMACの「/Application/Unity5.0.2」フォルダを探してしまう。。。
マスターMACとスレーブMACで置き場所を統一しておかないといけない。
上流/下流プロジェクトを使う場合
ジョブAをマスターMACでやってその成果物を使ってジョブBをしてもらうはずが、ジョブBがマスターMACで実行されてしまった!?→そしてエラー…。
ジョブを同じノードで実行するには
「Parameterized Trigger Plugin」
というJenkinsプラグインをインストールしておく
- 上流ビルドのビルド後の作業に「Trigger build without parameters」で下流ビルドを追加 標準メニューの「他のプロジェクトのビルド」をこっちに置き換える
- 「Add Parameters」で「Build on the same node」を設定 これで、上流ビルドと同じノード(MAC)で下流ビルドを行ってくれます!
カスタムワークスペースとの連携
正直文章ではうまく説明できる気がしないのだが・・・。
▼まず、ノードで急にフォルダ構成を変えてくるJenkinsさん。。。
- Jenkins(Master)のデフォルトのワークスペース
/{JENKINS_HOME}/jobs/{JOB_NAME}/workspace
- Jenkins(slave)のデフォルトのワークスペース
/{リモートFSルート}/workspace/{JOB_NAME}
※リモートFSルート:ノード設定で設定したパス
What's!? なぜにフォルダ構成を変えるのかJenkinsさんよ・・・・
まあ普通のビルドならそれでも良いです。
ただ、これがカスタムワークスペースと非常に相性が良くない!!(と個人的に思った)
▼具体的な問題
JOB_AAAをJOB_BBBのワークスペースで一緒にやろうとしていた。
マスターだけでやっていた時は、JOB_AAAのカスタムワークスペースに「jobs/JOB_BBB/workspace」と記述するだけで同じワークスペースを使ってくれていた。
しかし、こいつがスレーブ(ノード)で動かすと…
JOB_AAAは「/{リモートFSルート}/jobs/JOB_BBB/workspace」
JOB_BBBは「/{リモートFSルート}/workspace/JOB_BBB」(※ 上記デフォルトのワークスペース参照)
とそれぞれ別のワークスペースで実施されていた。。。
▼最終的にやったこと
- JOB_HOMEという環境変数をマスター(システムの設定)、スレーブ(ノードの設定)で作成。
JOB_HOME=${JENKINS_HOME}/jobs
JOB_HOME=/Users/Shared/hoge_mac_slave/jobs
- 全てのジョブにカスタムワークスペースを適用
${JOB_HOME}/JOB_BBB(ジョブ名)/workspace
こうすることで、マスターのワークスペースを維持した状態で、かつスレーブの意図したところにワークスペースを作成できる