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:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins分布式与并行

Jenkins pipeline 并行执行任务流

Jenkins MultiJob 插件不聚合下游测试结果

持续集成使用Jenkins实现多平台并行集成

Jenkins 在声明式 pipeline 中并行执行任务

Jenkins分布式构建与并行构建