结合代理 none 切换阶段时保持工作空间

Keep workspace when switching stages in combination with agent none

我有一个 Jenkins 管道,我想首先在其中构建我的项目(阶段 A)并使用构建的工件触发一个异步的长 运行ning 外部测试过程。然后外部测试进程使用回调恢复作业。之后(阶段 B)对测试结果进行一些验证并将其附加到作业中。我不想在外部测试过程 运行ning 时阻止执行程序,所以我想出了以下 Jenkinsfile,它主要满足我的需求:

#!/usr/bin/env groovy

pipeline {
    agent none
  
    stages {
        stage('Stage A') {
            agent { docker { image 'my-maven:0.0.17' } }
            steps {
                script {
                    sh "rm testfile.txt"                   
                    sh "echo ABCD > testfile.txt"
                    sh "cat testfile.txt"
                }
            }
        }
        stage('ContinueJob') {
            agent none
            input { message "The job will continue once the asynchronous operation has finished" }
            steps { echo "Job has been continued" }
        }
        stage('Stage B') {
            agent { docker { image 'my-maven:0.0.17' } }
            steps {
                script {
                    sh "cat testfile.txt"
                    def data = readFile(file: 'testfile.txt')
                    if (!data.contains("ABCD")) {
                        error("ABCD not found in testfile.txt")
                    }
                }
            }
        }
    }
}

但是,根据 Jenkins 的负载或经过的时间或一些未知的其他条件,有时我在“阶段 A”中创建的文件在“阶段 B”中不再可用。似乎 Jenkins 切换到另一个 Docker 节点导致工作区数据丢失,例如在日志中我可以看到:

[Pipeline] { (Stage A)
[Pipeline] node
Running on Docker3 in /var/opt/jenkins/workspace/TestJob
.....
[Pipeline] stage
[Pipeline] { (Stage B)
[Pipeline] node
Running on Docker2 in /var/opt/jenkins/workspace/TestJob

虽然成功 运行,但它会继续使用例如两个阶段的节点“Docker2”。

请注意,我也在两个 docker 部分中尝试了 reuseNode true,但这也没有帮助。

如何让 Jenkins 保持我的工作区文件可用?

正如 @Patrice M. 的评论所指出的,如果文件不是那么大(我就是这种情况)stash/unstash 对解决这个问题非常有用.我现在已经使用这个组合几个月了,它解决了我的问题。