it-swarm.com.de

Jenkins erkennt den Befehl sh nicht?

Ich habe sehr viel Mühe gehabt, eine Jenkins-Datei zum Laufen zu bringen. Ich habe versucht, dieses Testskript auszuführen:

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

Ich erhalte jedoch diese Fehlermeldung, wenn ich versuche zu bauen:

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

Ich habe alle Pipeline-Plugins auf die neueste Version aktualisiert und stecke immer noch in diesem Fehler. Irgendeine Hilfe?

10
Jonathan Wong

Es scheint also, dass der Grund war, dass die globale Eigenschaft PATH das Problem verursachte. Durch das Wechseln zu Manage Jenkins -> Configure System und Löschen der globalen Eigenschaft PATH wurde mein Problem behoben. Siehe JENKINS-41339 .

14
Jonathan Wong

Jonathans Antwort ist insofern korrekt, als das Ändern von $ PATH mit den Jenkins-Umgebungsvariableneinstellungen dieses Problem verursacht. Wenn Sie jedoch nur die PATH-Anpassungen löschen, werden Sie wahrscheinlich die Funktionalität verlieren, insbesondere wenn Sie in Ihrem Jenkins Freestyle-Projekte haben.

Im gesamten Rest des Universums ist es üblich, $ PATH zu bearbeiten, indem Sie es auf Ihr neues Ding plus den vorhandenen $ PATH setzen, wie folgt:

PATH=/opt/blah/bin:$PATH

Damit wird /opt/blah/bin dem vorangegangenen $PATH vorangestellt. Der endgültige $PATH könnte also so aussehen: /opt/blah/bin:/usr/local/bin:/usr/sbin:/bin (dies ist natürlich nur ein Beispiel)

Dies funktioniert eigentlich gut für Jenkins Freestyle-Projekte. Bei Pipeline-Projekten wertet Jenkins die $ PATH-Variable jedoch aus irgendeinem Grund nicht aus und ersetzt sie nicht in der von Ihnen festgelegten Variable. Sie enden also buchstäblich mit einem Pfad von /opt/blah/bin:$PATH - also ist nichts, was vorher da war, noch in Ihrem $ PATH!

Anstatt den Fehler nur zu beheben, entschied sich Jenkins Project dafür, (1) den Zustand zu erkennen und eine seltsame Warnung ("Warnung: JENKINS-41339 wahrscheinlich falsch") anzuzeigen, die besagt, dass Sie dieses Ticket überprüfen und (2) ein brandneues erstellen sollten So definieren Sie Ergänzungen für PATH, die beste Lösung für Ihr Problem, da Sie $ PATH anpassen können, ohne alles zu zerstören. Dies tun Sie in Jenkins-> Configure System.

  • Definieren Sie eine Variable mit dem Namen PATH+EXTRA, wobei EXTRA anscheinend alles sein kann.

  • Fügen Sie in diese Variable einfach Ihre Ergänzungen für den PFAD ein. In meinem obigen Beispiel würde ich also NICHT PATH einstellen, sondern nur: PATH+EXTRA=/opt/blah/bin

  • Entfernen Sie jetzt eine definierte Variable PATH.

Laut einem verwandten Ticket ist dies irgendwo in Jenkins dokumentiert, aber nicht an der Stelle dokumentiert, an der es sein muss, in Manage Jenkins-> Configure System.

23
XP84

Um dieses Problem zu beheben, sollten Sie den folgenden Schritt hinzufügen, falls Sie die globale Eigenschaft PATH nicht aus "Jenkins verwalten -> System konfigurieren" löschen können:

withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin'])

Wie folgt: für Scripted Pipeline:

node {
  stage ('STAGE NAME') {
    withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin']) {
      sh '//code block'
    }
  }
}

oder für deklarative Pipeline:

pipeline {
  agent {
    label 'master'
  }

  stages {
    stage ('STAGE NAME') {
      steps {
        withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin']) {  
          sh '''
            //code block
          '''
        }
      }
    }

Ich hoffe das hilft. Ich hatte auch viel Mühe, eine Lösung dafür zu finden.

8
Asgard

Jenkins weiß nicht, was Sie mit sh meinen.

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

Dies bedeutet, dass sich die ausführbare Datei für Ihre Shell nicht in Ihrem Pfad befindet. Gehen Sie zu Manage Jenkins -> Configure System, bis Sie den mit Shell bezeichneten Abschnitt finden

 empty Shell path in Jenkins

Fügen Sie der ausführbaren Datei, die Sie für Ihre Shell verwenden möchten, den Pfad hinzu, wenn Sie sh aufrufen. Stellen Sie alternativ sicher, dass sich der Ort für die ausführbare Datei für sh in dem Pfad befindet, der von Ihrer Jenkins-Instanz verwendet wird (der abhängig von anderen Faktoren möglicherweise dem Systempfad entspricht oder nicht).

Einige Beispiele

Unter Windows soll shpowershell * bedeuten. Sie können dies tun, indem Sie den Shell-Pfad so einstellen, dass er auf Powershell zeigt.

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

Wenn Sie sich auf * nix befinden, verwendet Jenkins standardmäßig die Shell, die bereits für den Benutzer definiert ist, für den Jenkins ausgeführt wird. Sie können jedoch den Pfad zu einer bestimmten Shell angeben, sodass Jenkins diese Shell immer verwendet. Um beispielsweise sh immer als Bash auszuführen, könnte man angeben

/bin/bash

Da Jenkins bestimmte Build-Schritte für Windows-Stapel- und Powershell-Befehle hat, neige ich dazu, die Shell speziell als * nix-Style-Shell zu betrachten. Auf einem Windows-System müssten Sie eine Art Shell-Emulator wie Cygwin installieren.

1
Tuffwer