与代理none组合切换阶段时保留工作区



我有一个Jenkins管道,我想首先在那里构建我的项目(阶段a(,并用构建的工件触发异步长时间运行的外部测试过程。然后,外部测试进程使用回调恢复作业。然后(阶段B(对测试结果进行一些验证,并将它们附加到作业中。我不想在外部测试过程运行时阻止执行器,所以我想出了以下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

而在成功运行的情况下,它继续使用例如node";Docker2";对于两个阶段。

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

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

正如@Patrice M.的评论所指出的,如果文件没有那么大(对我来说就是这样(,stash/unstash对解决这个问题非常有用。几个月以来,我一直使用这种组合,它解决了我的问题。

最新更新