web-dev-qa-db-ja.com

Jenkinsのダウンストリームジョブがアップストリームアーティファクトの検出に失敗する

このセットアップは、AdobeAEMをビルドしてデプロイするために使用されます。

マスタービルドジョブは、gitリポジトリからプルし、ビルドしてパッケージ化し、テストを実行してから、アップストリームジョブからビルドされたパッケージを使用する必要があるダウンストリームジョブを起動します。

問題は、ダウンストリームジョブが次のメッセージで失敗することです。

Unable to access upstream artifacts area /var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/builds/2014-10-22_11-33-46/archive. Does source project archive artifacts?

ダウンストリームジョブによってトリガーされたCopyArtifactsプラグインが、間違った場所でアーティファクトを探しているようです。正しい場所は

/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.jar,/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.Zip

しかし、それから、それは

Java.io.IOException: Expecting Ant GLOB pattern, but saw '/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.jar,/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.Zip'. See http://ant.Apache.org/manual/Types/fileset.html for syntax

ダウンストリームジョブは別のプロジェクトからアーティファクトをコピーし、ビルドは「このジョブをトリガーしたアップストリームビルド」または「最新の完了したビルドのワークスペースからコピー」のいずれかでした。そして、どれも機能しません。

何か案は?

12
dex

TL; DR

アーティファクトを最初にアーカイブせずに使用しようとしています。
絶対パスを使用しようとしていますが、絶対パスは$WORKSPACEおよび/または「アーカイブの場所」からの相対パスである必要があります。

フルアンサー

ジェンキンスに関連する「アーティファクト」の概念を誤解しています。

Jenkinsアーティファクトとは

アーティファクトは、ビルド後アーティファクトのアーカイブビルド後のアクションの助けを借りて特別に保存されるファイルです。

ビルドが実行されると、次の範囲内で実行されます。
$WORKSPACE、これは通常、ファイルシステム上に存在します
$JENKINS_HOME/jobs/$JOB_NAME/workspace
その中には、SCMチェックアウトフォルダー、一時ビルドファイル、最終ビルドファイル、バイナリなどを含めることができます。

$WORKSPACEの内容はvolatileです。ビルド時間枠外(およびダウンストリームジョブareビルド時間枠外)では、決してこれに依存しないでください。 $WORKSPACEの内容は、マスター/スレーブノードごとに異なる可能性があり、管理者またはSCMの更新/クリーンアップ/チェックアウトによっていつでも削除される可能性があります。

全体としてone$WORKSPACEしかないことを理解することも重要ですJob

