2017-07-28 4 views
0

Ich habe Jenkins LTS 2.60.2 auf Windows Server 2016 und unter Verwendung dieser Plugins:Jenkins Copy Artifact nicht gefunden Ordner/multiProjectPipeline/branchWithSlash

  • Folders Plugin (6.1.0)
  • Copy Artifact Plugin (1,38 .1)
  • Pipeline-Plugin (2,5) + alle abhängigen Pipeline Unter Plugins
  • Verschiedene andere abhängige Plugins ...

Siehe Pipeline to use artifacts from 2 projects associated by the same git branch name, um weitere Informationen über mein Setup, aber um es zusammenzufassen Ich habe folgende Artikel:

  • Spielplatz (einen Ordner mit dem Ordner Plugin Gruppe alle diese folgenden Elemente erstellt)
  • Frontend (mehrfach verzweigten Pipeline)
  • Backend (mehrfach verzweigten Rohrleitung)
  • configure (Pipeline mit einem Parameter genannt branch_name)

Das Frontend- und Backend-git Repos, beide haben eine Filiale namens Master und eine Release/2017.2.

Die Idee ist es, die konfigurieren Pipeline automatisch nach jedem erfolgreichen Build, die Weitergabe der Git-Zweig-Namen. Das automatische Auslösen der konfigurieren Pipeline funktioniert.

Was funktioniert nicht und ich brauche Ihre Hilfe zu beheben, ist der Schritt innerhalb der konfigurieren Pipeline, um die Artefakte aus einer MultibranchPipeline/specificBranch zu kopieren.

Wenn für den Parameter BRANCH_NAME (oder die Upstream-Pipeline) Master ist, funktioniert es. Wenn branch_name ist: release/2017,2 ich diesen Fehler:

ERROR: Unable to find project for artifact copy: playground/frontend/release%2f2017.2 This may be due to incorrect project name or permission settings; see help for project name in job configuration. Finished: FAILURE

Die configure Pipeline wie folgt aussieht:

node { 
    stage('Prepare') { 
     def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2f") 
     step([$class: 'CopyArtifact', projectName: "${projectname}", selector: [$class: 'StatusBuildSelector', stable: false]]) 
    } 
    stage('Archive') { 
     archiveArtifacts '**' 
    } 
} 

Wie Sie mich schon ersetzen/mit% 2f sehen (es ist erforderlich).

