web-dev-qa-db-fra.com

Comment faire en sorte que Jenkins 2.0 exécute une commande sh dans le même répertoire que la caisse?

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?

30
Salim Fadhley

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.

31
Jayan

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.

13
Keith Mitchell

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"'
}
1

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"
0
Rafael Manzoni