ただし、ビルド履歴に注意してください。そのリストには、ビルド番号(#)と日付のタイムスタンプで参照されるいくつかのエントリがあります。これらは以下に保存されます:
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID
$BUILD_IDは、2014-10-22_11-33-46のように、ビルドの日付とタイムスタンプです。

$WORKSPACEには、currentまたはlastに関連する情報が含まれています(問題は、「current」か「current」かを確認できないことです。 「最後の」)ビルド;
buildsフォルダーには、過去の(保持された)すべてのビルド実行の記録が含まれています(これが左側のビルド履歴リストを構成します)、ビルドごと

デフォルトでは、Jenkins自体に必要なもの(build.xmlコピー、変更ログ情報、コンソールログ)のみが含まれます。 URL http://$JENKINS_URL/job/$JOB_NAME/[nn]/に移動すると、[nn]はジョブのビルド/実行番号(#)の数値であり、ファイルシステムのbuildsフォルダーからこの情報を読み取ります。

ビルドのアーティファクトを保持するには(次のビルドによって上書きされないようにする、ワースクペースを消去する、または単に古いビルドにアクセスするため)、アーティファクトをアーカイブする(ビルド後のアクションと同じ同じタイトル)。アーティファクトをアーカイブするときは、$WORKSPACE内のどのファイルを保存するかを指定します。 Jenkinsがアーカイブを行うと、それらのファイル([パスを[$WORKSPACE]に対して保持]を保持)を次の場所に配置します。
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/
このようにして、$WORKSPACEの「最新/最後」だけでなく、以前のビルド用に複数のアーティファクトのセットを保持できます。

完全を期すために、http://$JENKINS_URL/job/$JOB_NAME/lastSuccessfulBuild/lastFailedBuildなどのJenkinsの「パーマリンク」は、実際にはファイルシステム上で保存されているbuilds/$BUILD_IDフォルダの1つへのシンボリックリンクであることに言及します。

最後に、ジョブ構成の"古いビルドを破棄"チェックマークを使用して、ビルドの実行数と保持されるアーティファクトの数(個別に構成可能)を制御します。デフォルトではすべてが保持されますが、アーティファクトの保持を開始する場合は、ハードディスクの容量を考慮する必要があります。

あなたの問題の解決策

したがって、上記の情報とエラーメッセージを見ると、Copy Artifactsプラグインがビルドの/archive/セクションでアーティファクトを正しく検索していることがわかります。

また、アーティファクトのコピープラグインはnotコピー元のビルドを選択するときに、「現在のビルド」を選択できることにも注意してください。パーマリンク(「最後の成功」や「最後のビルド」など)と特定のビルド番号があり、これらはすべて$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/の下に保存されたビルドに変換されます。

「このジョブをトリガーしたアップストリームビルド」でさえ、特定の$BUILD_IDにリンクします。

以下のオプションのいずれかで

Archiving Artifactsの構成は$WORKSPACEに関連しています。
アーティファクトのコピーの構成は、「アーカイブの場所」、つまり$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/を基準にしています。
「アーティファクトのコピー」は「アーカイブの場所」に相対的であり、「アーカイブの場所」は$WORKSPACEに相対的であるため、すべての集中的な目的で、両方の構成の相対パスは同じであり、 $WORKSPACE

オプション1

  • 最初アーティファクトをアーカイブビルド後のアクションで、それ以外の場合はコピー元がありません。
    1. $WORKSPACEのルートにファイルがある場合は、次のようになります。
      PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.Zip
      (注、ここではフルパスではありません)
  • 次に、Upstream Build that triggered this jobアーティファクトのコピー選択に使用します。
    1. コピーするアーティファクトフィールドの場合:次のいずれかを使用します。
      • **または空白で、アーカイブされたすべてのアーティファクトをコピーするか、
      • PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.Zip(アーカイブセクションと同じ)

オプション2

アーカイブしたくない場合は、$WORKSPACECopy from workspace of latest completed buildとともに直接使用できますが、ただし、ダウンストリーム中に2番目のアップストリームビルドを実行できないようにする必要がありますビルドが実行されている場合、前に説明したように、$WORKSPACEは揮発性であるため、部分ビルドから部分ファイルを取得するリスクがあります。

  • 繰り返しますが、アーティファクトのコピーステップでは、コピーするアーティファクトフィールドの下で、$WORKSPACEに相対的なパスを使用します。
    PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.Zip

オプション3

異なるジョブ間でWORKSPACE全体を本当にコピーしたい場合は、次のいずれかを使用してください。

53
Slav

修正は次のように簡単です:disable or removeCompress Artifacts plugin andrebootジェンキンス。

この回避策は、長年のバグレポートから推測されました: "Copy Artifacts Plugin"はArtifactManagerをサポートする必要があります

1
Juuso Ohtonen

解決策は、ビルダーの構成に関するものです。

根本的な原因は、ダウンストリームジョブの構成にあります。コピーするビルドに「最新の完了したビルドのワークスペースからコピー」を選択すると、コピーするアーティファクトのパスがプロジェクト名などの相対パスに設定されます-/ /。jar、projectname-//。Zipすると、ビルドが成功します。

さらに、親ジョブ構成では、ダウンストリームジョブをCopyArtifactに許可する必要があり、プロジェクトでコピーアーティファクトを許可するには、ダウンストリームジョブを指定する必要があります。

編集:今、あなたがその間に応答したことがわかります。素晴らしい答えであり、基本的に私が持っていた質問のいくつかをクリアします。

オプション1に関する不明確な点の1つは、ファイルのアーカイブが発生することですafter親ジョブが完了します。

Waiting for the completion of projectname-Deploy
projectname-Deploy #19 completed. Result was SUCCESS
Waiting for the completion of projectname-Deploy
projectname-Deploy #20 completed. Result was SUCCESS
Build step 'Trigger/call builds on other projects' changed build result to SUCCESS
Strings match run condition: string 1=[lab2b], string 2=[both]
Run condition [Strings match] preventing perform for step [BuilderChain]
Archiving artifacts 

オプション2にアプローチを変更すると、うまくいきましたが、最初のオプションも理解したいと思います。

0
dex