13

さまざまなスレーブマシンでテストを実行するJenkins(Hudson)サーバーのセットアップがあります。私がやりたいのは、(リモートAPIを使用して)スレーブを再構成し、スレーブを再起動して変更が有効になるようにしてから、残りのテストを続行することです。私がこれまでに遭遇した2つのハードルがあります:

  1. Jenkinsジョブがスレーブで実行を開始すると、スレーブがダウンしたり、サーバーへのネットワーク接続を切断したりすることはできません。そうしないと、Jenkinsはすぐにテストに失敗します。通常、これは完全に望ましい動作だと思います。ただし、この場合、スレーブがオンラインに戻ってJenkinsが再接続できるようになるまで、またはスレーブがJenkinsに再接続するまで、Jenkinsが中断を受け入れてほしいと思います。
  2. スレーブにアタッチされているジョブでは、スレーブではなく、Jenkinsマスターでいくつかのビルドタスクを実行する必要があります。

これは可能ですか?これまでのところ、Jenkinsまたはそのプラグインを使用してこれを行う方法は見つかりませんでした。

編集-詳細説明 私は本当に、ジェンキンスのスレーブアーキテクチャが本当に好きです。すでに利用可能なプラグインと組み合わせると、スレーブへのジョブの取得、実行、および結果のプルバックが非常に簡単になります。また、一致するスレーブを選択する機能により、ジョブ/テストの自動配布が可能になります。

私たちの状況では、仮想化(VMware)スレーブマシンを使用しています。JenkinsがVMwarePowerCLIを使用して、スレーブで実行する必要があるときにVMを起動し、ジョブをスレーブに送信して結果をプルバックするスクリプトを作成するのは簡単でした。すべて良い。

ただし、各テストのセットアップの一部は、何らかの方法で仮想マシンをわずかに再構成することです。UACを無効にする、別のユーザーとしてログオンする、別のドライバーをインストールするなど。これらの変更を行うたびに、変更を有効にする前にテストVM/スレーブを再起動する必要があります。この再構成と再起動を処理するスレーブオンデマンドスクリプト(Launch Method =マスターでのコマンドの実行によるスレーブの起動)を作成できますが、ジョブを実行する前に実行する必要があります。ここで問題が発生します。構成変更のタイプは実行中のジョブに依存するため、スレーブを早期に構成することはできません。これは、スレーブの開始後にのみ発生します。

考えられる解決策
1)単一のVMで複数のスレーブインスタンスを使用します。これは機能しません-いくつかの構成は相互に排他的ですが、Jenkinsはそれを知りません。したがって、あるジョブに対して1つのスレーブ構成を開始し、別のジョブに対して別のスレーブを開始しようとします。両方のスレーブが同じVM上にあります。スレーブの起動はジョブの一部ではないため、ジョブをロックしてもこれを防ぐことはできません。

2)(最適)スレーブ接続が中断される可能性があることをジョブが認識できるようにするビルドステップ。Jenkinsがスレーブを再接続する方法を認識できるように、ビルドステップにいくつかのオプションを含める必要がある場合があります(スレーブは自動的に再接続し、Jenkinsはスクリプトを実行する必要があり、単純なSSHで十分です)。ビルドステップは、スレーブの切断を処理し、通常はジョブに失敗する切断を無視してから、再接続を実行します。スレーブがバックアップされて実行されると、次のビルドステップが発生する可能性があります。おそらく、スレーブが特定の時間内に再接続できない場合にジョブを失敗させるためのタイムアウト。

**現在の解決策**-最適
とは言えません現在、Jenkinsのスレーブ機能を使用できません。代わりに、WindowsおよびPowerShellスクリプトを使用してVMの電源をオンにし、構成を作成して再起動する一連のビルド手順(マスターで実行)を使用します。VMにはSSHサーバーが実行されており、これを使用してテストファイルをテストVMにアップロードし、リモートで実行します。次に、結果をダウンロードしてJenkinsに戻し、ジョブで処理します。このソリューションは機能的ですが、通常のJenkinsスレーブアプローチよりもはるかに多くの作業が必要です。また、スクリプトは単一のVMを対象としています。奴隷のプールを簡単に使うことはできません。

4

2 に答える 2

9

これがうまくいくかどうかはわかりませんが、Jenkins エージェント ノードがマスター ノードにオフラインであることをプログラムで伝えるようにしてみてください。

これらの手順を実行する Jenkins ジョブを作成する必要がある状況がありました (すべてマスター ノードで実行中)。

  • Jenkins エージェント ノード VM を電源オフのスナップショットに戻します
  • エージェント ノードが切断されていることをマスターに伝えます (VM を元に戻すかハード パワーオフするたびに、マスターはエージェントがダウンしていることを自動的に認識しないように見えるため)
  • エージェント ノード VM の電源を入れ直します
  • 「ビルド後のアクション」として、エージェント ノード VM での実行に制限された別のジョブを起動します

curl POST リクエストを使用してエージェントの切断手順を実行しましたが、もっとクリーンな方法があるかもしれません。

curl -d "offlineMessage=&json=%7B%22offlineMessage%22%3A+%22%22%7D&Submit=Yes" http://JENKINS_HOST/computer/THE_NODE_TO_DISCONNECT/doDisconnect

その後、エージェント ノードを起動すると、エージェントが起動して自動的に接続し、マスターはエージェントがオンラインに戻ったことを認識します (その後、エージェントにジョブを送信します)。

このコマンドを使用して、ノードの可用性のオンとオフを切り替えることもできました (「doDisconnect」の代わりに「toggleOffline」を使用)。

curl -d "offlineMessage=back_in_a_moment&json=%7B%22offlineMessage%22%3A+%22back_in_a_moment%22%7D&Submit=Mark+this+node+temporarily+offline" http://JENKINS_HOST/computer/NODE_TO_DISCONNECT/toggleOffline

(同じコマンドを再度実行すると、ノードの状態が正常に戻ります。)

上記は当てはまらないかもしれません。エージェント ノードで実行されている 1 つの jenkins ジョブからすべてを実行したいように思われるからです。また、ジョブの実行中にエージェント ノードが切断されたり、オフラインになったりするとどうなるかわかりません。:)

それでも、このRemote Access API docを少し調べて、この種のアプローチで他に何ができるかを確認してください。

于 2011-05-12T19:52:10.707 に答える
3

非常に簡単。マスターで実行されるマスター ジョブを作成し、そのマスター ジョブからクライアント ジョブをビルド ステップとして呼び出します (これは新しい種類のビルド ステップであり、私はそれが気に入っています)。マスター ジョブがクライアント ジョブの終了を待機する必要があることを確認する必要があります。その後、スクリプトを実行してクライアントを再構成し、クライアントで 2 番目のテストを実行できます。

さらに優れた戦略は、スレーブ マシンで 2 つのノードを実行することです。Jenkins で 2 つのノードを構成する必要があります。私はその戦略をUNIXスレーブでうまく使用しました。その理由は、さまざまな環境変数を設定する必要があり、それをジョブにプッシュしたくなかったからです。私は ssh クライアントを使用したので、異なるクライアント タイプで可能かどうかはわかりません。両方のテストを同時に実行したり、ジョブをチェーンしたり、上記のマスター戦略を使用したりできます。

于 2011-06-22T20:07:33.967 に答える