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

Voici mon Jenkins 2.x pipeline:

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

quand j'exécute ce pipeline, le check-out met le code dans l'espace de travail comme prévu, cependant au lieu de s'attendre à trouver le script dans l'espace de travail/ (il est vraiment là!), il regarde 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 modifier ce fichier Jenkinsfile pour que build.sh est exécuté dans le répertoire exact où j'ai vérifié le code source du projet?

26
demandé sur Vadim Kotov 2016-07-01 13:48:25

4 réponses

vous pouvez inclure vos actions dans dir bloc.

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

your new directory est titulaire d'emplacement de votre répertoire. Par défaut, c'est un chemin relatif vers l'espace de travail. Vous pouvez définir le chemin absolu, si vous êtes sûr qu'il est présent sur l'agent.

26
répondu Jayan 2017-07-14 14:54:06

la raison pour laquelle votre script ne fonctionne pas est parce que "build.sh" n'est pas sur votre chemin.

le fichier Jenkinsfile exécute un script "sh", dont le contenu entier est la chaîne build.sh. parent script est dans le répertoire" @tmp "et sera toujours là - le répertoire" @tmp " est L'endroit où Jenkins garde le fichier Jenkinsfile, essentiellement, pendant une exécution.

Pour corriger le problème, modifiez votre ligne sh "./build.sh" ou sh "bash build.sh", ainsi que sh bloc dans le fichier Jenkinsfile peut localiser correctement le build.sh script que vous souhaitez exécuter.

8
répondu Keith Mitchell 2018-01-23 19:22:48

j'ai le même problème et le dir n'aide pas, peut-être parce que je travaille dans un sous-répertoire du dir 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"'
}

(pwd et la -l les instructions ont été ajoutées juste pour le débogage. Le problème existe avec eux.) Avec eux-je obtenir une sortie de la forme:

+ 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 fait ceci:

dir(srcDir){
  sh 'cdr=$(pwd); $cdr/jenkins.sh "build.sh"'
}
1
répondu Kenneth Baltrinic 2017-05-19 12:34:34

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

/var/lib/jenkins/espace de travail/emploi-nom @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 script shell.

quelque Chose comme ceci:

// 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
répondu Rafael Manzoni 2017-09-13 02:33:22