私は、約 40 個のノードが接続された Jenkins サーバー (2.89.4 を実行) を管理しています。各ノードは Centos7、OSX、または Windows (7、8、10) を実行しています。最近、停電が発生し、多くのスレーブがマスターへの接続を失いました。そのため、すべてのスレーブを再接続するには、多くの手動リモート処理と SSH 接続が必要でした。それ以来、各スレーブ プロセスがサーバーを実行していることを確認していますが、これらのスレーブが実行しているすべての VM および/またはボックスを自動的に再起動できる追加のセーフティ ネットが必要です。問題は、オペレーティング システムにはさまざまな種類があるため、それを実行する簡単な方法がないことです (私が知る限りでは)。
Groovy スクリプトの使用を試みたのですが、これは主にマシン自体ではなくスレーブ サービスを再起動するためにのみ使用できます。これが私の参考資料です: https://wiki.jenkins.io/display/JENKINS/オフラインスレーブの監視と再起動
Ansible アプローチも検討しましたが、多くのマシンはアクセスできず、Ansible では Windows と Unix で異なるタイプのスクリプトが必要になります。
これまで私が見た中で最も良いアプローチは次のとおりです。 https://stackoverflow.com/questions/29165080/restart-jenkins-slave-from-master
しかし、これを各スレーブで実行する方法の説明はなく、1 つのスレーブで実行されるように見えるだけです。これまでにこのようなことをした人はいますか? プラットフォームに関係なく、shutdown -r -f
Jenkins に接続されているすべてのノードを ( などのコマンドを使用して) 再起動する単一のジョブまたは単一のスクリプトを作成したいと思います。
答え1
私は、マルチ構成ジョブを作成し、すべてのスレーブを名前で選択することでこの問題を解決しました。次に、「実行ノード」に基づいて 2 つの条件付きステップを追加しました。最初のステップでは Windows スレーブのみを選択し、2 番目のステップでは Mac/Centos スレーブのみを選択しました。各条件付きステップには、Windows 条件には Windows バッチ コマンドの実行、UNIX セクションにはシェルの実行という 1 つのステップを追加しました。バッチ ボックスとシェル ボックスの内容は次のとおりです。
バッチ:
echo "Restarting Windows Machine...."
hostname
shutdown -r -f
シェル:
echo "Restarting Unix Machine...."
hostname
sudo shutdown -r now
テスト前に誤ってすべてを再起動しないように、ジョブ内のシャットダウン手順を今のところコメント アウトしました。これを実行する前に、必ずそれらのコメントを解除してください。