Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jenkins declarative pipeline - User input parameters

I've looked for some example of user input parameters using Jenkins declarative pipeline, however all the examples are using the scripted pipelines. Here is a sample of code I'm trying to get working:

pipeline {
    agent any

    stages {
        stage('Stage 1') {
            steps {
                 input id: 'test', message: 'Hello', parameters: [string(defaultValue: '', description: '', name: 'myparam')]
                 sh "echo ${env}"
            }
        }
    }
}

I can't seem to work out how I can access the myparam variable, it would be great if someone could help me out. Thanks

like image 315
Jack Avatar asked Sep 18 '17 09:09

Jack


1 Answers

When using input, it is very important to use agent none on the global pipeline level, and assign agents to individual stages. Put the input procedures in a separate stage that also uses agent none. If you allocate an agent node for the input stage, that agent executor will remain reserved by this build until a user continues or aborts the build process.

This example should help with using the Input:

def approvalMap             // collect data from approval step

pipeline {
    agent none

    stages {
        stage('Stage 1') {
            agent none
            steps {
             
                timeout(60) {                // timeout waiting for input after 60 minutes
                    script {
                        // capture the approval details in approvalMap. 
                         approvalMap = input 
                                        id: 'test', 
                                        message: 'Hello', 
                                        ok: 'Proceed?', 
                                        parameters: [
                                            choice(
                                                choices: 'apple\npear\norange', 
                                                description: 'Select a fruit for this build', 
                                                name: 'FRUIT'
                                            ), 
                                            string(
                                                defaultValue: '', 
                                                description: '', 
                                                name: 'myparam'
                                            )
                                        ], 
                                        submitter: 'user1,user2,group1', 
                                        submitterParameter: 'APPROVER'
                                            
                    }
                }
            }
        }
        stage('Stage 2') {
            agent any

            steps {
                // print the details gathered from the approval
                echo "This build was approved by: ${approvalMap['APPROVER']}"
                echo "This build is brought to you today by the fruit: ${approvalMap['FRUIT']}"
                echo "This is myparam: ${approvalMap['myparam']}"
            }
        }
    }
}

When the input function returns, if it only has a single parameter to return, it returns that value directly. If there are multiple parameters in the input, it returns a map (hash, dictionary), of the values. To capture this value we have to drop to groovy scripting.

It is good practice to wrap your input code in a timeout step so that build don't remain in an unresolved state for an extended time.

like image 88
Rob Hales Avatar answered Oct 23 '22 22:10

Rob Hales