Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

node_modules don't exist in Jenkins build image

Tags:

docker

jenkins

I am running Jenkins from a Dockerfile, and have successfully integrated with Bitbucket cloud using the local docker.sock. I have setup a new pipeline using Blue Ocean which downloads the repo and builds a simple nodejs app from the Dockerfile.

My files look like this :

Node app

  

    FROM node:8.6.0-slim
    WORKDIR app
    # Install dependencies
    COPY package.json .
    RUN npm install
    RUN ls
    # Import source files
    COPY . .

Jenkinsfile


    pipeline {
        agent { dockerfile true }
        stages {
            stage('Test') {
                steps {
                    sh 'ls -l'
                    sh 'npm test'
                }
            }
        }
    }

However when I run the npm test step, it is complaining that it can't find the node_modules. The step works fine if I run npm install from the Jenkinsfile like sh 'npm install'.

Maybe I am missing something but it looks like jenkins is not running the steps in the build image, which means I have to replicate the npm install and potentially other commands both in the app Dockerfile and the Jenkinsfile.

Is there a way to run the tests in the image originally built or do I have to replicate the build steps from the Dockerfile to the Jenkinsfile?

like image 569
Alex Avatar asked Mar 13 '18 11:03

Alex


2 Answers

Jenkins mounts the project in its own directory. If you use the dockerfile arg it won't necessarily install your dependencies in the right place.

If you look in the console for your build you should see a line like this:

docker run -t -d -u 500:500 -w /var/lib/jenkins/workspace/ev-team_***_master-D5DTMAWQCFAZ7O7BLEJB3CZGNIHTH72HCI7AEOKAAA7A4XQN3COQ -v /var/lib/jenkins/workspace/ev-***_master-D5DTMAWQCFAZ7O7BLEJB3CZGNIHTH72HCI7AEOKAAA7A4XQN3COQ:/var/lib/jenkins/workspace/ev-team_**_master-D5DTMAWQCFAZ7O7BLEJB3CZGNIHTH72HCI7AEOKAAA7A4XQN3COQ:rw,z -v /var/lib/jenkins/workspace/ev-team_**_master-D5DTMAWQCFAZ7O7BLEJB3CZGNIHTH72HCI7AEOKAAA7A4XQN3COQ@tmp:/var/lib/jenkins/workspace/ev-team_**_master-D5DTMAWQCFAZ7O7BLEJB3CZGNIHTH72HCI7AEOKAAA7A4XQN3COQ@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** 53c72bed1642cf1703ce0385a7b622121709b9af cat

Note the the -w and -v flags. Jenkins mounts into those directories which is different than the WRKDIR that you specify in your Dockerfile above.

I haven't yet found a great solution to this except installing dependencies globally but that also isn't great. If others have fixed this in other ways I'd love to know.

like image 124
dankez Avatar answered Oct 18 '22 19:10

dankez


During docker build Jenkins executes npm install instruction from Dockerfile.

But, as dkez correctly said, Jenkins mounts his workspace to image, so npm test executed in /var/lib/jenkins/workspace/job_name and leads to missing mode_module folder error.

You may specify folder where npm command will be executed, so just point it to your workdir:

    pipeline {
        agent { dockerfile true }
        stages {
            stage('Test') {
                steps {
                    sh 'ls -l'
                    sh 'npm test --prefix app'
                }
            }
        }
    }
like image 1
Veres Avatar answered Oct 18 '22 20:10

Veres