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

Jenkins Restrict Where This Project Can Run From Properties File

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

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

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

如何使用此 env 变量来限制作业的位置 运行。我试过将 "Restrict where this project can be run" 设置为 ${MACHINE_TO_RUN},但没有成功。

有人有这方面的经验吗?


更新:以下是我的实现方式。

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

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

该插件可以让您编写一个 groovy 脚本,让您 return 将作业 运行.

return MACHINE_TO_RUN;

我尝试使用环境变量参数化 "Restrict where this project can be run" 中的标签表达式,但没有成功。

我想推荐你:

  • 在上游作业的常规构建步骤之后,创建另一个构建步骤 "Process Job DSLs"
  • 使用 groovy 脚本创建下游作业,通过这样做,您可以在该 groovy 脚本中设置 "Restrict where this project can be run"。

您可以查看 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
}

早上刚刚实现了与 NodeLabel Parameter Plugin 非常相似的东西。因此,您 "parametrize" 具有 "Label" 类型的额外参数的下游作业(仅在安装上述插件后可用)并从您拥有的任何来源为该参数提供值(test.properties 文件在你的情况下)。

此外,您不必再为下游作业处理 "Restrict where this project can be run" 设置。

例如,假设您在 Jenkins 中有两个作业 "BUILD" 和 "TEST",具有以下定义(使用类似 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 }
     }
  }

这几乎是您获得所需行为所需要的。

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

因此,就我而言,我使用了一个多作业项目来调用一个自由式项目。多作业项目非常好,因为它们可以并行 运行 个子项目。确保您只需从 multijob 传递节点名称参数,它会自动确保子项目在给定节点中执行。标签也是有效的节点名称参数。

在这种情况下,我不必搞乱 groovy