覆盖默认Jenkins管道节点块

时间:2018-04-12 18:12:48

标签: jenkins groovy kubernetes jenkins-plugins jenkins-pipeline

我的公司有一个小型管道库,我们为每个构建隐式加载。有没有办法透明地重载每个构建的node {块?

我的具体情况是我使用kubernetes插件配置kubernetes slave,我想提供一个默认的YAML模板,同时允许用户选择另一个模板或覆盖特定值。例如:

node {
  // Gets you a Pod with a DinD engine with a low CPU/Mem request/limit
}

可选择按名称覆盖:

node('2-core') {
  // Gets you a Pod with a DinD engine with 2 CPU/ more Mem request/limit
}

或用模板覆盖:

import com.foo.utils.PodTemplates

slaveTemplates = new PodTemplates()

slaveTemplates.bigPod {
  node {
    // Big node
  }
}

或者:

def label = "mypod-${UUID.randomUUID().toString()}"
podTemplate(label: label, yaml: """
apiVersion: v1
kind: Pod
metadata:
  labels:
    some-label: some-label-value
spec:
  containers:
  - name: redis
    image: redis
"""
) {
  node (label) {
    // Same small pod as before PLUS a redis container
  }
}

这看起来最棘手,因为您希望父级的值覆盖子级的值。

1 个答案:

答案 0 :(得分:1)

你可以这样做,但是,在我看来,这会导致混乱的行为和可能的奇怪错误案例。

例如:

echo.groovy

def call(String string) {
  steps.echo "Calling step echo: $string"
}

Jenkinsfile

echo 'hello'

输出:

Calling step echo: hello
  • 有一个blog post here可以更深入地展示这一点
  • 某些管道限制工具的付费支持由CloudBees提供,可能会解决您的使用案例

实现这一目标的最重要方法当然是编写一个插件。