wake-up-neo.com

Jenkinsfile: Berechtigung verweigert, wenn im Docker-Container sh step ausgeführt wird

Ich habe Probleme beim Ausführen einer einfachen Jenkinsfile - z.

pipeline {
    agent { label 'ssh-slave' } 
    stages {
        stage('Shell Test') {
            steps {
                sh 'echo "Hello World"'
            }
        }
    }
}

Die Logdateien von Jenkins auf dem Master zeigen an, dass der Container erfolgreich gestartet wurde, der Build-Job jedoch mit einer solchen Meldung abstürzt

sh: 1: /home/jenkins/workspace/[email protected]/durable-34c21b81/script.sh: Permission denied

Hier sind einige zusätzliche Dinge, die wir konfiguriert/herausgefunden haben:

  1. Wir führen den Agenten auf einem VM mit RHEL aus

  2. Wir verwenden das Docker Plugin für Jenkins, um die Container auf einem separaten Jenkins-Agenten zu starten bzw. zu verwalten

  3. Wir bauen den Docker-Container mit der Connect with ssh-Methode im Jenkins-Plugin auf und verwenden das Docker-Image jenkinsci/ssh-slave

  4. Jenkins verwendet den Benutzer root im Docker-Container (mindestens alle Dateien in /home/jenkins/... werden als root erstellt

  5. Wenn wir einen sleep-Schritt in die Pipeline und docker exec... in den laufenden Container einfügen, können wir kein einfaches Shell-Skript als root ausführen, wenn wir versuchen, es mit ./script.sh auszuführen (auch wenn wir vorher den richtigen Dateimodus mit chmod +x script.sh eingestellt haben) - auch wir sh: 1: permission denied. Aber wir können das Skript ausführen, wenn wir sh script.sh verwenden.

  6. Der root-Benutzer im Docker-Container hat eine bash - während Jenkins versucht, das Skript mit sh auszuführen.

  7. Der Fehler tritt auf, unabhängig davon, ob wir das Flag run privileged in der Vorlagenkonfiguration des Docker-Plugins überprüfen oder nicht

Dinge, die wir bereits ausprobiert haben, aber nicht geklappt haben

  1. Ändern der Login-Shell des root-Benutzers im Docker-Container in /bin/sh

  2. Bereitstellung eines Shebang im Schritt sh à la 

     sh '' '#!/bin/sh 
     echo "Hallo Welt" 
    '''
    

  3. Einstellen des Shell-Executors auf /bin/sh in der globalen Konfiguration von Jenkins

  4. Ändern der Dockerfile des ssh-slave Docker-Images so, dass die ENTRYPOINT kein bash-Skript ausführt, sondern am Ende /bin/sh

Jede Hilfe wird geschätzt!

6
Michael Lihs

Problem war, dass /home/jenkins im Container mit noexec geladen wurde:

$ mount
/dev/mapper/rhel-var on /home/jenkins type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)

Das grundlegende Problem war, dass der /var auf dem zugrunde liegenden Host mit noexec gemountet wurde (/var ist der Ort, an dem sich alle Container-Dateien befinden ...)

$ mount
/dev/mapper/rhel-var on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)

Die Lösung für dieses Problem bestand also darin, /var als ausführbar auf dem Host über bereitzustellen

Sudo mount -o remount,exec /var

das löste das Problem für uns.

1
Michael Lihs