2017-08-02 9 views
0

私は正常ジェンキンス仕事をキックオフするためにこれを使用することができるよ:ジェンキンスジョブがキューIDからIDを作成しなさい

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass

私も使って、この仕事からconsoleTextを取得することができます。

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/lastBuild/consoleText"

しかし、複数のジョブを連続して実行すると、これは縮尺されません。私が最初にcurlコマンドが含まれてリターンを持っていることに気付きました:

Location: http://jenkins_srv:8080/queue/item/123/

私は123は、ジョブキューIDであることを仮定しています。私は背中合わせにジョブ121122、& 123をキュー場合

私の質問は、私は、ジョブキュー項目122の状態を確認するために何を使うのですか?また、最終的にジョブキューアイテム122の結果である実際のビルドIDを特定するために使用するものは何ですか?

ありがとうございます。

答えて

1

そのキュー項目についての情報を返すためにGET http://jenkins_srv:8080/queue/item/123/api/json?pretty=trueすることができます、あなたがhttp://jenkins_srv:8080/queue/item/123/の場所を持っていると仮定すると、(あなたは、フォーマットを気にするか、XMLで結果をしたい場合api/xmlを使用しない場合は、また?pretty=trueを含めることはできません) 。

キューAPIに標準的なドキュメントがあるかどうかはわかりませんが、キューアイテムが完了している(現在作成中の場合もあります)場合、executableノードが表示されます。

"executable" : { 
    "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun", 
    "number" : 10, 
    "url" : "http://192.168.99.100:32769/job/configure/10/" 
} 

することができます、その後GETexecutable.urlで指定されたURLのためのAPI:私のサーバーのための一つは、このように見えました。私の場合、GET http://192.168.99.100:32769/job/configure/10/api/json?pretty=true。そこから、ビルドが現在ビルドされているかどうか、ビルドにかかる時間、結果など、必要なすべての情報が必要です。

また、キューを作ることができますGET http://jenkins_srv:8080/queue/api/json?pretty=true

+0

変数にexecutable.urlの値を設定するにはどうすればよいですか? – vijay

+0

'http:// jenkins_srv:8080/queue/api/json?pretty = true'このURLは一時的です。ビルドが完了した後にキュー項目の詳細を取得する方法は? –

1

私は必要な方向に私を導くのを助けたので、私はKdawgの答えを選びました。ありがとうございました!

私が実装したソリューションがKdawgの答えと異なるため、私自身の答えも含んでいます。私はそれが他の人に価値をもたらすと感じています。

まず、私はジェンキンスを初めて知りました。だから私がミスピークしたら、私を修正してください。第二に、Jenkinsの「キューアイテム」とJenkinsの「ビルドジョブ」には違いがあるという点で、若干の学習曲線がありました。 「キューアイテム」が作成された瞬間には、ビルドジョブが開始されていないため、「ビルドジョブ」IDはありません。また、ビルドジョブが開始されると、キューアイテムは削除される5分前になります。

私はこれらのタスクを実行します。

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass 
curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass 
curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass 

ジェンキンスがキューで実行する3つの構築ジョブをスケジュールします。これらは「キュー項目」になります。これらの「キュー項目」には「キューID」があります。私の元の質問で与えられた例では、これらの3つのカールコマンドが "キューID"を持つキュー項目 "121"、122、& 123を作成するとします。

なぜこれが重要ですか?

Jenkinsサーバーの負荷によっては、キューに入れられたアイテムがすぐに実行される場合と実行されない場合があります。それがすぐに実行されるなら、Kdawgの答えは間違いなく正しいです。彼のコマンドを実行:

curl -X GET http://jenkins_srv:8080/queue/item/121/api/json?pretty=true --user name:pass 
curl -X GET http://jenkins_srv:8080/queue/item/122/api/json?pretty=true --user name:pass 
curl -X GET http://jenkins_srv:8080/queue/item/123/api/json?pretty=true --user name:pass 

