Трубопровод Дженкинса построить внутри контейнера

Я пытаюсь запустить шаг сборки внутри контейнера докера. Вот мой Jenkinsfile

    pipeline {
        agent { label 'slave1' }
        stages {
            stage ('Build') {
                agent {
                    docker {image 'node:8'}
                }
                steps {
                    sh "npm install"
                }
            }
        }
        post {
            failure {
                script {
                    echo "TestRail failed"
                }
            }
        }
    }

Но шаг терпит неудачу со следующей ошибкой

    [Frontend@2] Running shell script
    + npm install
    npm WARN mycloud@1.0.0 No repository field.
    npm WARN mycloud@1.0.0 No license field.

    npm ERR! path /.npm
    npm ERR! code EACCES
    npm ERR! errno -13
    npm ERR! syscall mkdir
    npm ERR! Error: EACCES: permission denied, mkdir '/.npm'
    npm ERR!  { Error: EACCES: permission denied, mkdir '/.npm'
    npm ERR!   stack: 'Error: EACCES: permission denied, mkdir \'/.npm\'',
    npm ERR!   errno: -13,
    npm ERR!   code: 'EACCES',
    npm ERR!   syscall: 'mkdir',
    npm ERR!   path: '/.npm' }
    npm ERR! 
    npm ERR! The operation was rejected by your operating system.
    npm ERR! It is likely you do not have the permissions to access this file as the current user
    npm ERR! 
    npm ERR! If you believe this might be a permissions issue, please double-check the
    npm ERR! permissions of the file and its containing directories, or try running
    npm ERR! the command again as root/Administrator (though this is not recommended).
    [Pipeline] }
    $ docker stop --time=1 56e0023a9538d890a72a07bc3e57aa99b6c92d0adfc99f8e70117dd143e3d22b
    $ docker rm -f 56e0023a9538d890a72a07bc3e57aa99b6c92d0adfc99f8e70117dd143e3d22b

Когда я запускаю контейнер докера вручную, а затем выполняю npm install все работает как положено.

Если запустить контейнер от имени пользователя root -u 0:0 затем npm install проходит

            agent {
                docker {
                    image 'node:8'
                    args '-u 0:0'
                }
            }

но очистка рабочей области jenkins завершается неудачно с:

        ERROR: Error fetching remote repo 'origin'
    hudson.plugins.git.GitException: Failed to fetch from https://github.com/mycompany/Frontend.git
        at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:888)
        at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1155)
        at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1186)
        at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:120)
        at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:90)
        at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:77)
        at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution$1$1.call(SynchronousNonBlockingStepExecution.java:50)
        at hudson.security.ACL.impersonate(ACL.java:290)
        at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution$1.run(SynchronousNonBlockingStepExecution.java:47)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: hudson.plugins.git.GitException: Command "git clean -fdx" returned status code 1:
    stdout: 
    stderr: warning: failed to remove node_modules/grunt-contrib-copy/README.md: Permission denied
    warning: failed to remove node_modules/grunt-contrib-copy/package.json: Permission denied
    warning: failed to remove node_modules/grunt-contrib-copy/tasks/copy.js: Permission denied
    warning: failed to remove node_modules/grunt-contrib-copy/LICENSE-MIT: Permission denied
    warning: failed to remove node_modules/meow/readme.md: Permission denied

Здесь я пытаюсь запустить процесс сборки в докер-контейнере, а не на сборочной машине, поэтому мне не нужно устанавливать пакет на сборочной машине, он будет получен из образа контейнера.

Что мне здесь не хватает?

2 ответа

В настоящее время у меня нет доступа к моему серверу, поэтому я не могу его протестировать, но вы пытались skipDefaultCheckoutа потом извлекать из репозитория на стадии докера?

pipeline {
    agent { label 'slave1' }

    options {
        skipDefaultCheckout true
    }

    stages {
        stage ('Build') {
            agent {
                docker {image 'node:8'}
            }
            steps {
                checkout scm
                sh "npm install"
            }
        }
    }
    post {
        failure {
            script {
                echo "TestRail failed"
            }
        }
    }
}

Используйте шаг докера из облачных пчел вместо того, чтобы использовать его в качестве агента. Сделав это, вы извлечете мастер и смонтируете рабочую область в Docker как том (неявно сделанный плагином Docker).

Какой идентификатор вашего пользователя Jenkins? Насколько я помню, если у вашего пользователя jenkins есть ID 1000, вам не нужно переопределять пользователя, потому что в образе докера узла по умолчанию есть пользователь с 1000 в качестве ID и не должно быть никаких проблем с правами доступа к файлам (для удаления файлов).

Извините за синтаксические ошибки, так как я не на моей машине

def image = docker.image(‘node:latest’)
image.pull()
image.inside(dockerOptions) {
   sh “npm”
   // my other logic
  }
Другие вопросы по тегам