web-dev-qa-db-de.com

Jenkins Pipeline-Job kann kein Skript finden, da @tmp-Pfad erstellt wird

Ich schreibe einen Pipeline-Job, der ein anderes Skript zur Ausführung aufruft. Die Jenkins-Datei und das Skript befinden sich im selben Verzeichnis, und der Job kann das Skript jedoch nicht zur Ausführung finden. 

Dies ist das relevante Skript.

stage ('Update') {
    try {
        dir('jenkins/pipeline/update-jenkins-plugins-ppln') {
            sh 'ls -l'
            sh 'update-plugins.sh'
        }
}

was den folgenden Fehler zurückgibt;

[update-jenkins-plugins-ppln] Running Shell script
+ ls -l
total 8
-rw-r--r-- 1 jenkins jenkins 2441 Dec 20 09:34 Jenkinsfile
-rwxr-xr-x 1 jenkins jenkins  506 Dec 19 14:06 update-plugins.sh
[Pipeline] sh
[update-jenkins-plugins-ppln] Running Shell script
+ update-plugins.sh
/var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/[email protected]/durable-11cefdd0/script.sh: 2: /var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/[email protected]/durable-11cefdd0/script.sh: update-plugins.sh: not found

Wie Sie sehen können, ist die Pfadangabe, die ich verwende, korrekt, da gemäß ls die Datei, die ich update-plugins.sh benötige, in dem Verzeichnis liegt, zu dem ich den Pfad habe. Aus irgendeinem Grund, wenn Jenkins tatsächlich nach dem Skript sucht, fügt er @tmp/durable-8d48734f/script.sh dem Pfad hinzu. 

Verschiedene Fehlerbehebung:

  • Ich habe gelesen, dass Sie den Zweig noch einmal auschecken müssen, auch wenn Sie bereits nach dem Jenkinsfile Auschecken, also bin ich.
  • Ich habe ssh'd in die Jenkins-Box zum Überprüfen und ja, das Skript ist da.

Warum fügt Jenkins das @ tmp-Bit hinzu und gibt es eine Möglichkeit, dieses Verhalten zu verhindern?

13
Alex

Haben Sie versucht, die Umgebungsvariable WORKSPACE (absoluter Pfad des Arbeitsbereichs) von jenkins zu verwenden? Damit würde Ihre Zeile ungefähr so ​​aussehen:

sh '${WORKSPACE}/jenkins/pipeline/update-jenkins-plugins-ppln/update-plugins.sh'
3
grubers

Ich glaube, Ihr Pwd ist nicht in PATH, also müssen Sie es so nennen: sh './update-plugins.sh'

2
izzekil

Ich hatte das gleiche Problem. Ich denke, @Oren hat Ihre Frage zu warum technisch beantwortet. Jenkins erstellt diesen tmp-Raum, aber ich kann ein paar Informationen darüber geben, wie ich es gelöst habe.

Grundsätzlich verbindet mein Jenkins Host-Symbol bin/sh mit dash; nicht bash. Durch die Verwendung eines POSIX-kompatiblen Shell-Skripts wurde das Problem für mich gelöst.

Zum Beispiel habe ich versucht, shopt -s extglob zu verwenden, um einige Musterabgleiche durchzuführen:

stage {
    def shellCommand = $/ "rm -rf ! (_data|_includes|_plugins|Gemfile|_config.yml|page-builder)"/$
    sh(returnStdout: true, script: shellCommand).trim()
}

Da dashextglob nicht unterstützt, hat das Ersetzen durch einen POSIX-kompatiblen find-Befehl funktioniert:

stage {
    sh('find . -regextype posix-extended -not -regex ".*includes.*|.*data.*|.*plugins.*|.*config.yml|.*Gemfile.*"')
} 
1
knack

Ich vermute, dieser spezielle Fall hat nichts mit Jenkins Pipelines zu tun, da er außerhalb der Jenkins in der Konsole reproduziert werden kann. Einmal bekam ich dieses Problem wegen DOS-Zeilenenden in meinem Skript, das ich in einer Pipeline mit "sh ()" ausführte. Schauen Sie sich dieses Beispiel an:

$ cat -v dos_formatted.sh
#! /bin/sh^M
pwd^M

$ cat script.sh
./dos_formatted.sh

$ sh -xe script.sh
+ ./dos_formatted.sh
script.sh: 1: script.sh: ./dos_formatted.sh: not found

Es zeigt deutlich, dass die Meldung "Nicht gefunden" irreführend ist. Das Skript befindet sich an der richtigen Stelle und die Berechtigungen sind ausreichend. Wenn Sie es jedoch über ein anderes Skript ausführen, schlägt dies mit einer solchen Fehlermeldung fehl.

Der Code des Plugins für dauerhafte Aufgaben ( https: //github.com/jenkinsci/durable-task-plugin/blob/master/src/main/Java/org/jenkinsci/plugins/durabletask/BourneShellScript.Java ) zeigt, dass das Plugin das automatisch generierte script.sh als "sh -xe ..." ausführt, daher ist es genau unser Fall.

Die oben beschriebene Situation kann auftreten, wenn Sie ein Git-Projekt (wahrscheinlich von Drittanbietern) "git clonen" und nicht sicherstellen, dass es mit Unix-LF geklont wurde.

0

Der @tmp-Ordner ist für Jenkins Job- und Stufenstatistiken (Dauer der Stufen usw.) vorhanden. Sie können ihn löschen, wenn Sie sicher sein möchten. Ich gehe davon aus, dass Ihre Art des Problems mit einem falschen Pfad zusammenhängt.

0
Oren