J'écris un travail de pipeline qui appellera un autre script à exécuter. Le fichier Jenkins et le script existent dans le même répertoire, mais le travail ne parvient pas à trouver le script à exécuter.
C'est le bit pertinent du script;
stage ('Update') {
try {
dir('jenkins/pipeline/update-jenkins-plugins-ppln') {
sh 'ls -l'
sh 'update-plugins.sh'
}
}
qui retourne l'erreur suivante;
[update-jenkins-plugins-ppln] Running Shell script
+ ls -l
total 8
-rw-r--r-- 1 jenkins jenkins 2441 Dec 20 09:34 Jenkinsfile
-rwxr-xr-x 1 jenkins jenkins 506 Dec 19 14:06 update-plugins.sh
[Pipeline] sh
[update-jenkins-plugins-ppln] Running Shell script
+ update-plugins.sh
/var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/update-jenkins-plugins-ppln@tmp/durable-11cefdd0/script.sh: 2: /var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/update-jenkins-plugins-ppln@tmp/durable-11cefdd0/script.sh: update-plugins.sh: not found
Comme vous pouvez le constater, le chemin que j'utilise est correct car, selon la variable ls
, le fichier dont j'ai besoin update-plugins.sh
se trouve dans le répertoire dans lequel j'ai accédé. Pour une raison quelconque, lorsque Jenkins cherche réellement le script, il ajoute @tmp/durable-8d48734f/script.sh
sur le chemin.
Divers dépannage:
Pourquoi Jenkins ajoute-t-il le bit @tmp et existe-t-il un moyen de prévenir ce problème?
Avez-vous essayé d'utiliser la variable d'environnement d'espace de travail jenkins WORKSPACE
(chemin absolu de l'espace de travail)? Avec cela, votre ligne ressemblerait à quelque chose comme ceci:
sh '${WORKSPACE}/jenkins/pipeline/update-jenkins-plugins-ppln/update-plugins.sh'
Je suppose que votre pwd n'est pas dans PATH, vous devez donc l'appeler comme suit: sh './update-plugins.sh'
J'avais le même problème. Je pense que @Oren a techniquement répondu à votre question à propos de pourquoi Jenkins crée cet espace tmp
, mais je peux partager quelques informations sur la façon dont je l'ai résolu.
Fondamentalement, mes liens symboliques pour mon hôte Jenkins bin/sh
à dash
; pas bash
. L’utilisation d’un script shell compatible POSIX a donc résolu le problème.
Par exemple, j'essayais d'utiliser shopt -s extglob
pour faire une correspondance de modèle:
stage {
def shellCommand = $/ "rm -rf ! (_data|_includes|_plugins|Gemfile|_config.yml|page-builder)"/$
sh(returnStdout: true, script: shellCommand).trim()
}
Puisque dash
ne supporte pas extglob
, le remplacer par une commande find
compatible POSIX:
stage {
sh('find . -regextype posix-extended -not -regex ".*includes.*|.*data.*|.*plugins.*|.*config.yml|.*Gemfile.*"')
}
Le dossier @tmp est là pour les statistiques de tâches et d'étapes Jenkins (durée des étapes, etc.), vous pouvez le supprimer si vous voulez être sûr. Je suppose que votre type de problème est lié au mauvais chemin, revérifiez-le.