wake-up-neo.com

Wie kann ich Jenkins 2.0 veranlassen, einen SH-Befehl in demselben Verzeichnis wie die Kasse auszuführen?

Hier ist meine Jenkins 2.x-Pipeline:

node ('master'){
    stage 'Checkout'
    checkout scm
    stage "Build Pex"
    sh('build.sh')
}

Wenn ich diese Pipeline durchführe, fügt der Checkout den Code erwartungsgemäß in den Arbeitsbereich ein, anstatt zu erwarten, das Skript in Arbeitsbereich/zu finden (es ist wirklich da!), Es befindet sich in einem nicht verwandten Verzeichnis: Arbeitsbereich @ tmp/durable-d812f509.

Entering stage Build Pex
Proceeding
[Pipeline] sh
[workspace] Running Shell script
+ build.sh
/home/conmonsysdev/deployments/jenkins_ci_2016_interns/jenkins_home/jobs/pex/branches/master/[email protected]/durable-d812f509/script.sh: line 2: build.sh: command not found

Wie ändere ich diese Jenkins-Datei so, dass build.sh in demselben Verzeichnis ausgeführt wird, in dem ich den Quellcode des Projekts ausgecheckt habe?

30
Salim Fadhley

Sie können Ihre Aktionen in dir block einschließen.

checkout scm
stage "Build Pex"
dir ('your new directory') { 
    sh('build.sh')
}
...

your new directory ist Platzhalter für Ihr aktuelles Verzeichnis. Standardmäßig ist dies ein relativer Pfad zum Arbeitsbereich. Sie können einen absoluten Pfad definieren, wenn Sie sicher sind, dass dieser im Agenten vorhanden ist.

31
Jayan

Der Grund dafür, dass Ihr Skript nicht funktioniert, liegt darin, dass "build.sh" nicht in Ihrem PFAD enthalten ist.

Die Jenkinsfile führt ein "sh" -Skript aus, dessen gesamter Inhalt die Zeichenfolge build.sh ist. Das Skript parent befindet sich im Verzeichnis "@tmp" und ist immer dort - im Verzeichnis "@tmp" speichert Jenkins die Jenkins-Datei während eines Laufs.

Um das Problem zu beheben, ändern Sie Ihre Zeile in sh "./build.sh" oder sh "bash build.sh", damit der sh-Block in der Jenkinsfile das build.sh-Skript, das Sie ausführen möchten, richtig finden kann.

13
Keith Mitchell

Ich habe das gleiche Problem und dir hilft nicht, möglicherweise weil ich in einem Unterverzeichnis des tmp-Verzeichnisses selbst arbeite (aus Gründen, die hier nicht so wichtig sind). Mein Code sieht so aus

dir(srcDir){
  sh 'pwd; la -l; jenkins.sh "build.sh"'
}

(Die pwd- und la -l-Anweisungen wurden nur zum Debuggen hinzugefügt. Problem existiert ohne sie.) Mit ihnen bekomme ich folgende Ausgabe: 

+ pwd
/jenkins/workspace/[email protected]/repos/2
+ ls -l
total 72
-rw-r--r-- 1 jenkins jenkins   394 May 19 12:20 README.md
drwxr-xr-x 3 jenkins jenkins  4096 May 19 12:20 api-automation
-rwxr-xr-x 1 jenkins jenkins   174 May 19 12:20 build-it.sh
-rwxr-xr-x 1 jenkins jenkins   433 May 19 12:20 build-release.sh
-rwxr-xr-x 1 jenkins jenkins   322 May 19 12:20 build.sh
drwxr-xr-x 3 jenkins jenkins  4096 May 19 12:20 ix-core
drwxr-xr-x 3 jenkins jenkins  4096 May 19 12:20 ix-Java-client
drwxr-xr-x 3 jenkins jenkins  4096 May 19 12:20 ix-rest-models
drwxr-xr-x 4 jenkins jenkins  4096 May 19 12:20 ix-service
drwxr-xr-x 7 jenkins jenkins  4096 May 19 12:20 ixternal
drwxr-xr-x 5 jenkins jenkins  4096 May 19 12:20 ixtraneous-stuff
-rwxr-xr-x 1 jenkins jenkins   472 May 19 12:20 jenkins.sh
-rw-r--r-- 1 jenkins jenkins 16847 May 19 12:20 pom.xml
+ jenkins.sh build.sh
/home/jenkins/workspace/[email protected]/repos/[email protected]/durable-a3ec0501/script.sh: line 2: jenkins.sh: command not found

Ich habe das letztendlich gemacht: 

dir(srcDir){
  sh 'cdr=$(pwd); $cdr/jenkins.sh "build.sh"'
}
1

Jenkins erstellt einen Ordner, wenn er aus Ihrem Projekt einen Klon wie folgt erstellt:

/ var/lib/jenkins/workspace / jobname @ script

Damit dies funktioniert, müssen Sie die Datei als ausführbar festlegen, wenn Sie sich in einer Linux-Umgebung befinden, und dann das Shell-Skript aufrufen.

Etwas wie das:

// Permission to execute
sh "chmod +x -R ${env.WORKSPACE}/../${env.JOB_NAME}@script"

// Call SH
sh "${env.WORKSPACE}/../${env.JOB_NAME}@script/script.sh"
0
Rafael Manzoni