Jenkins 管道:使用在 shell 1 中创建的变量,在 shell 2 中创建的变量



在我的管道中,我有 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

最新更新