Jenkins: problema de permissão usando o Docker como ambiente de construção


11

Instalei o Jenkins em uma máquina Ubuntu 16.04. O Jenkins em si não é executado em um contêiner. O que eu quero fazer é simplesmente chamar yarn installusando uma imagem de nó. Então, aqui está o meu arquivo Jenkins:

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

Bem simples, certo?

O usuário / grupo jenkins é 112:116e o uid do contêiner do nó é 1000, portanto, o processo do fio (que é executado como usuário do nó 1000) não pode fazer suas coisas, como mkdir /.config.

Tentei girar o contêiner do nó que passava no argumento -u 1000, ele esbarrava em problemas de permissão ao tentar criar diretórios duráveis.

Parece um ou outro tipo de problema, como posso resolver isso?

Registros de Jenkins:

Abaixo é onde a compilação começa e falha.

[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

Por favor, adicione os logs
030

Anexou os logs. Também tentei executar o Jenkins usando sua imagem oficial do docker, o que funciona bem, porque o usuário do jenkins nessa imagem do docker é 1000, que é o mesmo uid que o usuário do nó na imagem do nó.
Michael

O selinux está ativado e reforçando?
James Shewey

@JamesShewey Não tenho certeza. Simplesmente abro uma instância do ubuntu AMI ec2.
Michael

Eu acredito que eles desativam, mas verifique com "sestatus". Se estiver ligado, tente desligá-lo.
James Shewey

Respostas:


8

Eu tive o mesmo problema com o nó. Os arquivos no contêiner pertencem a "root: root". Tente adicionar argumentos do docker -u root:root:

docker { 
    image 'node:8'
    args '-u root:root'
}

A solução funcionou para mim também. Por que isso não está na documentação do Jenkins? (o meu problema foi com um simples pip installcomando resultando em Could not install packages due to an EnvironmentError: [Errno 13] Permission denied; mencioná-lo aqui para ajudar pessoas à procura de que mesmo utilizando. virtualenvou pip install --usernão corrigir o problema para mim)
Rabarberski

3

Acabei de ter um problema semelhante hoje, embora com outra imagem.

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

Referência: https://docs.docker.com/storage/tmpfs/ Dessa forma, você não deve se preocupar com vazamentos ou arquivos de segurança que estejam presentes após a destruição do contêiner dentro dos jenkins.


3

buildEnv.inside("-u 0") {}resolveu meu problema. Mas o espaço de trabalho conterá o diretório e os arquivos pertencentes à raiz, que não poderão ser excluídos pelo usuário Jenkins na próxima execução ao limpar o espaço de trabalho, portanto, adicionei sh "sudo chown jenkins: -R \$PWD/" no início do pipeline.


Eu usei uma abordagem semelhante, mas executei 'sh "chmod -R a + w \ $ PWD"' no final, como uma etapa de "Limpeza" do pipeline, em vez de chown no início. O usuário Jenkins não estava definido no meu contêiner e o sudo não estava disponível. Eu poderia ter excluído os arquivos também, mas pensei que seria melhor mantê-los para investigação se algo der errado.
Olivier Boudry
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.