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?
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.
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.
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"'
}
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"