在我的管道中,我有 2 个阶段,它们都调用不同的 shell 脚本(它们的调用方式是一些自定义代码,因为我们有不同的管道相互交互):
stage('first') {
steps {
script {
stageErrors.add(launchPortalStep.launchStepWithVerification('shell',"chmod +x ./script1.sh && ./script1.sh"))
}
}
}
stage('second') {
steps {
script {
stageErrors.add(launchPortalStep.launchStepWithVerification('shell',"chmod +x ./script2.sh && ./script2.sh"))
}
}
}
问题是,在script2 中,我需要使用在 script1 中设置的变量,我认为唯一可行的方法意味着几乎重写所有内容,这是不可能的。
Script1 必须返回 0 或 1,因此无法在环境变量中返回值和股票,然后在 script2 中作为参数传递。 脚本也太长了,无法使用sh命令将它们完全放在管道中(这将添加至少700行)。
我能做什么?
您应该使用属性文件(甚至可以是临时文件)在阶段之间传递所需的变量。
您应该将所需的变量写入shell
脚本中的属性文件(VAR=VAL
格式),该脚本在步骤 (sh 'echo "MY_ENV_VAR=test_var" > test.prop'
中调用First
)。
您应该使用readProperties
函数读取Second
步骤中的属性文件,该函数是Pipeline Utility Steps
插件def props = readProperties file: 'test.pro
的一部分)。然后将所需的变量设置为环境变量 (env.MY_ENV_VAR = props.MY_ENV_VAR
),以便您可以将第二个 shell 脚本中的变量用作环境变量 (sh 'echo MY_ENV_VAR = ${MY_ENV_VAR}'
)。
完整的示例代码:
pipeline {
agent { label 'MISC' }
stages{
stage('First'){
steps {
sh 'echo "MY_ENV_VAR=test_var" > test.prop'
}
}
stage('Second'){
steps {
script {
// readProperties is a step in Pipeline Utility Steps plugin
def props = readProperties file: 'test.prop'
// Assuming the key name is MY_ENV_VAR in properties file.
env.MY_ENV_VAR = props.MY_ENV_VAR
sh 'echo MY_ENV_VAR = ${MY_ENV_VAR}'
}
}
}
}
}
输出:
[Pipeline] stage
[Pipeline] { (First)
[Pipeline] sh
+ echo MY_ENV_VAR=test_var
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Second)
[Pipeline] script
[Pipeline] {
[Pipeline] readProperties
[Pipeline] sh
+ echo MY_ENV_VAR = test_var
MY_ENV_VAR = test_var
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage