Трубопровод Дженкинса построить внутри контейнера
Я пытаюсь запустить шаг сборки внутри контейнера докера. Вот мой 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
}