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
一些可能相关的细节,但我不确定:
在运行并行阶段之前,你可以看到我运行一个first-non-parallel-stage
,在代理上problems - 这可能是相关的吗?我在 first-non-parallel-stage
中没有问题,只是在该代理的并行块中。 first-non-parallel-stage
完成后,我不能在我的并行块中重用 agent1 吗?
当我使用重复的冗长并行块时,我没有遇到这个问题,即我没有创建一个用 stage
块填充集合的函数,而是手写它们,像这样:
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,提取代码的新副本,并从那里开始。似乎一直在工作。
我在 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
一些可能相关的细节,但我不确定:
在运行并行阶段之前,你可以看到我运行一个
first-non-parallel-stage
,在代理上problems - 这可能是相关的吗?我在first-non-parallel-stage
中没有问题,只是在该代理的并行块中。first-non-parallel-stage
完成后,我不能在我的并行块中重用 agent1 吗?当我使用重复的冗长并行块时,我没有遇到这个问题,即我没有创建一个用
stage
块填充集合的函数,而是手写它们,像这样:
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,提取代码的新副本,并从那里开始。似乎一直在工作。