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:
Wir führen den Agenten auf einem VM mit RHEL aus
Wir verwenden das Docker Plugin für Jenkins, um die Container auf einem separaten Jenkins-Agenten zu starten bzw. zu verwalten
Wir bauen den Docker-Container mit der Connect with ssh
-Methode im Jenkins-Plugin auf und verwenden das Docker-Image jenkinsci/ssh-slave
Jenkins verwendet den Benutzer root
im Docker-Container (mindestens alle Dateien in /home/jenkins/...
werden als root erstellt
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.
Der root
-Benutzer im Docker-Container hat eine bash
- während Jenkins versucht, das Skript mit sh
auszuführen.
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
Ändern der Login-Shell des root
-Benutzers im Docker-Container in /bin/sh
Bereitstellung eines Shebang im Schritt sh
à la
sh '' '#!/bin/sh echo "Hallo Welt" '''
Einstellen des Shell-Executors auf /bin/sh
in der globalen Konfiguration von Jenkins
Ä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!
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.