node_modules不存在于Jenkins构建映像中

时间:2018-03-13 11:59:01

标签: docker jenkins

我从Dockerfile运行Jenkins,并使用本地docker.sock成功地与Bitbucket云集成。我使用Blue Ocean设置了一个新的管道,它下载了repo并从Dockerfile构建了一个简单的nodejs应用程序。

我的文件如下:

节点应用

  

    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'
                }
            }
        }
    }

但是,当我执行npm test步骤时,它抱怨它无法找到node_modules。如果我从Jenkins文件npm install运行sh 'npm install',则该步骤可以正常工作。

也许我错过了一些东西,但看起来jenkins没有运行构建映像中的步骤,这意味着我必须在应用程序npm install中复制Dockerfile和其他可能的命令Jenkinsfile

有没有办法在最初构建的映像中运行测试,还是必须将构建步骤从Dockerfile复制到Jenkinsfile

2 个答案:

答案 0 :(得分:1)

Jenkins将项目安装在其自己的目录中。如果您使用dockerfile参数,则不一定将您的依赖项安装在正确的位置。

如果您在控制台中查找自己的版本,应该会看到如下一行:

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

请注意-w-v标志。 Jenkins会安装到与您在上面的Dockerfile中指定的WRKDIR不同的目录中。

除了在全局安装依赖项之外,我还没有找到一个很好的解决方案,但这也不是很好。如果其他人以其他方式解决了这个问题,我很想知道。

答案 1 :(得分:0)

在docker构建期间,Jenkins从Dockerfile执行npm install指令。

但是,正如dkez所说的那样,詹金斯将工作区安装到映像上,因此npm test/var/lib/jenkins/workspace/job_name中执行并导致丢失mode_module文件夹错误。

您可以指定将执行npm命令的文件夹,因此只需将其指向您的workdir

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