Jenkins动态声明性管道参数

jar*_*ndl 8 groovy jenkins jenkins-pipeline

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)
    }
    ...
 }
Run Code Online (Sandbox Code Playgroud)

编辑 我最终使用jenkins-job-builder扩展选择参数.它目前不支持该groovyScript参数,所以我修改了它https://review.openstack.org/#q,I0c6ac0b49c24b8d3afbc06b003847de2e043c2b8,n,z

dag*_*ett 16

用户输入怎么样:

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨@daggett,感谢您的帮助。这是迄今为止最接近的,但有两个缺点 1. 它不适用于声明式管道(我将尝试修改它以使其工作)。2. 用户流程远不如带参数的构建页面好。我会尝试让它在声明性管道上工作,然后再回来找你 (2认同)

小智 9

还有另一种解决方案:您可以在"管道"之前使用"属性"步骤 - 您也可以使用活动选择插件:

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 {
    ...
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,第一次开始构建时,它会失败.第二次启动它应该是"使用参数构建".

希望能帮助到你.


Eld*_*sis 6

对于需要声明式管道语法选项的任何人,我在另一个问题中找到了一个很好的解决方案,它对我有所帮助。

这是我基于此的建议。您应该能够使用创建${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}"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助