我能想到的最明显的方法是将值写入脚本中代理的文件中吗?第一阶段,然后在第二阶段阅读它,但这似乎不是一个很好的解决方案。
#1 楼
对于声明性管道:这个问题已经在StackOverflow上得到了高度评价:生成您需要的值):
pipeline {
agent { label 'docker' }
stages {
stage('one') {
steps {
sh 'echo hotness > myfile.txt'
script {
// trim removes leading and trailing whitespace from the string
myVar = readFile('myfile.txt').trim()
}
echo "${myVar}" // prints 'hotness'
}
}
stage('two') {
steps {
echo "${myVar}" // prints 'hotness'
}
}
// this stage is skipped due to the when expression, so nothing is printed
stage('three') {
when {
expression { myVar != 'hotness' }
}
steps {
echo "three: ${myVar}"
}
}
}
}
第二种解决方案是直接或通过
writeFile
从脚本中写出输出,然后再读回在readFile
中。但是,这带来了一个重要的警告,即读取和写入都必须在同一节点上进行,因此您不能使用它在节点之间发送数据。使用archiveArtifact
并使用copyArtifact
检索它们(然后使用readFile
读取文件)。最后,对于StackOverflow上一个几乎相同的问题,有一些答案可以提供替代解决方案。 br /> 但是,如果可以的话,我建议改用脚本化管道,这样可以提供更简单的解决方案:
有关ServerFault上的脚本化管道的问题。)
注释中似乎已经提出了一些解决方案,但是您担心它们不够优雅。我不太确定您要寻找哪种优雅,因为我想不出任何方法来简化Jenkins-Pipeline-land的这些答案。
评论
由于我们使用脚本化而非声明性管道,因此并不是一个完整的答案,但是写入文件正是我最终在脚本中所做的。这个问题已经在这里被回答stackoverflow.com/questions/47155326/…
@RamKamath该问题的答案有些不同。我正在尝试从python脚本获取输出并将其传递到阶段。虽然我认为答案的一部分是创建一个全局环境变量,然后在第一阶段进行设置,然后在第二阶段进行读取,但是它并没有提供一种优雅的方法来在阶段级别从python脚本传递。