web-dev-qa-db-ja.com

Jenkinsスレーブをマスターから再起動します

製品のパフォーマンスメトリックをキャプチャするには、jenkinsマスタースレーブ構成を使用します。 jenkins-slaveはメモリを蓄積する傾向があるため、キャプチャされるパフォーマンスメトリックに影響することが観察されています。

キャプチャされるメトリックの一貫性を確保するために、スレーブで実行中のジョブがないときに、マスターから毎日ジェンキンススレーブを再起動することを考えています。これは可能ですか?

どうすればそれを達成できますか?

注:jenkins-slaveをサービスとして使用することは、他のセキュリティアクセスの問題があるため、オプションではありません。

12
Praneeth

私はこの答えが少し遅れて来ていることを知っています:

これは私が同じ理由で同じことをした方法です、これがこれを達成するための最良の方法であるかどうかはわかりませんが、私たちの問題の多くを解決しました:

Windowsマシンの場合:

  1. Windowsマシンで「shutdown -r -f」を実行するだけのジョブを作成します。マシンを再起動します。
  2. 次に、オンライン部分に戻します。あなたと同じ理由で、私は「サービスとしてのジェンキンス・スレーブ」を使いませんでした。代わりに、JNLPクライアント経由で接続するようにノードを構成し、Windowのタスクスケジューラで各ノードにslave.jarコマンドを追加しました(起動時に実行するため)
  3. これで、ジョブはマシンを再起動し、Windowsマシンは再起動直後にJenkins自体でオンラインになります。

Macマシンの場合:

  1. このプロセスは、Macでは比較的簡単です。まず、Macノードで「shutdown -r now」を実行するジョブを作成します

  2. ノードは、ssh経由で接続するようにセットアップするだけです。これで、Jenkinsでオンラインで表示できるようになります。

これは、自動化に使用されたすべてのマシンを再起動するためのスクリプトの「実行シェル」部分でした:

distro=`uname`
if [ "$distro" = "Windows_NT" ] || [ "$distro" = "WindowsNT" ] ;then
echo "Restarting Windows Machine...."
shutdown -r -f
else
echo "Restarting Mac Machine...."
Sudo shutdown -r now
fi

PS:

質問と正確に関連しているわけではありませんが、指定した状況に役立つ場合があります。 Windowsマシンの起動時に一時ファイルを消去するバッチスクリプトを追加することをお勧めします。 Windowsマシンのスタートアップフォルダーにあるバッチスクリプト(Say、cleanTemp.bat)に以下を追加します。 (Windows 10の場合、C:\ Users \\ AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)

rmdir %temp% /s /q

md %temp%
8
Tushar Dwivedi

それでも答えが必要な場合: https://wiki.Apache.org/general/Jenkins#How_do_I_restart_a_Jenkins_Unix_Slave.3F

ただ、切断しただけで、スレーブでプロセスが停止したことがわかりました。手動で殺す必要はありませんでした。その後、スレーブを再度起動し、それで終わりです。

これはWeb UIから良いことです。まだCLIを検索していません。

4
Doron Veeder
  1. ジョブを作成します(例: 「Reboot-Slave」、シェル「shutdown -r -t 0」で設定し、ターゲットスレーブ名をパラメーターとして使用します。 (このようにして、再起動コマンドは再起動するターゲットスレーブで直接実行されます。)

  2. 別のジョブを作成します「Reboot-Check-Slave-Online」、このジョブでは、最初のジョブを呼び出し、ターゲットスレーブ名をパラメーターとして渡す必要があります。さらに、スレーブが再起動を完了してJenkinsに接続したかどうかを判断するロジックを記述する必要がありますサーバーに再度、ジョブに「システムgroovyスクリプトの実行」ステップを追加して実装し、以下のコードを記述します。

    import hudson.model.*
    
    def target_slave_param = "target_slave"
    def resolver = build.buildVariableResolver
    def target_slave = resolver.resolve(target_slave_param)
    
    println "target_slave is: ${target_slave}"
    
    def status = 0;
    
    //do{
    println "Searching for ${target_slave}";
    slave = Hudson.instance.slaves.find({it.name == target_slave});
    
    if (slave != null)
    {
      computer = slave.getComputer();
      if (computer.isOffline())
     {
        println "Error! $target_slave is offline.";
        status = 1;
      }
      else 
      {
        println "OK: $target_slave is online";
      }
    }
    else 
    {
      println "Slave $target_slave not found!";
      status = 1;
    }
    //}
    
0
ppokyou