npm o'rnatilishi docker dagi jenkins trubkasida bajarilmaydi

Men Jenkins quvur liniyasi haqida dars beraman va 6.10 docker container ostida ishlaydigan "salom dunyosi" ni olishim mumkin.

But, when I added a default EmberJS app (using ember init) to the repo and attempt to build that in the pipeline, it fails when running npm install (because of directory access issues). The Jenkinsfile can be seen here: https://github.com/CloudTrap/pipeline-tutorial/blob/fix-build/Jenkinsfile

Qurilish tomonidan chop etilgan xato xabari (mahalliy sifatida o'rnatilgan va MacBook-da java -jar jenkins.war yordamida ishlaydigan, tegishli emas, lekin faqatgina shu jumladan) ishlatiladi:

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.

Eslatma: emas npm install ni root/sudo sifatida ishlatishni xohlayman.

UPDATE: Men biroz muvaffaqiyatga erishdim:

Jenkinsning konteynerni loglardan foydalanish uchun ishlatadigan buyrug'ini topdim:

[Pipeline] withDockerContainer
$ docker run -t -d -u 501:20 -w /long-workspace-directory -v /long-workspace-directory:/long-workspace-directory:rw -v /[email protected]:/[email protected]:rw -e

Shunday qilib, docker tasviri ishlaydigan vaqtda ish katalogi /long-workspace-directory (bu, albatta, sirli jenkins ish maydoni yo'li) va foydalanuvchi identifikatori 501 (guruh identifikatori 20) va boshqalar. foydalanuvchi nomiga ega emas (u bu savolga aloqador bo'lmagan boshqa narsalarni buzadi).

  1. Changed agent to use a Dockefile:

    agent {
      dockerfile {
        filename 'Dockerfile'
        args '-v /.cache/ -v /.bower/  -v /.config/configstore/'
      }
    }
    
  2. Specify args '-v ...' for creating volumes for the directories npm install/bower needs.

16
npm ERR! Iltimos, ushbu buyruqni ildiz/Administrator sifatida qayta ishlashga urinib ko'ring. bu maslahatni sinab ko'ring.
qo'shib qo'ydi muallif kumkanillam, manba
Iltimos, nvm ga qarang.
qo'shib qo'ydi muallif Ebrahim Pasbani, manba
Bunga o'xshash, stackoverflow.com/q/43818327/627727 ning takrorlanishi mumkin.
qo'shib qo'ydi muallif mkobit, manba
Yoki Dockerfile ichidagi papka ruxsatini o'zgartirishingiz mumkin Bu erda
qo'shib qo'ydi muallif Claudiu Hojda, manba
Odatda, npm install ni ildiz sifatida ishlatmaysiz; bu haqiqatan ham kambag'al shakldadir; men bundan qochmoqchiman.
qo'shib qo'ydi muallif les2, manba
Global qaramlikni o'rnatmayapman. Men nvmni ishda va bizning joriy sozlamalarimiz uchun keng foydalanamiz.
qo'shib qo'ydi muallif les2, manba
Tasvirni noto'g'ri ishlatib qo'yaman deb o'ylayman. tugun tasvirini bir qator tuzish buyruqlarini ishga tushirmagan tugun serveriga ishlov berish uchun ishlatiladi.
qo'shib qo'ydi muallif les2, manba
foydalanuvchi yoki biror narsa yaratishni o'ylashim kerak; dockerfile da USER myuser buyrug'ini ishlatish
qo'shib qo'ydi muallif les2, manba
NPM ning kesh katalogini ish joylari katalogiga kiritish orqali bir oz muvaffaqiyatga erishmoqchiman; qurish dockerda ishlayotganda, jenkins ish tashqarisidan tashqarida bo'lgan narsalarni buzadigan ko'rinadi.
qo'shib qo'ydi muallif les2, manba

6 javoblar

from 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
    }
}
11
qo'shib qo'ydi
'HOME =' ni belgilashni tasdiqlay olaman. etarli
qo'shib qo'ydi muallif amarillion, manba
To'liqlik uchun muhit {HOME = "." } , Jenkins deklarativ sintaksisi uchun muammoni ketkazadi.
qo'shib qo'ydi muallif bordeltabernacle, manba
npm_config_cache $ HOME/.npm bo'lgani uchun faqat HOME =. ni o'rnatishingiz kerak, shuning uchun bu holda bo'ladi. o'rniga
qo'shib qo'ydi muallif Ido Sorozon, manba

Ushbu masala bo'yicha butun kunni behuda sarflagan holda, muammolarni bartaraf etgan Quvur liniyasi muharriri yordamida agentlar bosqichida quyidagi muhit o'zgaruvchisi sifatida quyidagilarni qo'shishni aniqladim.

'npm_config_cache=npm-cache'
7
qo'shib qo'ydi
Men ipdan foydalanmoqdaman va bir xil muammoga egaman. Uni ipni qanday qilib echishni bilasizmi?
qo'shib qo'ydi muallif Zhao Yi, manba
Ushbu konfiguratsiyani qanday ishlatish kerak?
qo'shib qo'ydi muallif Xin Meng, manba

Men ayni masalani qo'shmoqchiman. Docker tasvirini ishlatish uchun uni root foydalanuvchi yordamida hal qildim:

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"
        }
    }
}
4
qo'shib qo'ydi

Biz bir xil muammolarga duch keldik, biz uchun muammoning mohiyati, konteyner va foydalanuvchi Jenkins tugunidagi foydalanuvchi turli UIDlarga ega ekanligi edi. Uid + GIDni foydalanuvchi konteynerida o'zgartirgandan so'ng (va o'zgarish foydalanuvchilar uy-katalogiga egalik qilish) qurish tugunini npm bilan ishlayotgan foydalanuvchi odatdagidek harakat qiladi.

Bu konteyner-foydalanuvchining "Home-Directory" yozuvi yozilmasligi ham mumkin.

Dockerfile-dagi kod:

RUN usermod -u   && \
    groupmod -g   && \
    chown -R : /home/

Ishchi joy konteynerga o'rnatilgandan keyin u allaqachon tegishli bo'ladi UID. Jenkinsfile orqali konteynerni ishlatganda UID va GID konteyner foydalanuvchisi avtomatik ravishda buildnode-ga mos keladigan tarzda o'rnatiladi. Lekin uy katalogi asl egasiga ega bo'ladi.

Endi node_modules joriy katalogga joylashtiriladi.

1
qo'shib qo'ydi

Siz Jenkins docker konteynerini ishlating, masalan, bu erda root (userid: groupid 0: 0) bilan bekor qiladigan foydalanuvchini bekor qilishingiz mumkin:

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

Mavjud foydalanuvchini konsol chiqqanda docker run parametrlarida topishingiz mumkin.

1
qo'shib qo'ydi

nvm NVM_DIR bilan mahalliy katalogga joylashtirilgunga qadar uni butun dunyo bo'ylab qo'shilmasdan o'rnatishingiz mumkin:

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

Yangi joylar:

$ which node
~/someDir/node_dir/versions/node/v7.7.2/bin/node

$ which npm
~/someDir/node_dir/versions/node/v7.7.2/bin/npm
0
qo'shib qo'ydi