groovy Jenkins动态声明性管道参数

mu0hgdu0  于 2022-11-01  发布在  Jenkins
关注(0)|答案(5)|浏览(318)

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)
    }
    ...
 }

EDIT我最后使用的是jenkins-job-builder,带有扩展的选择参数。它目前不支持groovyScript参数,所以我修改了它。https://review.openstack.org/#q,I 0 c6 ac 0 b49 c24 b8 d3 afbc 06 b 003847 de 2 e043 c2 b8,n,z
EDIT上述链接已失效,因此这里是另一个指向openstack的链接:https://review.opendev.org/#/c/477003/但问题的要点是我向jenkins-job-builder添加了一个名为'groovyScriptFile'的新参数,它被合并了。

t2a7ltrp

t2a7ltrp1#

那么用户输入:

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)
}
ppcbkaq5

ppcbkaq52#

还有另一种解决办法:你可以在“pipeline”之前使用“properties”步骤-在那里你也可以使用活动的选择插件:

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 {
    ...
}

唯一的问题是,第一次启动构建时,它会失败。第二次启动时,它应该是一个“带参数的构建”。
希望能有所帮助。

w6mmgewl

w6mmgewl3#

对于任何需要声明性管道语法选项的人,我在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}"
            }
        }
    }
}

我希望这对你有帮助

dfty9e19

dfty9e194#

在我进入同一条船并阅读了https://www.jenkins.io/doc/book/pipeline/jenkinsfile/“处理参数”部分的说明后,我得到了一个非常简单的方法,因为我们可以在其他一切之前运行属性。
把这个快速的例子和修改你的喜好,我正在创建2个多选择选项,一个将是硬编码,另一个将使用在底部的函数(管道节点外)下的选择选项,你可以使用脚本{}步骤。

properties([
            [
            $class: 'RebuildSettings', autoRebuild: false, rebuildDisabled: false],
            parameters
            (
                [
                    choice(choices: ['opt1', 'opt2', 'opt3'], description: 'desc', name: 'bla'),
                    choice(choices: script{return_list()}, description: 'some letter', name: 'ble')
                ]
        )
    ]
 )

pipeline {
    agent{
        label "Linux"
    }

    stages{
        stage("frist"){
            steps{
                echo "${params.bla}"
                echo "${params.ble}"
            }
        }
    }
}

def return_list(){
    if ("${JOB_NAME}".contains("bla")){
        env.list_users = "1\n 2\n 3\n"
    }else{
        env.list_users = "a\n b\n c\n"
    }
    return env.list_users
}

你也可以把它们放到一个步骤里

stages{
    stage("add more params"){
        steps{
                properties([
                    parameters([
                    choice(choices: [script{return_list()}
                    ],
                    description: 'This is the branch that we will build',
                    name: 'param3')
                    ])
                ])

        }
    }

请注意,您必须运行它一次,以便下一个作业将获取参数。(只有最新的属性节点将出现在UI中)
使用此方法,您甚至可以决定是否要在UI中显示某个参数。例如

properties([
            [
            $class: 'RebuildSettings', autoRebuild: false, rebuildDisabled: false],
            parameters
            (
                script{
                    list_arguments()
                }   
        )
    ]
 )
pipeline {
    agent{
        label "Linux"
    }

    stages{
        stage("frist"){
            steps{
                echo "${params.bla}"
                echo "${params.ble}"
            }
        }
    }
}

def return_list(){
    if ("${JOB_NAME}".contains("bla")){
        env.list_users = "1\n 2\n 3\n"
    }else{
        env.list_users = "a\n b\n c\n"
    }
    return env.list_users
}

def list_arguments(){
    lista = return_list()
    if ("${JOB_NAME}".contains("word")){
        ch = [
            choice(choices: ['opt1', 'opt2', 'opt3'], description: 'desc', name: 'bla'),
            choice(choices: ["${lista}"], description: 'some letter', name: 'ble')
        ]

    }else{
        ch = [
            choice(choices: ['opt1', 'opt2', 'opt3'], description: 'desc', name: 'bla')
        ]
    } 
    return ch

}
5w9g7ksd

5w9g7ksd5#

2022年更新:最初在2017年的X1 E2 F1 X的X1 E3 F1 X中提到的X1 E0 F1 X(X1 E1 F1 X)已经进化。
其最新的2.60.2版本(2022年6月)确保支持Jenkins 2.335+,因为最近的Jenkins版本确实修改了DOM,如JENKINS-68013所示。
当前示例:

properties([
  parameters([
    [
      $class: 'ChoiceParameter',
      choiceType: 'PT_SINGLE_SELECT',
      name: 'Environment',
      script: [
        $class: 'ScriptlerScript',
        scriptlerScriptId:'Environments.groovy'
      ]
    ],
    [
      $class: 'CascadeChoiceParameter',
      choiceType: 'PT_SINGLE_SELECT',
      name: 'Host',
      referencedParameters: 'Environment',
      script: [
        $class: 'ScriptlerScript',
        scriptlerScriptId:'HostsInEnv.groovy',
        parameters: [
          [name:'Environment', value: '$Environment']
        ]
      ]
   ]
 ])
])

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        echo "${params.Environment}"
        echo "${params.Host}"
      }
    }
  }
}

请注意,JENKINS-63284PR 47将允许Groovy属性的初始管道作业支持。
此功能将启用Jenkinsfile、管道、cron-scheduled和通过其他方式触发的作业,而无需使用Jenkins的GUI/HTML。

相关问题