2017-06-15 69 views
1

Jenkins声明式管道中的参数可以是动态的吗?Jenkins动态声明式管道参数

我想要一个函数在运行时填充选项选项值。下面的代码确实生成了一个选项列表,但它们似乎过时了 - 可能是在我第一次运行此代码时生成的。如果AMI列表发生变化,则选择保持不变。每当我选择build with parameters时,我都希望它能运行。

def findAMIs() { 
    // Find relevant AMIs based on their name 
    def sout = new StringBuffer(), serr = new StringBuffer() 
    def proc = '/usr/bin/aws --region eu-west-1 ec2 describe-images \ 
       ' --owners OWNER --filter Name=name,Values=PATTERN \ 
       ' --query Images[*].{AMI:Name} --output text'.execute() 
    proc.consumeProcessOutput(sout, serr) 
    proc.waitForOrKill(10000) 
    return sout.tokenize() 
} 

def AMIs = findAMIs().join('\n') 

pipeline { 
    // a declarative pipeline 
    agent any 

    parameters { 
     choice(name: 'Release', 
       choices: AMIs) 
    } 
    ... 
} 

编辑 我结束了使用jenkins-job-builder,具有广泛选择的参数。它不支持在目前的groovyScript参数,所以我修改了它https://review.openstack.org/#q,I0c6ac0b49c24b8d3afbc06b003847de2e043c2b8,n,z

+0

它只是不会立即改变,或者它永远不会改变(在应该更改之后,您运行构建了多少次)?我想我已经看到它在第一次运行时不会生效。 – burnettk

+0

它永不改变。每次使用参数单击构建时,我都会得到完全相同的选项,尽管我知道脚本返回不同的选项(手动运行时)。 – jarondl

+0

每次构建运行时都可以重新定义参数。没有建立,没有重新定义。 –

回答

5

对于用户自定义输入:

def findAMIs() { 
    return UUID.randomUUID().toString().split('-').join('\n') 
} 

node{ 
    def userInput = input(
     id: 'userInput', message: 'input parameters', parameters: [ 
      [ 
       $class: 'ChoiceParameterDefinition', 
       name: 'ami', 
       choices: findAMIs(), 
       description: 'AMI', 
      ], 
     ] 
    ) 

    echo ("Selected AMI :: "+userInput) 
} 
+0

嗨@daggett,感谢您的帮助。这是迄今为止最接近的,但有两个缺点1.它不适用于声明式管道(我会尝试修改它的工作)。 2.用户流程比使用参数页面构建要好得多。 我会试着让它在声明式管道上工作并回来给你 – jarondl

+0

@jarondl - 你是否得到了一个Declarative语法的例子工作?如果是这样,请分享。 –

+0

嗨@EldadAK不,不幸的是我无法得到它的工作。看看编辑我的问题 - 我结束了使用JJB – jarondl

3

对于任何人都需要一个声明管道语法选项,我发现了一个很好的解决方案在another question ,这对我有帮助。

这是我的建议。您应该能够生成的代码更动态的列表创建${WORKSPACE}/list文件

pipeline { 
    agent any 
    stages { 
     stage("Release scope") { 
      steps { 
       script { 
        // Prepare a list and write to file 
        sh "echo \"patch\nminor\nmajor\" > ${WORKSPACE}/list" 

        // Load the list into a variable 
        env.LIST = readFile (file: "${WORKSPACE}/list") 

        // Show the select input 
        env.RELEASE_SCOPE = input message: 'User input required', ok: 'Release!', 
          parameters: [choice(name: 'RELEASE_SCOPE', choices: env.LIST, description: 'What is the release scope?')] 
       } 
       echo "Release scope selected: ${env.RELEASE_SCOPE}" 
      } 
     } 
    } 
} 

我希望这有助于

2

还有另一种解决办法:你可以“管道”之前使用“属性”步 - 你也可以使用主动选择插件:

properties([ 
    parameters([ 
     [ 
      $class: 'ChoiceParameter', 
      choiceType: 'PT_SINGLE_SELECT', 
      description: '', 
      filterable: false, 
      name: 'Release', 
      randomName: 'choice-parameter-21337077649621572', 
      script: [ 
       $class: 'GroovyScript', 
       fallbackScript: '', 
       script: '''// Find relevant AMIs based on their name 
        def sout = new StringBuffer(), serr = new StringBuffer() 
        def proc = '/usr/bin/aws --region eu-west-1 ec2 describe-images \ 
          ' --owners OWNER --filter Name=name,Values=PATTERN \ 
          ' --query Images[*].{AMI:Name} --output text'.execute() 
        proc.consumeProcessOutput(sout, serr) 
        proc.waitForOrKill(10000) 
        return sout.tokenize()''' 
      ] 
     ] 
    ]) 
]) 
pipeline { 
    ... 
} 

唯一的是你第一次开始你的构建,它会失败。第二次启动它应该是“带参数的构建”。

希望它有帮助。

+0

这根本不工作。获取'java.lang.IllegalArgumentException:无法实例化'错误,并且它不会像你写的那样第二次运行。 – yorammi

+0

刚刚在jenkins 2.73.2上进行了测试(但最初是为jenkins 2.6x.x编写的),它采用了Active Choice Plugin 1.4 - 它可以工作。 您是否编写了一些流水线阶段和步骤? –

+0

我已经解决了它,因为我评论。切换到其他的东西;-) – yorammi

相关问题