Jenkins 并行阶段 - enoent ENOENT:没有这样的文件或目录

Jenkins parallel stages - enoent ENOENT: no such file or directory

我在 Jenkins 的不同 agents/nodes 中并行处理 运行 某些阶段时遇到问题。我正在使用以下代码从可用代理列表动态创建阶段:

// Create empty collection to store parallel stages:
def parallelStages = [:]

// Define list of agents to be used for cypress parallel stages:
agents = [
    "agent1",
    "agent2", 
    ...
]

// Add as many parallel stages as defined in agents list:
agents.eachWithIndex { label, index ->
    parallelStages["Parallel Stage ${index + 1}"] = {
        stage("Parallel Stage ${index + 1}") { 
            node(label) {
                sh 'npm install --silent'
                sh 'npm start & npx wait-on http://localhost:3000'
                sh "npm run another_command"
            }
        }
    }
}

然后我在并行块中使用这些阶段:

pipeline {
    agent {
        node {
            label 'agent1'
        }
    }
    stages {
        stage('first-non-parallel-stage'){
            steps {
                sh 'npm install --silent'
                sh 'npm run lint'
                sh 'npm run build'
                sh "npm run storybook:build"
                sh 'npm run test -- --watchAll=false'
            }
        }
        stage ('Parallel stuff'){
            steps {
                script {
                    parallel parallelStages
                }
            }
        }
    }
}

这是有效的。但是,对于 agent1 上的阶段,我在 Jenkins 日志中收到以下错误:

+ npx wait-on http://localhost:3000
+ npm start
npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /home/vine/workspace/tend-multibranch_jenkins-testing@3/package.json
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, open '/home/vine/workspace/tend-multibranch_jenkins-testing@3/package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent 

一些可能相关的细节,但我不确定:

parallel {
   stage { ...stage_code }
   stage { ...stage_code }
   stage { ...stage_code }
}

但显然这很冗长并且不利于轻松添加更多节点。

为什么会这样?

错误发生在 npm 端,因为它无法找到 file.May 最好添加 npm init 来创建 package.json文件或在非并行阶段执行完成后删除 package-lock.json 文件,这样当您进入并行块时,一切都是干净的。
有关此的更多详细信息,请参见此处:

感谢 Noam Hemler 和 Altaf 的评论,我明白了。

关键是npm确实找不到我的项目。一些评论中遗漏的是工作 space 应该在 运行 工作之前或之后清理,但是 git repo scm 也必须在尝试之前重新检查运行 任何 npm 命令。我创建了这个 setup 函数:

def setup(){
    // clean workspace and do a fresh checkout
    deleteDir()
    git credentialsId: 'id', url: 'url'
    sh 'git checkout ' + env.Branch_Name
}

现在每个阶段开始时:

// Add as many parallel stages as defined in agents list:
agents.eachWithIndex { label, index ->
    parallelStages["Parallel Stage ${index + 1}"] = {
        stage("Parallel Stage ${index + 1}") { 
            node(label) {
                setup()
                sh 'npm install --silent'
                sh 'npm start & npx wait-on http://localhost:3000'
                sh "npm run another_command"
            }
        }
    }
}

我也在任何其他代理上的任何步骤之前使用 setup 函数,所以当一个阶段开始时,它总是清理 space,提取代码的新副本,并从那里开始。似乎一直在工作。