Jenkins: problema de permisos al usar Docker como entorno de compilación

11

Instalé Jenkins en una máquina Ubuntu 16.04. El Jenkins en sí no se ejecuta en un contenedor. Lo que quiero hacer es simplemente llamar yarn installusando una imagen de nodo. Así que aquí está mi archivo Jenkins:

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

Bastante sencillo, ¿verdad?

jenkins user / group es 112:116, y el uid del contenedor de nodos es 1000, por lo tanto, el proceso de hilo (que se ejecuta como nodo de usuario 1000) no puede hacer sus cosas, como mkdir /.config.

Traté de hacer girar el contenedor del nodo pasando el argumento -u 1000, se topó con problemas de permisos al intentar crear directorios duraderos.

Parece uno u otro tipo de problema, ¿cómo puedo solucionarlo?

Jenkins registra:

A continuación es donde comienza la construcción y falla.

[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
Miguel
fuente
Agregue los registros
030
Adjunto los registros. También intenté ejecutar Jenkins usando su imagen oficial de acoplador, que funciona bien, porque el usuario de jenkins en esa imagen de acoplador es 1000, que es el mismo uid que el usuario de nodo en la imagen de nodo.
Michael
¿Selinux está habilitado y se hace cumplir?
James Shewey
@JamesShewey No estoy seguro. Simplemente abro una instancia de ubuntu AMI ec2.
Michael
Creo que lo desactivan, pero verifique con "sestatus". Si está encendido, intente apagarlo.
James Shewey

Respuestas:

8

Tuve el mismo problema con el nodo. La cuestión es que los archivos en el contenedor son propiedad de "root: root". Intente agregar argumentos de docker -u root:root:

docker { 
    image 'node:8'
    args '-u root:root'
}
desenfoque
fuente
La solución también funcionó para mí. ¿Por qué no está esto en la documentación de Jenkins? (mi problema fue con un pip installcomando simple que resultó en Could not install packages due to an EnvironmentError: [Errno 13] Permission denied; mencionándolo aquí para ayudar a las personas que buscan eso. Incluso usando virtualenvo pip install --userno solucionó el problema para mí)
Rabarberski
3

Hoy tuve un problema similar, aunque con otra imagen.

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

Referencia: https://docs.docker.com/storage/tmpfs/ De esta manera no debe preocuparse por las fugas de seguridad o los archivos que están presentes después de que el contenedor se destruya dentro de los jenkins.

Anvesh
fuente
3

buildEnv.inside("-u 0") {}resolvió mi problema Pero luego, el espacio de trabajo contendrá el directorio y los archivos propiedad de root que el usuario Jenkins no puede eliminar en la próxima ejecución al limpiar el espacio de trabajo, por lo que he agregado sh "sudo chown jenkins: -R \$PWD/" al comienzo de la tubería.

AhmedDrira
fuente
Utilicé un enfoque similar, pero ejecuté 'sh "chmod -R a + w \ $ PWD"' al final, como un paso de "Limpieza" de la tubería en lugar de chown al comienzo. El usuario de Jenkins no estaba definido en mi contenedor y sudo no estaba disponible. También podría haber eliminado los archivos, pero pensé que sería mejor guardarlos para la investigación si algo sale mal.
Olivier Boudry