これは、それぞれの「キューアイテム」についてのキュー情報を取得し、ビルドジョブが開始された場合を返すものの中に、「仕事を構築し、」IDを取得する方法は、確かにそこにあります。ビルドジョブがまだ開始していない場合、この情報は空白になります。

ここには、私が感じている、付加価値のある部分があります。

ビルドジョブが開始されると、Kdawgの回答の情報は、3つのcurl -X GETコマンドに対する応答に取り込まれます。また、デフォルトでは、Jenkinsは5分ごとに「キューアイテム」を掃除(ガベージコレクション、自分の言葉を選択)するように設計されています。つまり、すべてが「キュー項目」IDで5分のデータ保持期間が経過している場合は、「キュー項目」IDから「ビルドジョブ」IDを取得するための別のメカニズムが必要です。

私の場合は、ジェンキンスをフロントエンドとして使用しています。また、バックエンドでは、サーバー構成とアプリケーションのデプロイメントを実行するためにAnsibleを使用しています。これらのアプリケーション展開の中には、「キュー項目」の5分間のデータ保持期間をはるかに超える30分以上かかるものがあります。

私が解決しなければならなかった問題は、私が持っているすべてが「キュー項目」IDであれば、後で何時間後に、何時にチェックするかにかかわらず、「ビルドジョブ」IDを見つける方法?

ここに私の解決策がありました(XML出力が必要ですが、FYIを参照)。

私は、このコマンドを実行した:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass 

このコマンドは、この情報を返します:

Runtime responseHeaders Date: Day, ## Non Year xx:yy:zz GMT 
X-Content-Type-Options: nosniff 
Location: http://jenkins_srv:port/queue/item/123/ 
Content-Length: 0 
Server: Jetty(9.4.z-SNAPSHOT) 

をここから、私はLocationフィールドから123を解析することができます。

その後、10秒間寝た。睡眠の後、私は10秒のループ上で次のコマンドを実行します。

curl -X GET http://jenkins_srv:8080/queue/item/123/api/xml 

私はどちらかまでということでした:

  1. 私はのXPath //実行ファイル/番号を含むキュー項目リターンを得ましたまたは
  2. 私はHTML 404ステータスコードを10分以上受け取っています。これは、ジョブがまだキューに登録されていないか、または5分間のデータ保持ウィンドウに合格したことを意味します。

このようにループすると、キュー要求を処理するのが遅い負担のJenkinsサーバーが処理されます。おそらく私が10分を過ぎると、私のアプローチでは、私の自動化アプローチがうまくqueue'dしてジョブを実行するというユースケースを扱いますが、データ保持ウィンドウ外のJenkinsをチェックしています。この場合、私は、このコマンドを実行します:

curl -X GET http://jenkins_srv:port/job/MY_JOB/api/xml?tree=builds[id,number,result,queueId]&xpath=//build[queueId=123] 

これは、任意の以下に示すように、また、123queueIdが含まれている「ジョブの構築」のためのXML情報を返します。このように

<?xml version="1.0"?> 
    <build _class="hudson.model.FreeStyleBuild"> 
     <id>456</id> 
     <number>456</number> 
     <queueId>123</queueId> 
     <result>SUCCESS</result> 
    </build> 

を私は正式に "ビルドジョブ" IDを取得することができましたが、開始時とチェックアウト時の時間差に関係なく、 "キューアイテム" IDのみを持っていました。

+0

私はあなたがそれを得ることができてうれしいです。私の答えの最後に参照した 'http:// jenkins_srv:8080/queue/api/xml' APIを好奇心のために使用しましたか?一貫してチェックしていると仮定すると、定期的に問い合わせを行い、そこで受け取ったキューアイテムIDを持つ 'item'を探して、そこになければビルドが開始されていると仮定できます。 'queue//api/xml'にアクセスしてビルド番号を取得してください。 – Kdawg

+0

@RussNS古いキューの詳細を取得する方法を知っていますか? 現在実行中のスクリプトのjsonから変数 'queuingDurationMillis'にアクセスする必要があります。 –

関連する問題