Jenkins限制此项目可以从属性文件运行的位置

时间:2017-04-05 23:44:36

标签: file jenkins build properties restrict

我想使用从上游作业传入的参数来限制下游Jenkins作业在特定计算机上运行。上游作业创建一个属性文件,其中一个属性指示应运行的机器(test.properties中的MACHINE_TO_RUN = linux123)。

使用Post-build Action将包含所有属性的文件传递到我的下游作业:在其他项目上触发参数化构建。在这里,我从属性文件中指定参数:$ WORKSPACE / test.properties

我已经验证下游作业确实接收并处理了该文件。 MACHINE_TO_RUN = linux123列在我的环境变量中。

如何使用此env变量来限制作业的运行位置。我已经尝试将“限制此项目可以运行的位置”设置为$ {MACHINE_TO_RUN},但没有运气。

任何人都有这方面的经验吗?

更新:以下是我实现此目的的方法。

下载https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Label+Assignment+plugin

构建参数与此插件绑定。因此,如果您将云ID或节点传递给作业,例如MACHINE_TO_RUN。

该插件可让您编写一个groovy脚本,让您返回要运行作业的位置。

返回MACHINE_TO_RUN;

3 个答案:

答案 0 :(得分:0)

我尝试使用环境变量参数化“限制可以运行此项目的位置”中的标签表达式但是没有成功。

我想推荐你:

  • 在上游作业的常规构建步骤之后,创建另一个构建步骤以“处理作业DSL”
  • 使用groovy脚本创建下游作业,通过这样做,您可以在该groovy脚本中设置“限制此项目可以运行的位置”。

您可以查看Jenkins DSL Doc并尝试编写一个groovy脚本来创建下游作业

吸吮一个groovy脚本看起来像:

// You have to have MACHINE_TO_RUN as your environment variable in your upstream job
def machine_to_run=${MACHINE_TO_RUN} 
job(your_downstream_job_name) {
    label(machine_to_run)
    parameters {
        //The parameter setting of your downstream job
    }
    steps {
        //The build step of your downstream job 
    }
    //Other settings of your downstream job
}

答案 1 :(得分:0)

早上用NodeLabel Parameter Plugin实现了非常相似的东西。所以,你"参数化"带有额外参数"标签"的下游作业type(仅在安装上面提到的插件后才可用)并从您拥有的任何源提供此参数的值(在您的情况下为test.properties文件)。

此外,您无需处理"限制此项目可以运行的位置"为下游工作设置。

例如,假设你有两份工作" BUILD"和" TEST"在Jenkins中使用以下定义(使用类似Groovy的伪代码):

[TEST]
  parameters: { targetNode: typeof(Label), defaultValue: '' }

[BUILD]
  parameters: {}

  set-env-variables: { from: './test.properties' } // or your way to set env vars

  trace-env-variable: { variable: $MACHINE_TO_RUN } // linux123

  post-build: {
     trigger: {
       job: "TEST", parameters: { targetNode: $MACHINE_TO_RUN }
     }
  }

这几乎是你获得理想行为所需要的。

答案 2 :(得分:-1)

我遇到了同样的问题,并设法用NodeLabel Parameter Plugin解决了这个问题。

所以,就我而言,我正在使用multjob项目来调用自由风格的项目。多工作项目非常好,因为它们可以并行运行子项目。确保您只需从多工具传递node-name参数,它会自动注意子项目在给定节点中执行。标签也是有效的节点名称参数。

在这种情况下,我没有弄乱groovy