bash - Jenkinsfile groovy,设置仅评估一次的全局变量,并从第一个 var 创建另一个变量
问题描述
我有这个代码:
#!groovy
pipeline {
agent any
environment {
def SUPER_VAR = sh(returnStdout: true, script: """openssl rand -base64 12""").trim()
SUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
SUPER_DUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
}
stages {
stage("initialise") {
steps {
script {
sh "echo SUPER_VAR \${SUB_VAR}"
sh "echo SUPER_VALUE \${SUPER_VALUE}"
sh "echo SUPER_DUPER_VALUE \${SUPER_DUPER_VALUE}"
sh "env"
}
}
}
}
}
我想要的输出是,每次我调用/创建一个新变量时,值都是相同的:
[Pipeline] { (initialise)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ echo SUPER_VAR
SUPER_VAR
[Pipeline] sh
+ echo SUPER_VALUE FSDYe8VNL3VTvASj
SUPER_VALUE FSDYe8VNL3VTvASj
[Pipeline] sh
+ echo SUPER_DUPER_VALUE FSDYe8VNL3VTvASj
SUPER_DUPER_VALUE FSDYe8VNL3VTvASj
[Pipeline] sh
詹金斯发生的事情是这样的:
[Pipeline] { (initialise)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ echo SUPER_VAR
SUPER_VAR
[Pipeline] sh
+ echo SUPER_VALUE FSDYe8VNL3VTvASj
SUPER_VALUE FSDYe8VNL3VTvASj
[Pipeline] sh
+ echo SUPER_DUPER_VALUE NSmVwW9xz6IPG5AO
SUPER_DUPER_VALUE NSmVwW9xz6IPG5AO
[Pipeline] sh
每次我创建一个var
基于SUPER_VAR
它的脚本似乎再次运行,我得到不同的输出。
如何将脚本的输出注册到全局变量中,以便以后可以用于全局创建新变量?
解决方案
这就是我使用的解决方案,我必须在每个阶段定义变量,它看起来很脏,但它有效。
这样,初始值SUPER_VAR
只会被评估一次,随后我们可以使用这些 var 的子元素。
我的用例,我不想使用更多的 jenkins 插件来获取 aws sts 假设。
SUPER_VAR
调用 sts 假设并返回凭据,我针对它运行 jq,并获取一个在SUPER_VAR
.
在每个阶段,我都运行 jq 来提取 aws 的凭据,以便 sts 假设工作。
#!groovy
pipeline {
agent any
environment {
def SUPER_VAR = sh(returnStdout: true, script: """openssl rand -base64 12""").trim()
}
stages {
stage("initialise") {
environment {
SUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
SUPER_DUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
}
steps {
script {
sh "echo SUPER_VAR \${SUB_VAR}"
sh "echo SUPER_VALUE \${SUPER_VALUE}"
sh "echo SUPER_DUPER_VALUE \${SUPER_DUPER_VALUE}"
sh "env"
}
}
}
stage("go again") {
environment {
SUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
SUPER_DUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
}
steps {
script {
sh "echo SUPER_VAR \${SUB_VAR}"
sh "echo SUPER_VALUE \${SUPER_VALUE}"
sh "echo SUPER_DUPER_VALUE \${SUPER_DUPER_VALUE}"
sh "env"
}
}
}
}
}
推荐阅读
- python - 比较列表Python的最有效方法
- python - 如何使用绘图自动设置轴?sns.kdeplot
- javascript - HTML/JS 转录文本效果
- dataset - 导入 Power BI 时表值函数参数的问题
- html - 坏:与类全左
- python - 在不打开文件的情况下更改PowerPoint中的所有字体
- python - Twilio 不会发送包含照片的 vCard
- spring - Spring Boot Kotlin 找不到存储库 Bean
- javascript - 可以根据视口大小加载 Google 发布商标签库吗?
- android - 在应用程序小部件中第二次设置 imageViewResource 隐藏了我的 listView