Como executar uma pipeline multibranch com parâmetros no Jenkins

No dia a dia de uma empresa que usa o Jenkins como solução de CI/CD existem momentos em que o tide de infraestrutura, ou até mesmo o desenvolvimento, precisa executar apenas uma etapa da pipeline.

Em uma pipeline tradicional isso não é possível, o Jenkins vai executar todos os passos, build, testes, publicar artefatos e fazer o deploy no ambiente selecionado.

Mas e se a pipeline falhou em apenas uma etapa? Digamos por exemplo que o deploy no ambiente K8S deu timeout, ou você fez uma mudança apenas na etapa de teste, precisa mesmo rodar a pipeline toda?

A ideia deste artigo é mostrar como eu fiz para selecionar quais etapas da pipeline executar usando parâmetros.

De acordo com a documentação do Jenkins é possível usar parâmetros para isso.

pipeline {
    agent any
    parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')

        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')

        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')

        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')

        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
    }
    stages {
        stage('Example') {
            steps {
                echo "Hello ${params.PERSON}"

                echo "Biography: ${params.BIOGRAPHY}"

                echo "Toggle: ${params.TOGGLE}"

                echo "Choice: ${params.CHOICE}"

                echo "Password: ${params.PASSWORD}"
            }
        }
    }
}

Então usando a pipeline abaixo, conseguimos definir no momento do build se queremos ou não rodar uma das etapas da pipeline.

pipeline {
    agent any
    parameters {
        booleanParam(name: 'RUN_TESTS', defaultValue: true, description: 'Should we run tests before deployment?')

    }

    stages {
        stage('Test') {
            when {
                expression {
                    return params.RUN_TESTS
                }
            }

            steps {
                sh '${FABRIC} test'
            }
        }

        stage('Deploy') {
            steps {
                sh '${FABRIC} deploy'
            }
        }
    }
}

Um dos pontos importantes no ambiente real foi a definição de variáveis. Se por alguma razão a sua pipeline define variáveis dentro da etapa selecionada para não ser executada a sua pipeline poderá falhar por isso, então não esqueça de verificar se dentro das etapas que você escolheu pular existem passos que serão usadas no restante da pipeline.