Jenkis Downstream-Job kann Upstream-Artefakte nicht finden

7

Das Setup wird verwendet, um Adobe AEM zu erstellen und bereitzustellen.

Der Master-Build-Job ruft das Git-Repository, Builds und Pakete ab, führt die Tests aus und feuert dann Downstream-Jobs, die die erstellten Pakete aus dem Upstream-Job verwenden sollen.

Das Problem besteht darin, dass der nachgelagerte Job mit der folgenden Fehlermeldung fehlschlägt:

%Vor%

Es scheint mir, dass das CopyArtifacts-Plugin, ausgelöst durch den Downstream-Job, nach den Artefakten am falschen Ort sucht. Der richtige Ort wäre

%Vor%

Aber dann klagt es über

%Vor%

Der nachgelagerte Job kopiert Artefakte von einem anderen Projekt, und dann war der Build entweder "Upstream-Build, der diesen Job ausgelöst hat" oder "Vom Arbeitsbereich des letzten abgeschlossenen Builds kopieren". Und nichts funktioniert.

Irgendwelche Ideen?

    
dex 23.10.2014, 09:25
quelle

3 Antworten

48

TL; DR

Sie versuchen Artefakte zu verwenden, ohne sie vorher zu archivieren.
Sie versuchen, absolute Pfade zu verwenden, sollten aber relativ zu $WORKSPACE und / oder "Archivspeicherort" sein.

Vollständige Antwort

Sie verstehen das Konzept von "Artefakten" in Bezug auf Jenkins falsch.

Was sind Jenkins Artefakte

Artefakte sind Dateien, die nach dem Build mithilfe der Archivieren der Artifacts Post-Build-Aktion

gespeichert werden.

Wenn der Build ausgeführt wird, wird er in folgendem Format ausgeführt:
$WORKSPACE , das sich normalerweise in
$JENKINS_HOME/jobs/$JOB_NAME/workspace
befindet Dort können Sie Ihre SCM-Checkout-Ordner, temporäre Build-Dateien, final erstellte Dateien, Binärdateien usw. haben.

Der Inhalt von $WORKSPACE ist volatil , Sie sollten sich außerhalb des Build-Zeitrahmens niemals darauf verlassen (und nach sind außerhalb des Build-Zeitrahmens). Der Inhalt von $WORKSPACE könnte zwischen verschiedenen Master / Slave-Knoten unterschiedlich sein, er könnte jederzeit von admin oder durch SCM update / cleanup / checkout gelöscht werden.

Es ist auch wichtig zu verstehen, dass es nur eins $WORKSPACE für den gesamten Job gibt.

