Voici mon pipeline Jenkins 2.x:
node ('master'){
stage 'Checkout'
checkout scm
stage "Build Pex"
sh('build.sh')
}
Lorsque j'exécute ce pipeline, l'extraction insère le code dans l'espace de travail comme prévu. Cependant, au lieu de rechercher le script dans l'espace de travail/(c'est vraiment là!), Il recherche dans un répertoire indépendant: workspace @ 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/workspace@tmp/durable-d812f509/script.sh: line 2: build.sh: command not found
Comment modifier ce fichier Jenkins afin que build.sh soit exécuté dans le même répertoire que celui où j'ai extrait le code source du projet?
Vous pouvez inclure vos actions dans le bloc dir
.
checkout scm
stage "Build Pex"
dir ('your new directory') {
sh('build.sh')
}
...
your new directory
est réservé votre répertoire actuel. Par défaut, il s’agit d’un chemin relatif vers l’espace de travail. Vous pouvez définir un chemin absolu, si vous êtes sûr qu'il est présent sur l'agent.
La raison pour laquelle votre script ne fonctionne pas, c'est parce que "build.sh" n'est pas dans votre PATH.
Le fichier Jenkins exécute un script "sh" dont le contenu complet est la chaîne build.sh
. Le script parent se trouve dans le répertoire "@tmp" et le sera toujours. Le répertoire "@tmp" est le lieu où Jenkins conserve le fichier Jenkins, essentiellement pendant une exécution.
Pour résoudre le problème, remplacez votre ligne par sh "./build.sh"
ou sh "bash build.sh"
, de sorte que le bloc sh
du fichier Jenkins puisse localiser correctement le script build.sh
que vous souhaitez exécuter.
J'ai le même problème et le répertoire ne m'aide pas, probablement parce que je travaille dans un sous-répertoire du répertoire tmp lui-même (pour des raisons qui ne sont pas essentielles ici). Mon code ressemble à ceci
dir(srcDir){
sh 'pwd; la -l; jenkins.sh "build.sh"'
}
(Les instructions pwd
et la -l
ont été ajoutées uniquement pour le débogage. Un problème existe sans elles.) Avec elles, je reçois un résultat comme:
+ pwd
/jenkins/workspace/aws-perf-test@tmp/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/aws-perf-test@tmp/repos/2@tmp/durable-a3ec0501/script.sh: line 2: jenkins.sh: command not found
J'ai finalement fait ceci:
dir(srcDir){
sh 'cdr=$(pwd); $cdr/jenkins.sh "build.sh"'
}
Jenkins crée un dossier quand il crée un clone de votre projet comme ceci:
/ var/lib/jenkins/workspace / nom du travail @ script
Pour que cela fonctionne, vous devez définir le fichier comme exécutable si vous êtes dans un environnement linux, puis appeler le script Shell.
Quelque chose comme ça:
// Permission to execute
sh "chmod +x -R ${env.WORKSPACE}/../${env.JOB_NAME}@script"
// Call SH
sh "${env.WORKSPACE}/../${env.JOB_NAME}@script/script.sh"