web-dev-qa-db-fra.com

Paramètres du pipeline déclaratif dynamique Jenkins

Les paramètres d'un pipeline déclaratif Jenkins peuvent-ils être dynamiques?

Je veux que les valeurs des options de choix soient remplies au moment de l'exécution par une fonction. Le code suivant génère une liste d'options, mais elles semblent obsolètes - probablement générées la première fois que j'ai exécuté ce code. Si la liste des AMI change, les choix restent les mêmes. Je veux que cela s'exécute chaque fois que je sélectionne 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)
    }
    ...
 }

[~ # ~] modifier [~ # ~] J'ai fini par utiliser jenkins-job-builder, avec des paramètres de choix étendus. Il ne prend pas en charge le paramètre groovyScript pour le moment, je l'ai donc modifié https://review.openstack.org/#q,I0c6ac0b49c24b8d3afbc06b003847de2e043c2b8,n,z

[~ # ~] modifier [~ # ~] Le lien ci-dessus est mort, alors voici un autre lien vers openstack: https://review.opendev.org/#/c/477003/ Mais l'essentiel est que j'ai ajouté un nouveau paramètre à jenkins-job-builder appelé 'groovyScriptFile', qui a été fusionné.

7
jarondl

qu'en est-il de la saisie utilisateur:

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)
}
16
daggett

Il existe une autre solution: vous pouvez utiliser l'étape "propriétés" avant "pipeline" - vous pouvez également utiliser le plugin de choix actif:

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

La seule chose est que la première fois que vous démarrez votre build, cela échouera. La deuxième fois que vous le lancez, ce devrait être un "build with parameter".

J'espère que cela aide.

9
Mario R.

Pour tous ceux qui ont besoin d'une option de syntaxe déclarative de pipeline , j'ai trouvé une bonne solution dans ne autre question , ce qui m'a aidé.

Ceci est ma suggestion basée sur elle. Vous devriez pouvoir générer une liste plus dynamique avec le code qui crée le ${WORKSPACE}/list fichier

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}"
            }
        }
    }
}

J'espère que ça aide

6
Eldad Assis