首页 文章

Jenkins动态声明性管道参数

提问于
浏览
5

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,I0c6ac0b49c24b8d3afbc06b003847de2e043c2b8,n,z

3 回答

  • 11

    对于需要 declarative pipeline syntax 选项的任何人,我在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}"
                }
            }
        }
    }
    

    我希望这有帮助

  • 4

    那么用户输入:

    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)
    }
    
  • 6

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

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

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

    希望能帮助到你 .

相关问题