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
Michael
fonte
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'
}
blurrcat
fonte
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.

Anvesh
fonte
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.

AhmedDrira
fonte
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