Wenn ich nicht den Ordner "Spielplatz" (alle meine Pipelines wie es ist, nicht in einem Ordner Element), funktioniert es. Wenn ich den Ordner verwende und den Master-Zweig verwende, funktioniert es. Es funktioniert nicht, wenn ich den Ordner und einen Zweignamen wie 2017.2 verwende. Was mache ich falsch? Kannst du dazu beitragen, dass es funktioniert? Gut, wenn es ein Bug ist (ich habe in https://issues.jenkins-ci.org gesucht und einige Fehler gefunden, bei denen ein ähnliches Setup mit dem Ordner nicht funktioniert, aber sie wurden behoben ... so frage ich mich wirklich ...) im Copy-Artefakt-Plugin, bitte Datei der Fehler und teilen Sie den Link hier, so können wir alle seinen Fortschritt überwachen ...

Vielen Dank.

Antwort

1

Ich endlich das Problem gefunden. Die Pipeline configure konnte einen Zweig mit einem Schrägstrich nicht finden, da die Codierung falsch war.

Also, in meiner Frage, in der configure Pipeline:

diese (ersetzen / mit %2f) ist falsch und erzeugt die Fehler:

def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2f") 

dies ist der richtige Weg, um kodieren Sie den Schrägstrich, und es funktioniert:

def projectname = "playground/frontend/" + URLEncoder.encode("${BRANCH_NAME}", "UTF-8").replace("+", "%20") 

Credits: http://www.pipegrep.se/copy-artifacts-from-jenkins-pipeline-jobs.html

UPDATE: tatsächlich untersuchte ich ein bisschen weiter und fügte hinzu echo "${projectname}" kurz vor step, mit dem vorherigen und festen Projektname, und ich bemerkte, dass der Unterschied %2fKlein war.

Versalien-, wie folgt aus: %2F Werke:

def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2F") 

also die feste configure Pipeline sieht wie folgt aus (hielt ich meine Ersetzen-Funktion, die für meinen Fall genug war):

node { 
    stage('Prepare') { 
     def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2F") 
     step([$class: 'CopyArtifact', projectName: "${projectname}", selector: [$class: 'StatusBuildSelector', stable: false]]) 
    } 
    stage('Archive') { 
     archiveArtifacts '**' 
    } 
} 
0

Ich habe eine sample project erstellt, um zu versuchen und neu zu erstellen, was Sie sahen, und ich konnte dies tun, nach einer Mode, außer dass der Build, dass ich Probleme hatte, war master anstelle von release/2017.2. Schließlich erkannte ich, dass ich die build job falsch von der frontend Projekt gemacht hatte, und es gab mir den gleichen Fehler wie Sie, weil ich nie einen erfolgreichen Build der frontend/master Zweig abgeschlossen hatte (Ich hatte einen erfolgreichen Build der release/2017.2 abgeschlossen Branch, weil ich es nicht hatte, configure zu initialisieren, der Anfang anfing, also gab es mir den gleichen Fehler nicht einmal, den ich es konfigurierte, um den configure Build zu triggern).

Was die build job im frontendJenkinsfile auf diese Veränderung gearbeitet wurde:

build job: 'playground/configure', parameters: [[$class: 'StringParameterValue', name: 'BRANCH_NAME', value: env.BRANCH_NAME]], quietPeriod: 2, wait: false

im quietPeriod gibt, daß dies ein paar Sekunden ruhig Zeit zwischen dem vorherigen Job abgeschlossen (Ich bin nicht sicher Hinzufügen ist kritisch, aber es scheint, als wäre es eine gute Ausfallsicherung, zu versuchen, sicherzustellen, dass genug Zeit für den Build zu vervollständigen ist), aber der wichtige Teil ist der wait: false, der Jenkins anweist, dass dieser Build nicht warten sollte der ausgelöste Build zum Abschluss. Sobald ich das geändert habe, wurde der Zweig frontend/master erfolgreich abgeschlossen, und der Build configure, der ausgelöst wurde, wurde ebenfalls erfolgreich abgeschlossen.

Hoffentlich hilft das. Ich konnte meine beiden master und release/2017.2 Zweige ordnungsgemäß erstellen, so glaube ich nicht, dass es ein intrinsisches Problem mit dem / in dem Projektnamen gibt. Sie können meine einfache Jenkinsfile s im referenzierten Repo sehen, und ich habe das gleiche Pipeline-Skript verwendet, das Sie in Ihrer Frage gepostet haben.

+0

Es ist auch möglich, dass ich einen etwas anderen Fehler bekommen habe und dass dies Ihr Problem nicht lösen wird. Dennoch zeigt es, dass das, was Sie zu tun versuchen, machbar ist. – Kdawg

+0

Danke für Ihre Antwort Kdawg, vielleicht habe ich nicht angegeben, aber das Problem liegt im * configure * Job. Ich führe erfolgreich den * Frontend * Job aus (der letzte Teil ruft * configure * auf Ich versuche es und fang so, auch wenn es fehlschlägt, der Build wird als erfolgreich markiert), dann führe ich den configure Job erneut aus, indem ich den Parameter " release/2017.2 "Hier zeigt sich der Fehler. In meinem Setup verwende ich nicht github, sondern gerrit für das git-Repository. Vielleicht funktioniert es auf github, aber auf anderen git-Servern tut es das nicht? – firepol

+0

Kdawg, * quietPeriod * und * wait * helfen, den Build zu beschleunigen und zu vermeiden, * try/catch * zu verwenden, aber die * configure * -Pipeline schlägt immer mit folgendem Fehler fehl: 'ERROR: Projekt für Artefaktkopie kann nicht gefunden werden: playground/frontend/release% 2f2017.2 Dies kann an falschen Projektnamen oder Berechtigungseinstellungen liegen; Siehe Hilfe zum Projektnamen in der Jobkonfiguration. Beendet: FAILURE – firepol

Verwandte Themen