Jenkins: problème d'autorisation à l'aide de Docker comme environnement de génération

11

J'ai installé Jenkins sur une machine Ubuntu 16.04. Le Jenkins lui-même n'est pas exécuté dans un conteneur. Ce que je veux faire, c'est simplement appeler en yarn installutilisant une image de nœud. Voici donc mon fichier Jenkins:

pipeline {
    agent any
    stages {
        stage('install node modules...') {
            agent { docker 'node' }
            steps {
                sh 'cd /path/to/package.json; yarn install'
            }
        }
    }
}

Assez simple, non?

jenkins user / group est 112:116, et l'uid du conteneur de noeud est 1000, donc le processus de fil (qui est exécuté en tant qu'utilisateur de noeud 1000) ne peut pas faire ses choses, comme mkdir /.config.

J'ai essayé de faire tourner le conteneur de nœuds en passant l'argument -u 1000, il a rencontré des problèmes d'autorisation lors de la création de répertoires durables.

Cela ressemble à l'un ou l'autre type de problème, comment puis-je contourner ce problème?

Journaux Jenkins:

Vous trouverez ci-dessous où la génération démarre et échoue.

[Pipeline] sh
[Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2] Running shell script
+ docker inspect -f . node
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 112:116 -w /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2 -v /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2:/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2:rw,z -v /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2@tmp:/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** --entrypoint cat node
[Pipeline] {
[Pipeline] sh
[Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2] Running shell script
+ cd /path/to/package.json
+ yarn install
yarn install v0.24.6
error An unexpected error occurred: "EACCES: permission denied, mkdir '/.config'".
info If you think this is a bug, please open a bug report with the information provided in "/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2/<path>/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
[Pipeline] }
$ docker stop --time=1 c1147934ea689f71a449e486282db03338b12182368def31bdf8e8cf179ab46a
$ docker rm -f c1147934ea689f71a449e486282db03338b12182368def31bdf8e8cf179ab46a
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE
Michael
la source
Veuillez ajouter les journaux
030
Attaché les journaux. J'ai également essayé d'exécuter Jenkins en utilisant son image docker officielle, ce qui fonctionne bien, car l'utilisateur jenkins dans cette image docker est 1000, ce qui est le même uid que l'utilisateur du nœud dans l'image du nœud.
Michael
Selinux est-il activé et appliqué?
James Shewey
@JamesShewey Pas sûr. J'étends simplement une instance ubuntu AMI ec2.
Michael
Je crois qu'ils le désactivent, mais vérifiez avec "sestatus". S'il est activé, essayez de le désactiver.
James Shewey

Réponses:

8

J'ai eu le même problème avec le nœud. Le fait est que les fichiers dans le conteneur appartiennent à "root: root". Essayez d'ajouter des arguments de docker -u root:root:

docker { 
    image 'node:8'
    args '-u root:root'
}
blurrcat
la source
La solution a également fonctionné pour moi. Pourquoi n'est-ce pas dans la documentation Jenkins? (Mon problème était avec une simple pip installcommande qui en résultait Could not install packages due to an EnvironmentError: [Errno 13] Permission denied; le mentionner ici pour aider les gens à le rechercher. Même en utilisant virtualenvou pip install --usersans résoudre le problème pour moi)
Rabarberski
3

Je viens d'avoir un problème similaire aujourd'hui, bien qu'avec une autre image.

docker {
 image 'node:8'
 args '--tmpfs /.config'
}

Référence: https://docs.docker.com/storage/tmpfs/ De cette façon, vous ne devriez pas vous inquiéter des fuites de sécurité ou des fichiers qui sont présents après la destruction du conteneur à l'intérieur des jenkins.

Anvesh
la source
3

buildEnv.inside("-u 0") {}résolu mon problème. Mais alors l'espace de travail contiendra un répertoire et des fichiers appartenant à root qui ne peuvent pas être supprimés par l'utilisateur Jenkins lors de la prochaine exécution lors du nettoyage de l'espace de travail, j'ai donc ajouté sh "sudo chown jenkins: -R \$PWD/" au début du pipeline.

AhmedDrira
la source
J'ai utilisé une approche similaire, mais j'ai exécuté 'sh "chmod -R a + w \ $ PWD"' à la fin, en tant qu'étape "Cleanup" du pipeline au lieu de chown au début. L'utilisateur Jenkins n'était pas défini dans mon conteneur et sudo n'était pas disponible. J'aurais pu aussi supprimer les fichiers, mais j'ai pensé qu'il serait préférable de les conserver pour enquête si quelque chose ne va pas.
Olivier Boudry