结合代理 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
对解决这个问题非常有用.我现在已经使用这个组合几个月了,它解决了我的问题。
我有一个 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
对解决这个问题非常有用.我现在已经使用这个组合几个月了,它解决了我的问题。