44 votes

Comment faire pour que Jenkins 2.0 exécute une commande sh dans le même répertoire que le checkout ?

Voici mon pipeline Jenkins 2.x :

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

Lorsque j'exécute ce pipeline, le checkout place le code dans le workspace comme prévu, mais au lieu de s'attendre à trouver le script dans workspace/ (il y est vraiment !), il cherche dans un répertoire sans rapport : 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 puis-je modifier ce fichier Jenkins pour que build.sh soit exécuté dans le même répertoire que celui où j'ai extrait le code source du projet ?

0 votes

C'est vraiment votre pipeline complet ? Ou avez-vous de multiples node des blocs ?

3 votes

Pour l'instant, c'est tout. C'est le plus petit pipeline qui démontre le bug.

46voto

Jayan Points 7171

Vous pouvez inclure vos actions dans dir bloc.

checkout scm
stage "Build Pex"
dir ('<your new directory>') { 
    sh('./build.sh')
}
... or ..
checkout scm
stage "Build Pex"
sh(""" <path to your new directory>/build.sh""")

...

<your new directory> est le support de place de 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.

1 votes

Que signifie "votre nouveau répertoire" ? S'agit-il d'un espace réservé ?

2 votes

Cela ne fonctionne pas pour moi :-( Où dois-je mettre le shellscript ? Actuellement, il se trouve dans le répertoire racine de mon dépôt git. J'ai essayé de le déplacer dans un sous-répertoire 'buildscripts', puis d'utiliser la commande dir('buildscripts') {} mais pas de chance

0 votes

Bastian Voigt : Vous avez peut-être besoin d'une nouvelle question.

27voto

Keith Mitchell Points 111

La raison pour laquelle votre script ne fonctionne pas est que build.sh n'est pas dans votre PATH.

El Jenkinsfile exécute un "sh" script, dont le contenu entier est la chaîne de caractères build.sh . Le site parent script est dans le répertoire "@tmp" et y sera toujours - le répertoire "@tmp" est l'endroit où Jenkins garde le Jenkinsfile, essentiellement, pendant une exécution.

Pour résoudre le problème, changez votre ligne en sh "./build.sh" o sh "bash build.sh" de sorte que le sh dans le fichier Jenkins permet de localiser correctement le fichier build.sh script que vous voulez exécuter.

4voto

Rafael Manzoni Points 467

Jenkins crée un dossier quand il fait un clone de votre projet comme ceci :

/var/lib/jenkins/workspace/ nom du poste @script

Pour que cela fonctionne, vous devez définir le fichier comme exécutable si vous êtes dans un environnement linux et ensuite appeler le shell script.

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"

2voto

Kenneth Baltrinic Points 910

J'ai le même problème et dir ne m'aide pas, peut-être parce que je travaille dans un sous-répertoire du répertoire tmp lui-même (pour une raison qui n'est pas pertinente ici). Mon code ressemble à ceci

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

(le pwd y la -l ont été ajoutées juste pour le débogage. Le problème existe sans elles). Avec elles, j'obtiens des résultats 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 fini par le faire :

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

0 votes

Vérifiez la commande sh 'pwd; ls -l; jenkins.sh "build.sh"' .

0voto

Iftimie Tudor Points 669

J'ai compilé toutes les réponses ci-dessus et pour moi, cela a fonctionné comme suit :

stage('Run Script'){
    steps {
        script {
            sh('cd relativePathToFolder && chmod +x superscript.sh && ./superscript.sh parameter1 paraeter2')
        }
    }
}

Merci à @Rafael Manzoni @Keith Mitchell et @Jayan

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X