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

将Jenkins构建参数传递给管道节点

查学文
2023-03-14
问题内容

我创建了一个新的詹金斯管道。(当前)使用单个名为的布尔选项对管道进行参数化VAR_A。我的管道脚本是:

node ('windows') {
    echo "$VAR_A"
    bat 'env'
}

当我手动创建带有VAR_A选中项的项目时,将按预期回显“ true”。但是,环境变量列表未显示VAR_A=true

我能够env显示VAR_A是否将呼叫包装在一个withEnv块中:

node ('windows') {
    echo "$VAR_A"
    withEnv(["VAR_A=$VAR_A"]) {
        bat 'env'
    }
}

我将拥有比这更多的参数,因此不需要单独指定每个参数。 有没有办法将所有构建参数传送到节点的环境?


问题答案:

关键是,在管道脚本中,作业参数不会像常规作业一样自动注入到环境中。每个参数都成为Pipeline脚本绑定的变量。因此,您可以直接按名称访问它们。

在您的示例中,echo "$VAR_A"变量替换是由groovy在脚本的上下文中执行的(请参阅Groovy
doc关于字符串插值的文档
)。这就是为什么您在bat输出中看不到它的原因。

对于要注入的每个参数,您需要env.VAR_A = VAR_A在脚本的开头添加一行:
它可以在代码node块之外,因为env在整个脚本中是全局的。

另外,还有一种方法可以将所有脚本变量(包括参数,甚至管道内置变量)添加steps到环境中。不幸的是,它需要一些白名单才能在沙箱中运行:

@NonCPS
def populateEnv(){ binding.variables.each{k,v -> env."$k" = "$v"} }
populateEnv()

示例: VAR_A 是一个参数。脚本主体:

def AAAA = 1 // such a definition doesn't put variable in the binding
BBBB = 2     // creates a binding variable. Absolutely the same behavior as for a job parameter.

@NonCPS
def populateEnv(){ binding.variables.each{k,v -> env."$k" = "$v"} }
populateEnv() // at this point injection happens

CCCC = 3      // created after the injection hence it won't appear in env.
node ('windows') {
    bat 'env'
}

bat输出中,您将找到VAR_ABBBB

除非您的工作具有数十个参数定义的IMO,否则将env.VAR_A = VAR_A首选方法,因为这种方法更简单,直接并且不需要批准。



 类似资料:
  • 问题内容: 基本上,没有多余的废话,我无法将构建属性传递给Library var调用。 jenkinsfile相关的块: 导致错误 java.lang.NullPointerException:无法在空对象上获取属性’GitCheckout’ 但是,这可行: 共享库中vars / tc_test.groovy的内容: 我对groovy不太满意,所以这可能很明显。 问题答案: 得到了詹金斯JIRA

  • 我正在尝试从使用自由式詹金斯构建切换到管道项目。 我喜欢它的许多方面,但我希望我可以使用多分支管道,因为它更适合我们公司,但目前这不是一个选择。 我们目前所做的是创建一个名为

  • 问题内容: 我在jenkins 2.x上并使用管道。 我已经配置了要使用param构建的作业,并具有一个字符串param: 我也从github(脚本的管道)获得Jenkinsfile: 现在在我的Jenkinsfile中,我正在使用param:$ {githubUrl}并抛出错误: stdout:stderr:致命:’$ {githubUrl}’似乎不是git存储库 因此,如果直接编写管道脚本,则

  • 问题内容: 我有一个名为 buildall 的管道作业,如下所示: 该 buildall 作业有25个参数。我想将所有 buildall 的参数传递给 job1 。有没有一种简单的方法可以代替手动指定每个参数呢? 在此问题中:向下游作业传递管道参数是一个子问题,但从未得到回答: 甚至更好的是,有没有一种麻烦的方法可以将所有管道参数传递给下游作业。 我有同样的问题。 问题答案: 以下似乎有效(尽管我

  • 问题内容: 我正在使用具有集成交付管道功能(https://jenkins.io/solutions/pipeline/)的Jenkins v2.1 来编排两个现有构建(构建和部署)。 在我的参数化构建中,我有3个用户参数设置,也需要在管道中选择该参数。 管道脚本如下: 除以外,此方法均正常运行。当我构建管道时,会引发以下错误: 如何解决此类型转换错误?甚至更好的是,有没有一种麻烦的方式可以将所有

  • 问题内容: 我正在使用testNG,Selenium和Jenkins建立测试自动化框架。该代码工作正常,它读取一个或多个csv文件并将其用作测试数据。我从詹金斯进行测试。 如您所见,浏览器,URL和CSV文件是硬编码的。我希望能够将这些作为参数传递。做这个的最好方式是什么?是否可以让他们通过詹金斯? 我正在考虑构建一个仪表板,在其中可以指定要使用哪种浏览器运行哪些测试(csv文件)。 这是我正在运