Je reçois l'étrange erreur ci-dessous dans mon pipeline Jenkins
stage("Build docker containers & coreupdate packages") { agent { docker { image "quay.io/arubadevops/acp-build:ut-build" label "acp-ci-ubuntu" args "-u ubuntu --net=host -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/.docker:/home/ubuntu/.docker" } } steps { script { try { sh "export CI_BUILD_NUMBER=${currentBuild.number}; cd docker; ./build.sh; cd ../test; ./build.sh;" ciBuildStatus="PASSED" } catch (err) { ciBuildStatus="FAILED" } } } }
L'étape correspondante dans le pipeline Jenkins est
[Pipeline] withDockerContainer acp-ci-ubuntu-test does not seem to be running inside a container $ docker run -t -d -u 1002:1006 -u ubuntu --net=host -v /var/run/docker.sock:/var/run/docker.sock -v /home/ubuntu/.docker:/home/ubuntu/.docker -w /home/ubuntu/workspace/CD-acp-cassandra -v /home/ubuntu/workspace/CD-acp-cassandra:/home/ubuntu/workspace/CD-acp-cassandra:rw,z -v /home/ubuntu/workspace/CD-acp-cassandra@tmp:/home/ubuntu/workspace/CD-acp-cassandra@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** quay.io/arubadevops/acp-build:ut-build cat $ docker top 83d04d0a3a3f9785bdde3932f55dee36c079147eb655c1ee9d14f5b542f8fb44 -eo pid,comm [Pipeline] { [Pipeline] sh process apparently never started in /home/ubuntu/workspace/CD-acp-cassandra@tmp/durable-70b242d1 (running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer) [Pipeline] } $ docker stop --time=1 83d04d0a3a3f9785bdde3932f55dee36c079147eb655c1ee9d14f5b542f8fb44 $ docker rm -f 83d04d0a3a3f9785bdde3932f55dee36c079147eb655c1ee9d14f5b542f8fb44 [Pipeline] // withDockerContainer
Quelles pourraient être les raisons pour lesquelles le processus ne démarre pas dans le conteneur Docker? Tous les pointeurs sur la façon de déboguer davantage sont également utiles.
6 Réponses :
Le problème est causé par des changements de rupture introduits dans le plugin Jenkins durable-task v1.31.
La source:
https://issues.jenkins-ci.org/browse/JENKINS-59907 et https://github.com/jenkinsci/durable-task-plugin/blob/master/CHANGELOG.md
Solution: la mise à niveau du plug-in de tâches durables Jenkins vers la v1.33 a résolu le problème pour nous.
Si vous avez mis à niveau le plugin durable-task vers la version 1.33 ou une version ultérieure et que cela ne fonctionne toujours pas, vérifiez s'il existe une variable d'environnement vide configurée dans votre pipeline ou stockée dans la configuration Jenkins (en pointillé) et supprimez-la:
Cette erreur signifie que le processus Jenkins est bloqué sur une commande.
Quelques suggestions:
alwaysPull true
(ligne suivante de l' image
).agent
intérieur de la stage
, retirez l'agent externe. Voir: JENKINS-63449 .org.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true
dans la console de script de Jenkins pour déboguer.docker ps
pour voir quelle commande est en cours d'exécution.docker ps -a
pour voir les dernières exécutions ayant échoué. Dans mon cas, il a essayé d'exécuter cat
côté de la commande CMD personnalisée définie par le conteneur (par exemple, ansible-playbook cat
), qui était la commande invalide. La commande cat
est utilisée par conception . Pour changer le point d'entrée, veuillez lire JENKINS-51307 .docker exec -it -u0 $(docker ps -ql) bash
et exécuter ps wuax
pour voir ce qui se passe.En plus de la réponse de kenorb:
J'exécute des conteneurs docker personnalisés et après plusieurs heures de débogage, j'ai trouvé qu'après avoir essayé d'exécuter ce que Jenkins essayait d'exécuter à l'intérieur du conteneur en cours d'exécution (en exécutant dans le conteneur, en exécutant echo "$(ps waux)"
et en les exécutant sh -c
commande une par une). J'ai trouvé que Jenkins ne pouvait pas créer le fichier journal à l'intérieur du conteneur en raison d'une incompatibilité entre l'UID et le GID.
Idem .. aussi des heures de débogage. L'activation des diagnostics de lancement comme suggéré dans la réponse de kenorb m'a conduit au problème du fichier journal. Comment l'avez-vous réparé?
Si vous exécutez Jenkins à l'intérieur de Docker et que vous utilisez un conteneur DinD pour Jenkins exécutant des tâches Docker, assurez-vous de monter votre volume de données Jenkins sur / var / jenkins_home dans le service fournissant le démon Docker. La création du journal est en fait tentée par le démon, ce qui signifie que le conteneur du démon a besoin d'accéder au volume avec l'espace de travail en cours d'exploitation.
Exemple d'extrait de code pour docker-compose.yml:
services: dind: container_name: dind-for-jenkins privileged: true image: docker:stable-dind volumes: - 'jenkins-data:/var/jenkins_home'
J'ai eu ce même problème et dans mon cas, il était lié à l'argument -u <user
passé à l'agent. En fin de compte, changer mon pipeline pour utiliser -u root
résolu le problème.
Dans le message d'origine, je remarque qu'un -u ubuntu
été utilisé pour exécuter le conteneur:
agent { docker { image "app:latest" args "-u root" # <=----------- alwaysPull false reuseNode true } }
J'utilisais également un utilisateur personnalisé, celui que j'ai ajouté lors de la création de l'image Docker.
$ docker run -t -d -u 1000:1000 -u someuser app:image cat $ docker top <hash> -eo pid,comm [Pipeline] { [Pipeline] unstash [Pipeline] sh process apparently never started in /home/jenkins/agent/workspace/branch@tmp/durable-f5dfbb1c
Le démarrage du conteneur localement à l'aide des mêmes commandes Jenkins fonctionne bien:
docker run -t -d -u 1000:1000 -u someuser app:image cat docker top <hash> -eo pid,comm docker exec -it <hash> ls # DO STUFF
Mais dans Jenkins, il échoue avec la même erreur "processus jamais démarré ..":
agent { docker { image "app:latest" args "-u someuser" alwaysPull false reuseNode true } } steps { sh ''' # DO STUFF ''' }
Pour une raison quelconque, le changer en -u root
fonctionné.
docker run -t -d -u 1002:1006 -u ubuntu ... -e ******** quay.io/arubadevops/acp-build:ut-build cat
Avait été confronté au même problème avec l'option Injecter les clés SSH configurée pour se connecter aux conteneurs sous Gérer Jenkins> Configurer le système. Jenkins pouvait se connecter à l'hôte Docker et générer un conteneur, mais ne pouvait pas se connecter au conteneur. Étonnamment, cela fonctionne dans une autre instance Jenkins plus ancienne. Nous avons mis à jour le Dockerfile pour créer un utilisateur avec le même nom d'utilisateur que l'hôte Docker et copier les clés SSH dans le répertoire
~/.ssh
du conteneur. Puis basculé vers l'autre option qui dit Se connecter avec SSH ou quelque chose de similaire pour le faire fonctionner.Je n'utilise pas le transfert de clé. Il fonctionne sur un esclave, mais sur un autre esclave, il échoue toujours avec cette erreur.
Cela ressemble à support.cloudbees.com/hc/en-us/articles/...