我有以下管道(内容简化,但结构是准确的):
pipeline {
agent any
environment {
my_var = ""
}
stages {
stage('Stage_parallel'){
parallel{
stage('Stage_1') {
steps {
...
}
}
stage('Stage_2'){
steps {
withCredentials([usernamePassword(<LOGIN>, <PASS>)])
{
sh'''
...
var_1 = "/path/to/folder"
var_2 = "file_name"
my_var = "${var_1}/${var_2}"
echo ${my_var} ### returns correct value
'''
}}}}}
stage('Stage_3'){
steps {
sh 'echo ${my_var}' ### returns ""
}}}}
所以我尝试声明全局变量,在Stage_2
中更新它并在Stage_3
中使用。但是,它只在Stage_2
sh
块中返回正确的值,而不在外部。我也试着
- 在
pipeline
块外部定义变量,如def my_var
- 在
Stage_2
中定义为env.my_var = "${var_1}/${var_2}"
,在Stage_3
中使用为${env.my_var}
但是没有一种方法可以从Stage_2
.获得my_var
值。那么我应该如何修复管道?
2条答案
按热度按时间disho6za1#
从概念上讲,Jenkins将环境变量“通过值”传递给脚本,而不是“通过引用”。如果你想在
sh
步骤之间持久化任何状态(在同一阶段或不同阶段中无关紧要),你有两个选择:1.将状态信息传递回Jenkins(序列化为stdout并在Jenkins中捕获它),但牺牲了声明的纯粹性
1.将其保存在工作区的某个文件中,一般来说,这不是一个好主意,但在非常简单的情况下可以接受
选你的毒药
kiz8lqtg2#
在您的代码中,您在环境中定义了“my_var”,但在如图所示的步骤2中,您创建了一个局部变量my_var,env.my_var和my_var之间存在差异。
要访问您的环境my_var,您需要通过以下方式在阶段中访问它: