LoginSignup
6
9

More than 1 year has passed since last update.

JenkinsのスレーブをWindowsサービスとして動作させるためにやったこと

Last updated at Posted at 2021-10-29

JenkinsのジョブをWindowsマシンでビルドするために、スレーブの設定を行おうとした場合に、手っ取り早くやるならbat経由でフォアグラウンドでスレーブを起動する感じになるかと思います

ただ、この運用方法ですと、

  1. batを叩いてスレーブを起動
  2. いつの間にかエラーが出て、スレーブがオフラインになる
  3. 定期実行によってジョブがビルドされる
  4. ビルド先のスレーブがオフラインなので、ビルドキューに溜まっていく。。。
  5. 1に戻る

という負のループが出来上がりました
しかも、このエラーの原因がよく分からず。。。

毎回、手動でスレーブを再起動するのがシンドイため、どうにかならないものかと悩んでいたところ、
「Windowsサービスとしてスレーブを動かせば、エラーで落ちても自動的に再起動してくれる」
との情報を得て、調べてみました

調べてみると、レジストリーを弄る系の記事ばかり出てきて、
流石にそこら辺を弄るのはなぁ。。。と思っていたら、ドンピシャの記事を見つけまして、
実際に試したところ、ちゃんと想定した通りの動作が実現出来たため、こちらでご紹介させて頂きます

同じような悩みをお持ちの方がいましたら、ご参考になれば幸いです

ちなみに、下記が参考にした記事となります
https://hayato-iriumi.net/2019/05/23/how-to-install-jenkins-slave-as-windows-service/

事前準備

下記に関しては、記事内では触れないため、事前に行っておいて下さい

  • Jenkinsの構築
  • スレーブとして使用するWindowsマシンにjavaをインストール

ノードを作成する

下記の設定でノードを作成します

ポイントとしては、リモートFSルート には、何も入力せず、(必須ですと書いてありますが無視で良いみたいです、、)
起動方法のプルダウンを Launch agent by connecting it to the master に設定し、
Custom WorkDir path に 任意のディレクトリのパスを指定します

「Custom WorkDir path」 に指定したディレクトリ内に実行ファイルや設定ファイル等、もろもろ配置することになりますので、ドライブ直下に 「jenkins」ディレクトリを作成して、指定するのがオススメです

設定が出来たら、保存 をクリックします

ノードの状態画面でスレーブの起動オプションをコピーする

画像を参考にして -jnlpURL から末尾までコピーします

image.png

jenkins-slave.xmlを作成する

D:\jenkins の中に jenkins-slave.xml ファイルを作成します

「D:\jenkins」は、ノード作成時に指定して頂いた 「Custom WorkDir path」 のパスのディレクトリです

jenkins-slave.xmlをエディタで開いて頂いて、
下記のコードをコピー&ペーストします

jenkins-slave.xml
<service>
  <id>JenkinsSlave</id>
  <name>Jenkins agent</name>
  <description>This service runs an agent for Jenkins automation server.</description>
  <executable>{java.exeまでのフルパス}</executable>
  <arguments>-Xrs -jar "%BASE%\slave.jar" {前ステップでコピーした内容をここにそのままペースト}</arguments>
  <logmode>rotate</logmode>
  <onfailure action="restart" />
  <download from="https://{Jenkinsのドメイン名を入力}/jnlpJars/agent.jar" to="%BASE%\slave.jar" />
 <extensions>
    <extension enabled="true" className="winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension" id="killOnStartup">
      <pidfile>%BASE%\jenkins_agent.pid</pidfile>
      <stopTimeout>5000</stopTimeout>
      <stopParentFirst>false</stopParentFirst>
    </extension>
  </extensions>
</service>

次に、 {} で表記されている箇所を埋めていきます
ご自分の環境に合わせて埋めて頂ければと思います

  1. <executable>{java.exeまでのフルパス}</executable>
    • 事前にインストールして頂いたjavaのexeまでのフルパスを入力します
    • 例: <executable>C:\Program Files\Java\jdk-11.0.11\bin\java.exe</executable>
  2. <arguments>-Xrs -jar "%BASE%\slave.jar" {前ステップでコピーした内容をここにそのままペースト}</arguments>
    • ノードの状態画面でスレーブの起動オプションをコピーする のステップでコピーしたオプションをここにペーストします
  3. <download from="https://{Jenkinsのドメイン名を入力}/jnlpJars/agent.jar" to="%BASE%\slave.jar" />
    • 事前に構築済みのJenkinsのドメイン名を入力します

ここまで出来ましたら、ファイルを保存します

jenkins-slave.exe.configを作成する

下記の内容で D:\jenkins にファイルを作成します

<configuration>
    <startup>
        <supportedruntime version="v4.0"/>
    </startup>
</configuration>

最新バージョンの winsw-2.x.x-net4.exe をダウンロード

下記サイトから最新バージョンの winsw-2.x.x-net4.exe をダウンロードします
https://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/

この時の最新バージョンは、2.9.0でした 恐らく、最新バージョンであれば大丈夫かとおもいます

image.png

image.png

ダウンロードした winsw-2.x.x-net4.exe を jenkins-slave.exe にリネームして、D:\jenkins に配置します

コマンドプロンプトからサービスをインストールする

管理者権限でコマンドプロンプトを起動します

image.png

カレントディレクトリを変更して、jenkins-slave.exe install を実行します

cd /d D:\jenkins
jenkins-slave.exe install

下記のようなメッセージが表示されればインストール成功です

image.png

サービスを開始する

タスクマネージャーを起動して、サービスタブを開きます
インストールされていれば、JenkinsSlave というサービスが見つかります
この段階では、まだ状態が 停止 になっているため、右クリックメニューから 開始 をクリックします

image.png

サービスが開始されると、状態が 実行中 に変わります

2021-10-08_18h13_07.png

ビルド出来る状態か確認する

Jenkinsを開いて、ノードの状態が Agent is conneced になっていて、ビルド実行状態が 待機中 になっていればスレーブが正常に動作しているため、Windowsマシンでジョブを回すことが出来るかと思います
31ba5754f621abba4f13de719b152e72.png

あとがき

以上の手順で、JenkinsのスレーブをWindowsサービスとして動作させることが出来たかと思います
これでスレーブがエラーでオフラインになった場合でも、自動的に再起動されるため、負のループから脱出出来て、きっと幸せになれることでしょう。。(遠い目)

実は、サービスで動かした場合は、権限がSYSTEMユーザーになってしまうので、フォアグラウンドで動かしていた場合と色々と挙動が異なる部分もあるかと思いますが、そこはヨシナニお願いします。。

では、今回はこの辺で!

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9