在Jenkins Pipeline中添加新参数(声明性Pipeline)时如何不破坏流程

114次阅读
没有评论

问题描述

在Jenkins Pipeline中,每当我添加一个新参数时,下一个任务将无法正确获取此参数。特别是当这些参数对于某些流程(例如确定代理)是必需的时,这将是一个问题。这个问题进一步令人沮丧,因为在一个已经存在的任务中,当默认参数改变时,新任务仍然会使用旧参数;但是在创建新任务时将不会有任何参数。

为了解决首次运行任务时的参数问题,以及解决已运行的任务参数的更改,我们需要一个解决方案。目前,我有一个解决方法,我会在答案中介绍,但我想知道是否有更好的解决方法。

解决方案

以下解决方案基于已知的问题和用户回答,可能会因Jenkins版本差异而有所不同。请在进行操作前确保已备份重要数据。

方案1:在声明性Pipeline中处理新参数

这个解决方案适用于声明性Pipeline,并提供了一种在Pipeline运行前检查和设置参数的方法。首先,在进入pipeline{}部分之前,我们需要在文件开头添加一些代码。这些代码将在Pipeline部分运行之前执行,将检查环境变量/参数是否存在,如果存在则使用该值,否则将为其分配一个默认值,并将其赋值给一个我们在Pipeline中可以访问的变量。然后,我们需要将Pipeline代码中的参数引用更改为变量引用。

以下是一个示例,其中定义了一个任意的参数和一个用于使用的代理标签。正如你所看到的,这些变量可以在各个阶段以及确定代理等过程中使用。

def MY_VARIABLE = nullif (env.my_parameter) {  
  MY_VARIABLE = env.my_parameter
} else {  
  MY_VARIABLE = "my default value"
}
echo "MY VARIABLE IS SET: ${MY_VARIABLE}"

def MY_AGENT = nullif (env.my_agent) {  
  MY_AGENT = env.my_agent
} else {  
  MY_AGENT = "agent_label"
}
echo "MY AGENT IS SET: ${MY_AGENT}"

pipeline {
    parameters {
        string(defaultValue: "my default value", description: 'This is my parameter', name: 'my_parameter') ;
        string(defaultValue: "agent_label", description: 'This is my agent label', name: 'my_agent') ;
    }
    agent {
        label "${MY_AGENT}"
    }
    stages {
        stage('my stage') {
            steps {
                sh 'echo ${MY_VARIABLE}'
            }
        }
    }
}

在上述示例中,我们首先使用nullif函数来检查环境变量my_parameter是否存在,如果存在则将其赋值给MY_VARIABLE,否则将其设置为默认值。同样,我们也检查了代理标签的环境变量my_agent并进行了相应的赋值。然后,在Pipeline部分,我们使用了这些变量来代替原始参数。

方案2:简化变量定义

你还可以使用更简洁的方式来定义这些变量,这将使Pipeline代码更易读。以下是使用params.getOrDefault函数来实现的示例:

def MY_VARIABLE = params.getOrDefault("my_parameter", "my default value")
echo "MY VARIABLE IS SET: ${MY_VARIABLE}"

def MY_AGENT = params.getOrDefault("my_agent", "agent_label")
echo "MY AGENT IS SET: ${MY_AGENT}"

pipeline {
    parameters {
        string(defaultValue: "my default value", description: 'This is my parameter', name: 'my_parameter') ;
        string(defaultValue: "agent_label", description: 'This is my agent label', name: 'my_agent') ;
    }
    agent {
        label "${MY_AGENT}"
    }
    stages {
        stage('my stage') {
            steps {
                sh 'echo ${MY_VARIABLE}'
            }
        }
    }
}

在这个示例中,我们使用params.getOrDefault函数来获取参数的值,如果参数不存在则使用默认值。这样可以减少代码的冗余,并使Pipeline代码更加清晰。

请根据你的实际情况选择适合你的解决方案,以确保新参数的正确设置和使用。

总结

通过在声明性Pipeline中使用环境变量/参数的检查和赋值,以及将参数引用更改为变量引用,我们可以解决在添加新参数时不破坏Jenkins Pipeline的问题。此外,我们还可以使用params.getOrDefault函数来简化变量的定义,使代码更加易读。

请注意,这些解决方案可能因Jenkins版本差异而有所不同,因此在实际操作中请进行适当的调整和测试。

正文完