2017-10-20 14 views
0

Jenkinsで毎日実行したいユニットテストがありますが、アプリケーションが別のジョブで正しく構築されている場合のみです。コミットがアプリケーションに追加されると、1日を通してユニットテストがトリガーされないようにします。Jenkins:他のジョブがクリーンである場合にのみ実行します。

どうすれば設定できますか?言い換えるする:

AおよびB:Bが実行されていない限り

Aは、各チェックインを実行し、B.

BはIFF A、深夜に実行するために、それが待機する場合、2つのジェンキンスジョブが存在します良い状態です。 Aが実行されている場合、BはAを待ちます。

私はすでに「A each checkin runs」と設定しています。

答えて

1

私の頭の上から離れて、私はあなたが望むものを正確にする方法を考えることができません。しかし、おそらくそれを処理する最良の方法ではないからかもしれません。

ジョブAでは、ビルドが成功しない限り、Bが見える場所に成果物を配備/配信しない方がよいでしょう。その後、Bは常にAからの成功ビルドに対して実行されます。

セットアップや環境全体を理解することなく、私は本当に「正しい」ものであるとコメントすることはできません。しかし、おそらくあなたは問題を再考する必要がありますか?

1

ジョブAの完了時に「状態」を公開することができます。ソースコードレポ、またはDB内のプロパティファイルを言います。 この値はブール値にすることができます。ジョブAが実行中の場合、ジョブAが正常にビルドされるまで、値はfalseになります。 ここで、ジョブBが起動すると、まず上記の値が真であるかどうかをチェックします。

これをサポートするプラグインはないようです。ほとんどのプラグインは、ジョブAが完了するとすぐにジョブBをトリガーします(つまり、ジョブAのステータスを監視します)。

1

あなたはJenkinsパイプラインを使用していると仮定します。さまざまな方法がありますが、JOB Aのステータスを確認するための第一歩とステータスを確認するユーティリティ機能を追加することで、これを解決します。

stage('check Job A status'){ 

     // If A is running, B waits for A. 

     if(checkStatus() == "RUNNING"){ 
      timeout(time: 60, unit: 'MINUTES') { 
      waitUntil { 
       def status = checkStatus() 
       return (status == "SUCCESS" || status == "FAILURE" || status == "UNSTABLE" || status == "ABORTED") 
      } 
     } 
     } 

     // Proceed with B, only when A is in a good state 

     if(checkStatus() != "SUCCESS"){ 
      error('Stopping Job B becuase job A is not successful.') 
     } 
} 


def checkStatus() { 
     def statusUrl = httpRequest "https://jenkins.example.com/job/${job-A-Name}/lastBuild/api/json" 
     def statusJson = new JsonSlurper().parseText(statusUrl.getContent()) 

     return statusJson['result']  

} 
関連する問題