Aber jetzt achten Sie auf Ihre Build History , es gibt mehrere Einträge in dieser Liste, auf die Build-Nummer (#) und Datum-Zeitstempel verweisen. Diese sind gespeichert unter:
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID
mit $BUILD_ID als Datum-Zeitstempel des Builds, wie 2014-10-22_11-33-46

Das $WORKSPACE enthält die Informationen, die für aktuell oder zuletzt relevant sind (und das Problem ist: Sie können nie sicher sein, ob es "aktuell" oder "zuletzt" ist) bauen; Der Ordner builds enthält eine Aufzeichnung aller bisherigen (beibehaltenen) Build-Ausführungen (das ist die Liste Build History auf der linken Seite), pro Build .

Standardmäßig enthält es nur das, was Jenkins selbst benötigt: build.xml-Kopie, changelog-Informationen, Konsolenprotokoll. Wenn Sie zur URL http://$JENKINS_URL/job/$JOB_NAME/[nn]/ gehen, wobei [nn] eine numerische Build- / Ausführungsnummer (#) ist, liest sie diese Informationen aus dem Ordner builds im Dateisystem.

Um Artefakte eines Builds zu erhalten (um zu verhindern, dass sie beim nächsten Build überschrieben werden, worktopspace ausgelöscht wird oder nur um auf ältere Builds zuzugreifen), müssen Sie Archive the Artifacts (mit demselben Post- Aktion mit demselben Titel erstellen). Wenn Sie die Artefakte archivieren, geben Sie an, welche Dateien in $WORKSPACE beibehalten werden sollen. Wenn Jenkins die Archivierung vornimmt, werden diese Dateien (die die Pfade [relativ zu $WORKSPACE ] beibehalten) in folgende Dateien eingefügt:
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/ .
Auf diese Weise können Sie mehrere Artefakte für frühere Builds erhalten, nicht nur "Letzte / Letzte" von $WORKSPACE .

Der Vollständigkeit halber werde ich erwähnen, dass Jenkins "Permalinks", wie http://$JENKINS_URL/job/$JOB_NAME/lastSuccessfulBuild und /lastFailedBuild usw., tatsächlich Symlinks im Dateisystem zu einem der erhaltenen builds/$BUILD_ID Ordner sind.

Schließlich können Sie steuern, wie viele Build-Läufe und wie viele Artefakte beibehalten werden (kann separat konfiguriert werden), indem Sie das Kontrollkästchen "Alte Builds verwerfen" bei der Jobkonfiguration deaktivieren. Standardmäßig werden alle beibehalten, aber wenn Sie beginnen, Artefakte zu behalten, müssen Sie an die Kapazität des Festplattenspeichers denken.

Lösungen für Ihr Problem

Mit den obigen Informationen und der Betrachtung Ihrer Fehlermeldungen sollten Sie nun sehen, dass das Copy Artifacts -Plugin korrekt nach Artefakten im Abschnitt /archive/ eines Builds sucht.

>

Sie sollten außerdem beachten, dass Artefakte kopieren bei nicht die Option "aktueller Build" ausgewählt werden kann, wenn Sie auswählen, von welchem ​​Build kopiert werden soll. Es hat Permalinks (wie "letzte erfolgreiche" oder "letzte Build") und spezifische Build-Nummern, die alle zu konservierten Builds unter $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/

übersetzen

Auch "Upstream Build, das diesen Job ausgelöst hat" wird mit einem bestimmten $BUILD_ID verknüpft.

In einer der folgenden Optionen

Die Konfiguration für Archivierungsartefakte ist relativ zu $WORKSPACE .
Die Konfiguration für Artefakte kopieren ist relativ zu "Archivspeicherort", dh $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/ .
Da "Artefakte kopieren" relativ zu "Archivspeicherort" ist und "Archivspeicherort" relativ zu $WORKSPACE ist, können die relativen Pfade beider Konfigurationen für alle intensiven Zwecke gleich und relativ zu $WORKSPACE

sein

Option 1

  • Zuerst Archivieren Sie die Artefakte mit der Post-Build-Aktion, sonst haben Sie nichts zu kopieren.
    1. Wenn Sie Ihre Dateien im Stammverzeichnis von $WORKSPACE haben, sollte es sein:
      PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip
      (Beachten Sie, nicht vollständige Pfade hier)
  • Verwenden Sie dann Upstream Build that triggered this job für die Auswahl Kopie-Artefakte .
    1. Verwenden Sie für Zu kopierende Artefakte entweder:
      • ** oder leer, um alle archivierten Artefakte zu kopieren, oder
      • PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip (entspricht dem Archivierungsabschnitt)

Option 2

Wenn Sie nicht archivieren möchten, können Sie $WORKSPACE direkt verwenden, mit Copy from workspace of latest completed build , Sie müssen jedoch sicherstellen, dass kein zweiter Upstream-Build ausgeführt werden kann, während der Downstream-Build ausgeführt wird, sonst Sie Risiko, eine partielle Datei von einem partiellen Build zu erhalten, da $WORKSPACE , wie zuvor erklärt, flüchtig ist.

  • Verwenden Sie für den Schritt Copy Artifacts im Feld Artefakte zum Kopieren den Pfad relativ zu $WORKSPACE , also:
    PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip

Option 3

Wenn Sie wirklich den gesamten ARBEITSBEREICH zwischen verschiedenen Jobs kopieren wollen, verwenden Sie entweder

Slav 23.10.2014, 18:50
quelle
1

Der Fehler kann so einfach sein: deaktivieren oder entfernen Artefakte komprimieren Plugin und Neustart Jenkins.

Dieser Workaround wurde aus einem langjährigen Fehlerbericht abgeleitet: "Copy Artifacts Plugin" sollte ArtifactManager unterstützen .

    
Juuso Ohtonen 24.04.2017 03:51
quelle
0

Die Lösung betrifft die Konfiguration des Builders.

Die Ursache liegt in der Konfiguration des nachgeordneten Jobs. Sobald "Kopie vom Arbeitsbereich des letzten abgeschlossenen Builds" für den Build ausgewählt wurde, der kopiert werden soll, wird der Pfad der zu kopierenden Artefakte auf den relativen Pfad gesetzt, z. B. projektname- / / .jar, Projektname- // .zip, dann ist der Build erfolgreich.

Außerdem muss in der übergeordneten Jobkonfiguration dem nachgeordneten Job erlaubt sein, CopyArtifact und Projekte so zu setzen, dass das Feld für Kopierartefakte den nachgelagerten Job angibt.

Edit: Jetzt sehe ich, dass du in der Zwischenzeit geantwortet hast. Große Antwort und im Grunde klären einige der Fragen, die ich hatte.

Das Unklare an Option 1 ist, dass die Archivierung der Dateien nach erfolgt, nachdem der übergeordnete Job abgeschlossen wurde.

%Vor%

Nachdem ich den Ansatz für Option zwei geändert hatte, funktionierte es für mich, aber ich würde gerne auch die erste Option verstehen.

    
dex 24.10.2014 15:32
quelle