当前位置: 首页 > 面试题库 >

在Jenkins管道中的Shell executor内更改Groovy变量

吕学
2023-03-14
问题内容

我有一个Jenkins管道作业,我将一些构建变量作为输入,如果用户未传递变量,我将执行脚本并获取这些变量的值。稍后,我必须使用这些变量的值来触发其他作业。

所以我的代码看起来像这样:

node {
withCredentials([[$class: 'StringBinding', credentialsId: 'DOCKER_HOST', variable: 'DOCKER_HOST']]) {

env.T_RELEASE_VERSION = T_RELEASE_VERSION
env.C_RELEASE_VERSION = C_RELEASE_VERSION
env.N_RELEASE_VERSION = N_RELEASE_VERSION
env.F_RELEASE_VERSION = F_RELEASE_VERSION

....

stage concurrency: 1, name: 'consul-get-version'
sh '''
        if [ -z ${T_RELEASE_VERSION} ]
        then
            export T_RELEASE_VERSION=$(ruby common/consul/services_prod_version.rb prod_t_release_version)
            aws ecr get-login --region us-east-1
            aws ecr list-images --repository-name t-server | grep ${T_RELEASE_VERSION}
        else
            aws ecr get-login --region us-east-1
            aws ecr list-images --repository-name t-server | grep ${T_RELEASE_VERSION}
        fi

.......


    't-integ-pipeline' : {
build job: 't-integ-pipeline', parameters: [[$class: 'StringParameterValue', name: 'RELEASE_VERSION', value: T_RELEASE_VERSION],
                                           [$class: 'BooleanParameterValue', name: 'FASTFORWARD_TO_DEPLOY', value: true]]
},

......

问题是当我用空T_RELEASE_VERSION触发主作业时,子构建作业t-integ-pipeline用RELEASE_VERSION参数的空值触发。

如何更改shell执行器中的groovy参数,然后使用修改后的值在groovy执行器中再次访问它?


问题答案:

使用env-inject时,可以将值存储在属性文件中,并将它们作为环境变量注入。在管道中找不到任何简便的方法。

无论如何,这是一个解决方案,将值存储到文件中,然后从管道中读取文件。然后使用eval或类似方法将其转换为可分析的对象(哈希)。

Eval.me示例:将groovy映射序列化为带引号的字符串

写入/读取到文件示例:https :
//wilsonmar.github.io/jenkins2-pipeline/

编辑Manish解决方案以提高可读性:

sh 'ruby common/consul/services_prod_version.rb prod_n_release_version > status' 
N_RELEASE_VERSION_NEW = readFile('status').trim() 
sh 'ruby common/consul/services_prod_version.rb prod_q_release_version > status' 
Q_RELEASE_VERSION_NEW = readFile('status').trim()


 类似资料:
  • 问题内容: 使用Jenkins 2.x中 的Pipeline插件,如何从一个步骤中访问在阶段或节点级别某个位置定义的Groovy变量? 简单的例子: 在Jenkins输出页面上给出以下内容: 可以看到,在该步骤中将打印一个空字符串。 解决方法是通过以下方式在环境范围内定义变量 并通过打印 但是,这种滥用会破坏此任务的环境范围。 问题答案: 要使用可模板化的字符串(将变量替换为字符串),请使用双引号

  • 我目前正在尝试从jenkins管道中的文件加载一个自定义groovy类。我尝试了这里提出的解决方案: 如何在Jenkins管道中导入类文件? 作为... JenkinsPipelineUtilityClass.groovy 詹金斯档案 并尝试同样使用GroovyClassLoader(再次使用上述类) 詹金斯档案 我在这两方面都遇到了同样的错误: 我已经检查了正在进行的脚本批准,里面什么都没有,我

  • 我正在构建一个jenkins管道,作业可以由远程触发。我需要知道哪个IP触发了作业。所以我有一个小Groovy脚本,它返回远程IP。使用EnvInject-plugin,我可以轻松地在正常的自由式作业中使用这个变量,但是我如何在管道中使用它?我不能将EnvInject-plugin与管道插件一起使用:( 这是获取IP的小脚本:

  • 我正在尝试在我的Jenkins管道中使用groovy-postbuild-plugin,我可以让它显示纯文本,但我不能使用它的参数。 所以这是有效的: 但是这个没有: 这是我得到的错误:

  • 我对Jenkins pipeline非常陌生,我正在Groovy中构建一个小型共享库<在这种情况下,我试图提出一些单元测试,然后我必须模拟管道对象。 基本上,我有一个Groovy类,其中包含一个方法,该方法使用凭据执行一些操作: 因此,当谈到这个方法的单元测试时,我创建了一个PipelineMock Groovy类来(尝试)用凭据和用户名密码模拟

  • 问题内容: 是否有任何环境变量可用于获取Jenkins管道标题? 我知道我们可以使用它来获得自由职业的头衔,但是有什么可以用来获取管道名称的东西吗? 问题答案: 您可以使用相同的名称(例如或)从groovy访问相同的环境变量。 从文档中: 可以从Groovy代码中以env.VARNAME或仅以VARNAME的形式访问环境变量。您也可以写入这些属性(仅使用env。前缀): 这些定义也将在构建期间或构