J'ai de la difficulté à exécuter une simple Jenkinsfile
- par exemple.
pipeline {
agent { label 'ssh-slave' }
stages {
stage('Shell Test') {
steps {
sh 'echo "Hello World"'
}
}
}
}
Les fichiers journaux de Jenkins sur le maître indiquent que le conteneur a été démarré avec succès, mais que le travail de construction se bloque avec le message suivant:
sh: 1: /home/jenkins/workspace/pipeline@tmp/durable-34c21b81/script.sh: Permission denied
Voici quelques éléments supplémentaires que nous avons configurés/calculés:
Nous exécutons l'agent sur un VM avec RHEL
Nous utilisons le Docker Plugin for Jenkins pour démarrer/gérer les conteneurs sur un agent Jenkins distinct
Nous faisons tourner le conteneur Docker en utilisant la méthode Connect with ssh
dans le plugin Jenkins et utilisons le jenkinsci/ssh-slave Image Docker
Jenkins utilise l'utilisateur root
dans le conteneur Docker (au moins tous les fichiers contenus dans /home/jenkins/...
sont créés en tant qu'utilisateur root).
Lorsque nous ajoutons une étape sleep
dans le pipeline et docker exec...
dans le conteneur en cours d'exécution, nous ne pouvons pas exécuter un simple script Shell en tant que root, si nous essayons de l'exécuter avec ./script.sh
(même si nous définissons le fichier approprié mode avec chmod +x script.sh
avant) - nous obtenons également sh: 1: permission denied
. Mais nous pouvons exécuter le script, si nous utilisons sh script.sh
L'utilisateur root
dans le conteneur Docker a une bash
- alors que Jenkins tente d'exécuter le script avec sh
.
L'erreur se produit que nous vérifiions ou non l'indicateur run privileged
dans la configuration du modèle du plugin Docker.
Choses que nous avons déjà essayées mais qui n'ont pas fonctionné
Modification du shell de connexion de l'utilisateur root
dans le conteneur Docker en /bin/sh
Fournir un shebang dans l'étape sh
, à la
sh '' '#!/bin/sh echo "bonjour le monde" '''..
Définition de l'exécuteur de shell sur /bin/sh
dans la configuration globale de Jenkins
Changer la Dockerfile
de l'image Docker ssh-slave de telle sorte que la ENTRYPOINT
n'exécute pas de script bash
, mais exécute /bin/sh
à la fin
Toute aide est appréciée!
Le problème était que /home/jenkins
dans le conteneur était monté avec noexec
:
$ mount
/dev/mapper/rhel-var on /home/jenkins type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)
Le problème sous-jacent était que le /var
sur l'hôte sous-jacent avait été monté avec noexec
(/var
est l'endroit où tous les fichiers de conteneur résident ...):
$ mount
/dev/mapper/rhel-var on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)
La solution à ce problème a donc été de monter /var
comme exécutable sur l’hôte via
Sudo mount -o remount,exec /var
cela a résolu le problème pour nous.