Я'м после урока трубопровода Дженкинс и я могу получить "Привет Мир" рабочее ПО в контейнер 6.10 докер.
Но, когда я добавил По умолчанию приложение EmberJS (через инициализации Эмбер`) в репо и попытка построить, что в трубопроводе, происходит сбой при запуске НПМ установки (из-за проблем доступа к каталогам). В Jenkinsfile можно посмотреть здесь: https://github.com/CloudTrap/pipeline-tutorial/blob/fix-build/Jenkinsfile
Сообщение об ошибке печатается сборки (которая устанавливается локально и запустить с помощью Ява -фляга Дженкинс.война на MacBook, не актуальны, но включил на всякий случай) - это:
npm ERR! Linux 4.9.12-moby
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v6.10.0
npm ERR! npm v3.10.10
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! at Error (native)
npm ERR! { Error: EACCES: permission denied, mkdir '/.npm'
npm ERR! at Error (native)
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'mkdir',
npm ERR! path: '/.npm',
npm ERR! parent: 'pipeline-tutorial' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
Примечание: Я хотел бы не запустите `НПМ установить как root / суда.
Обновление: мне удалось добиться определенного прогресса следующим образом:
Я нашел команду, которую Дженкинс использует для построения с помощью контейнера из журналов:
[Pipeline] withDockerContainer
$ docker run -t -d -u 501:20 -w /long-workspace-directory -v /long-workspace-directory:/long-workspace-directory:rw -v /long-workspace-directory@tmp:/long-workspace-directory@tmp:rw -e
Поэтому, когда Docker-образ работает, он's работы Каталога является `/долго-пространстве-Каталога (он's действительно загадочно глядя Дженкинс рабочей области путем) и идентификатор пользователя является 501 (ID группы 20) и т. д. Пользователь не'т иметь имя (что, видимо, нарушая другие вещи, не связанные с этим вопросом).
в
агент { файла Docker { именем 'файла Docker' аргументы '-в /.кэш/ -в /.Бауэр/ -в /.конфиг/configstore/' } }
Добавление сред и установки дома '.' решает эту проблему, как показано ниже.
pipeline {
agent { docker { image 'node:8.12.0' } }
environment {
HOME = '.'
}
stages {
stage('Clone') {
steps {
git branch: 'master',
credentialsId: '121231k3jkj2kjkjk',
url: 'https://myserver.com/my-repo.git'
}
}
stage('Build') {
steps {
sh "npm install"
}
}
}
}
от https://github.com/jenkins-infra/jenkins.io/blob/master/Jenkinsfile
docker.image('openjdk:8').inside {
/* One Weird Trick(tm) to allow git(1) to clone inside of a
* container
*/
withEnv([
/* Override the npm cache directory to avoid: EACCES: permission denied, mkdir '/.npm' */
'npm_config_cache=npm-cache',
/* set home to our current directory because other bower
* nonsense breaks with HOME=/, e.g.:
* EACCES: permission denied, mkdir '/.config'
*/
'HOME=.',
]) {
// your code
}
}
Хотел просто предоставить немного более подробно, короче принятый ответ работает, но что я'м новичок в Докер и хотел понять, и подумал, что я'd доля, что я нашел.
Так что для нашей установки Дженкинс, он начинает контейнеров через
docker run -t -d -u 995:315 -w /folder/forProject -v /folder/forProject:/folder/forProject:rw,z ...
В результате этот контейнер работает как пользователя с uid=995 гид=315 группы=315`
Поскольку этот образ я использовал (circleci/узел:последний) нет пользователя с этим UID/GID не пользователь не будет иметь “домашнюю папку” и будет иметь право только на подключенном томе.
Когда команды НПМ называют его попробовать использовать, что домашний каталог пользователя (для кэша) и так, что пользователь не был создан на изображение, домашний каталог устанавливается на /
(по умолчанию для Linux?). Поэтому для получения НПМ для корректной работы мы просто контейнеры дома переменной среды для пользователей в текущей папке через Дженкинс файл
трубопровод { агента нет этапы { этап('НПМ установки') { агент { докер { изображения 'circleci/узел:последний' } } среды { дома=то".&и" } ... } } }
Таким образом, давая пользователю возможность создать необходимый.НПМ папку в/папка/форпроект/.НПМ`
Надеюсь, это поможет кому-то и если вы видите что-то, что я ошибаюсь, пожалуйста, дайте мне знать :Д
Я добавить один и тот же вопрос. Я решил ее с помощью пользователя root
, чтобы запустить Докер изображение:
node {
stage("Prepare environment") {
checkout scm
// Build the Docker image from the Dockerfile located at the root of the project
docker.build("${JOB_NAME}")
}
stage("Install dependencies") {
// Run the container as `root` user
// Note: you can run any official Docker image here
withDockerContainer(args: "-u root", image: "${JOB_NAME}") {
sh "npm install"
}
}
}
Вы можете переопределить пользователя, что Дженкинс запускает контейнера грузчик с, например вот я переопределить с корнем (имяпользователя:группы является 0:0):
docker {
image 'node:8'
args '-u 0:0'
}
Вы можете определить текущего пользователя в параметрах докер Run
в выходной консоли.
эта конфигурация работает для меня.
pipeline {
agent {
docker {
image 'node:6-alpine'
args '-p 3000:3000 -p 5000:5000'
args '-u 0:0'
}
}
environment {
CI = 'true'
}
stages {
stage('Build') {
steps {
sh 'npm install --unsafe-perm'
}
}
stage('Test') {
steps {
sh './jenkins/scripts/test.sh'
}
}
stage('Deliver for development') {
when {
branch 'development'
}
steps {
sh './jenkins/scripts/deliver-for-development.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
sh './jenkins/scripts/kill.sh'
}
}
stage('Deploy for production') {
when {
branch 'production'
}
steps {
sh './jenkins/scripts/deploy-for-production.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
sh './jenkins/scripts/kill.sh'
}
}
}
}
У нас была такая же проблема, основная проблема для нас было то, что пользователь в контейнере, а пользователь, запускающий узел Дженкинс были разные жидкости. После изменение UID+GID пользователя в контейнере (и меняется право собственности на домашних пользователей-каталог), чтобы соответствовать пользователь выполняется сборка узла НПМ будет вести себя нормально.
Это может также произойти, если дома-каталог контейнер-пользователь не доступен для записи.
Код в файла Docker:
RUN usermod -u <uid of buildnode> <container user> && \
groupmod -g <gid of buildnode> <container user group> && \
chown -R <container user>:<container user group> /home/<container user>
В качестве рабочей области устанавливается в контейнере, он уже будет принадлежать УИД. При запуске контейнера через Jenkinsfile UID и GID контейнер пользователя устанавливаются автоматически, чтобы соответствовать buildnode. Но домашний каталог будет по-прежнему имеют своего первоначального владельца.
Теперь папки node_modules будет помещен в текущий каталог.
В моем случае проблема была в том, что внутри контейнера я был Дженкинс пользователя вместо root. У меня есть значения whoami
внутри контейнера и получил ошибку, как не может определить пользователя 111 (что случается Дженкинс). Поэтому я сделал следующее:
этап('выполнения сборки') { webappImage.изнутри(" У-у корень-то") { Ш "и пряжа запуск сборки"и } }
Вы можете установить НВМ
на лету перед началом строительства, в локальный каталог с NVM_DIR без установки его в качестве глобальных зависимостей :
mkdir -p node_dir
export NVM_DIR=$(pwd)/node_dir
curl https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
source $(pwd)/node_dir/nvm.sh
nvm install 7
nvm use 7
Новые локации :
$ which node
~/someDir/node_dir/versions/node/v7.7.2/bin/node
$ which npm
~/someDir/node_dir/versions/node/v7.7.2/bin/npm