web-dev-qa-db-fra.com

Jenkins ne reconnaît pas la commande sh?

J'ai eu beaucoup de difficulté à essayer de faire fonctionner un fichier Jenkins. J'ai essayé d'exécuter ce script de test:

#!/usr/bin/env groovy
node {
    stage('Build') {
        echo 'Building....'
        // Create virtualenv
        sh 'echo "hi"'
    }
    stage('Test') {
        echo 'Building....'
    }
    stage('Deploy') {
        echo 'Deploying....'
    }
}

Mais je continue à avoir cette erreur en essayant de construire:

Warning: JENKINS-41339 probably bogus PATH=/usr/lib64/ccache:/usr/lib64/ccache:$PATH; perhaps you meant to use ‘PATH+EXTRA=/something/bin’?
[test-job-jenkinsfile-pipeline] Running Shell script
Nohup: failed to run command `sh': No such file or directory

J'ai mis à jour tous les plugins de pipeline avec la dernière version et je rencontre toujours cette erreur. De l'aide?

10
Jonathan Wong

Il semble donc que la raison en était que la propriété globale PATH était à l'origine du problème. En allant à Manage Jenkins -> Configure System et en supprimant la propriété globale PATH, le problème a été résolu. Voir JENKINS-41339 .

14
Jonathan Wong

La réponse de Jonathan est correcte en ce sens que la modification de $ PATH à l'aide des paramètres de variable d'environnement Jenkins est à l'origine de ce problème. Toutefois, la suppression de vos personnalisations PATH risque de vous faire perdre certaines fonctionnalités, notamment si vous avez des projets de type Freestyle dans votre Jenkins.

Vous voyez, dans le reste de l'univers, il est très courant d'éditer le $ PATH en le configurant avec votre nouvelle chose plus le $ PATH existant, comme ceci:

PATH=/opt/blah/bin:$PATH

Cela ajoute /opt/blah/bin à ce qui est déjà dans $PATH. Donc, le $PATH final pourrait ressembler à: /opt/blah/bin:/usr/local/bin:/usr/sbin:/bin (ceci est juste un exemple bien sûr)

Cela fonctionne très bien pour les projets de Jenkins Freestyle. Cependant, pour des projets de pipeline, Jenkins pour une raison quelconque n’évalue pas et ne remplace pas la variable $ PATH dans la variable que vous avez définie. Donc, vous vous retrouvez littéralement avec un chemin de /opt/blah/bin:$PATH - donc rien de ce qui était là auparavant n'est encore dans votre $ PATH!

Apparemment, au lieu de simplement corriger ce bogue, le projet Jenkins a décidé de (1) détecter la condition et d'afficher un avertissement étrange ("Avertissement: JENKINS-41339 probablement faux") pour impliquer que vous devriez vérifier ce ticket et (2) créer un nouveau manière de définir les ajouts à PATH, qui est la meilleure solution à votre problème car elle vous permet de personnaliser le $ PATH sans tout casser. Vous faites cela dans Jenkins-> Configure System.

  • Définissez une variable appelée PATH+EXTRA où EXTRA peut apparemment être n'importe quoi.

  • Dans cette variable, il suffit de mettre vos ajouts pour le PATH. Donc, dans mon exemple ci-dessus, je n’aurais PAS mis PATH du tout, mais plutôt:: PATH+EXTRA=/opt/blah/bin

  • Supprimez maintenant toute variable PATH définie.

Selon un ticket related , ceci est documenté quelque part dans Jenkins, mais pas à l'emplacement requis, dans Manage Jenkins-> Configure System.

23
XP84

Jenkins ne sait pas ce que vous voulez dire par sh

Nohup: failed to run command `sh': No such file or directory

Cela signifie que l'exécutable de votre shell n'est pas dans votre chemin. Allez à Manage Jenkins -> Configure System faites défiler jusqu'à ce que vous trouviez la section intitulée Shell

 empty Shell path in Jenkins

Ajoutez le chemin d'accès à l'exécutable que vous souhaitez utiliser pour votre shell lorsque vous appelez sh. Vous pouvez également vous assurer que l'emplacement de l'exécutable pour sh se trouve dans le chemin utilisé par votre instance Jenkins (qui, en fonction d'autres facteurs, peut être identique ou non au chemin système).

Quelques exemples

Sous Windows, vous voudrez peut-être que sh signifie powershell *. Vous feriez cela en définissant le chemin du shell pour qu'il pointe vers Powershell.

 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Si vous êtes sur * nix, Jenkins utilisera probablement par défaut tout type de shell déjà défini, mais vous pouvez spécifier le chemin d'accès à un shell particulier afin que jenkins l'utilise toujours. Par exemple, pour toujours exécuter sh en tant que bash, vous pouvez spécifier

/bin/bash

* Etant donné que Jenkins a des étapes de construction spécifiques pour les commandes batch et PowerShell de Windows, j'ai tendance à considérer le shell spécifiquement comme un shell de style * nix. Sur un système Windows, vous devez installer une sorte d'émulateur Shell, tel que Cygwin.

1
Tuffwer