Jenkins 如何参数化文件作业

Jenkins 如何参数化文件作业,jenkins,jenkins-pipeline,jenkins-declarative-pipeline,Jenkins,Jenkins Pipeline,Jenkins Declarative Pipeline,我有Jenkins Pipeline作业,作业之间的唯一区别是参数,一个“name”值,我甚至可以使用多分支作业名称(尽管它传递的不是作为分支名称的job_name,遗憾的是,没有解析,所有环境看起来都不合适)。如果我能将此设置为Jenkins文件的外部,那就太好了,因为这样我就可以将同一个Jenkins文件重新用于所有不同的作业。将此添加到您的Jenkins文件中: properties([ parameters([ string(name: 'myParam', defaultV

我有Jenkins Pipeline作业,作业之间的唯一区别是参数,一个“name”值,我甚至可以使用多分支作业名称(尽管它传递的不是作为分支名称的job_name,遗憾的是,没有解析,所有环境看起来都不合适)。如果我能将此设置为Jenkins文件的外部,那就太好了,因为这样我就可以将同一个Jenkins文件重新用于所有不同的作业。

将此添加到您的Jenkins文件中:

properties([
  parameters([
    string(name: 'myParam', defaultValue: '')
  ])
])
然后,一旦构建运行一次,您将在作业UI上看到“使用参数构建”按钮

您可以在那里输入所需的参数值


在管道脚本中,您可以使用
params.myParam

引用该脚本。在管道作业配置中,有一个选项将此项目参数化。如果愿意,请写入变量名和默认值。在管道中使用
env.variable\u name

访问此变量基本上您需要创建一个示例名称
mycollib
,并在下面的一个文件中创建一个完整的声明性管道,比如您调用该文件
myfancypepeline.groovy

我想写我的例子,但实际上我明白了,所以我将从那里复制。首先是MyFancypepeline.groovy

def call(int buildNumber) {
  if (buildNumber % 2 == 0) {
    pipeline {
      agent any
      stages {
        stage('Even Stage') {
          steps {
            echo "The build number is even"
          }
        }
      }
    }
  } else {
    pipeline {
      agent any
      stages {
        stage('Odd Stage') {
          steps {
            echo "The build number is odd"
          }
        }
      }
    }
  }
}
然后是使用它的Ajenkins文件(现在有2行)

显然,这里的参数是int类型的,但它可以是任意数量的任意类型的参数


我使用这种方法,有一个groovy脚本,它有3个参数(2个字符串和一个int),有15-20个Jenkins文件,它们通过共享库使用该脚本,非常完美。动机当然是任何编程中最基本的规则之一(不是引用,而是这样):如果你在两个不同的地方有“相同的代码”,那么有些地方是不对的。

我也对这个问题的解决方案感兴趣。如果使用普通管道或blueocean(声明性)管道,这是一个主要问题。我已经公开了这个问题-“
项目参数有什么问题吗?@svmadhavaredy你在说什么?有一个
管道参数
,但我看不到在Jenkins文件本身之外设置这些参数的方法,可能有,但我找不到。您可以将
作业名称
配置为
项目参数
,并在管道脚本中访问它<代码>节点{echo“作业生成Id:$Build_Id”}
这是一个示例
BUILD\u ID
是一个env变量。分支名称可以以同样的方式作为参数。如果我理解您的问题是正确的。@svmadhavarddy我的作业配置不包含任何称为“项目参数”的内容,而且我使用的是声明性管道,它不使用
节点
,有没有方法在$1之外引用它?您可以通过名称引用它吗?您可以通过以下方式引用它:
${params.myParam}
WorkflowScript:14:从版本0.8开始,属性部分已重命名。请改用选项。@第14行第5列。
该代码在哪里?我只是在管道块中添加了它,所以我找到了声明性管道的实际语法。但是使用它时,配置参数只出现在分支中,我似乎无法为全局作业配置它。这并没有真正的帮助,因为我想按作业配置它,而不是按分支。多分支管道将始终按分支配置构建,因为它引用该分支根中的Jenkins文件。如果希望它位于所有分支中,则需要跨所有分支提升更改,或继承它们。如果我有两个相同的阶段(比如阶段名称),我如何重用该代码?这个共享库是正确的方式吗?这段代码是什么样子的?我想传递一个字符串参数,该参数将是阶段名称。是的,共享库是正确的方法。到目前为止,我遇到了一些限制,但没有任何东西能让我以任何其他方式分发库…嗯,我的意思是你已经可以传递舞台名称了,我想我只是不确定存储。。。在一个变量或其他可以重用的东西中进行阶段转换。e、 g
def myStage={steps{echo{env.STAGE_NAME}}
STAGE('Odd STAGE')myStage
打印“Odd STAGE”可能更清晰,假设您调用了STAGE
Odd
偶数
,而不是复制您想要编写的
echo“构建号是${STAGE}”
您将如何做到这一点,以使两个阶段的代码除了名称之外都是共享的
@Library('myCoolLib') _
evenOrOdd(currentBuild.getNumber())