Jenkins 并行阶段 - enoent ENOENT:没有这样的文件或目录
Posted
技术标签:
【中文标题】Jenkins 并行阶段 - enoent ENOENT:没有这样的文件或目录【英文标题】:Jenkins parallel stages - enoent ENOENT: no such file or directory 【发布时间】:2021-09-18 05:33:14 【问题描述】:我在 Jenkins 中跨不同代理/节点并行运行某些阶段时遇到问题。我正在使用以下代码从可用代理列表中动态创建阶段:
// 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
,在有问题的代理上 - 这可能相关吗?我在first-non-parallel-stage
中没有问题,只是在那个代理的并行块中。 first-non-parallel-stage
完成后,我不应该能够在并行块中重用 agent1 吗?
当我使用重复的详细并行块时,我没有遇到这个问题,也就是说,我没有创建一个用 stage
块填充集合的函数,而是手动将它们写出来,如下所示:
parallel
stage ...stage_code
stage ...stage_code
stage ...stage_code
但显然这很冗长,不利于轻松添加更多节点。
为什么会发生这种情况?
【问题讨论】:
当您在调用npm install
之前已经拥有package-lock.json
时,往往会发生此错误,agent1
就是这种情况。尝试先删除并行代码块中或非并行阶段之后的package-lock.json
(如果存在)。
在每个阶段开始时做一个deleteDir()
会不会有点矫枉过正?或者,如果我运行`sh "rm package-lock.json"`,代理是否已经在文件树中的正确位置找到它?
这两个选项都应该做的工作
不幸的是,没有人提供帮助。我试过删除 package-lock.json,在每个阶段之前或之后都试过 deleteDir()
,我试过 cleanWs()
...似乎没有任何效果。现在更糟糕的是,问题发生在 更多 个节点上,而不仅仅是一个节点。我不确定我做错了什么
【参考方案1】:
错误发生在npm
端,因为它无法找到文件。添加npm init
创建package.json
文件或删除package-lock.json
文件之后可能是一个好主意非并行阶段执行已完成,因此当您进入并行块时,一切都是干净的。 有关此的更多详细信息,请访问此处:*** Answer
【讨论】:
不幸的是,这无济于事...我不想运行npm init
...我应该已经 be 在我从中提取的 npm 包项目中我的单片机,我不应该初始化一个。正如我在其他 cmets 中提到的,删除 package-lock.json 也不起作用。我不确定为什么会发生这种情况,而且前后不一致。【参考方案2】:
感谢 Noam Hemler 和 Altaf 的 cmets,我才明白这一点。
关键问题是 npm 确实找不到我的项目。一些 cmets 遗漏的是工作区应该在运行作业之前或之后清理,但在尝试运行任何 npm 命令之前,还必须重新检查 git repo scm。我创建了这个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
函数,所以当一个阶段开始时,它总是清理空间,提取代码的新副本,然后从那里开始。似乎一直在工作。
【讨论】:
以上是关于Jenkins 并行阶段 - enoent ENOENT:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章