web-dev-qa-db-fra.com

Le travail de pipeline Jenkins ne peut pas trouver de script en raison de la création du chemin @tmp

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:

  • J'ai lu que vous devez vérifier à nouveau la branche même si vous la vérifiez déjà pour obtenir le fichier Jenkins, alors je le suis.
  • J'ai ssh'd dans la boîte Jenkins pour vérifier et oui, le script est là.

Pourquoi Jenkins ajoute-t-il le bit @tmp et existe-t-il un moyen de prévenir ce problème?

13
Alex

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'
3
grubers

Je suppose que votre pwd n'est pas dans PATH, vous devez donc l'appeler comme suit: sh './update-plugins.sh'

2
izzekil

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.*"')
} 
1
knack

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.

0
Oren