Перечислите git ответвлений как параметр Dynami c в декларативном конвейере. - PullRequest
2 голосов
/ 27 апреля 2020

Я изо всех сил стараюсь включить динамический c параметр выбора в мой декларативный конвейер. Я испробовал множество разных предложений, которые не помогли, так как сейчас я полностью потерял свой след: -)

Для желаемой функциональности: у меня есть Jenkinsfile (декларативный) для конвейера jenkins. Я хочу, чтобы у меня был параметр, позволяющий мне выбрать конкретную ветку c из репозитория git для использования в конвейере.

Базовая c структура файла jenkinsfile:

pipeline {

    agent { node { label "XXX-XXX-XXX" } }

    options {
        gitLabConnection('XXX-XXX-XXX')
    }

    stages {
        stage("STAGE A") {
            parallel{
                stage("A"){
                    steps {
                        // DO STUFF
                    }
                }
                stage("B"){
                    steps {             
                        // DO STUFF
                    }
                }
            }
        }
    }
}

Я попытался добавить параметр, используя следующий фрагмент в конвейере. Я не смог динамически заполнить список вариантов. Он был либо пустым, либо выдавал ошибки.

parameters {
        choice(
            name: 'CHOICE_2',
            choices: 'choice_1\nchoice_2\nchoice_3\nchoice_4\nchoice_5\nchoice_6',
            description: 'CHOICE_2 description',
        )
}

В качестве альтернативы я попытался получить следующее вне объявления конвейера. Я оставил один, если сценарий вариации в качестве примера. Здесь я снова не смог заполнить список вариантов. Поле оставалось пустым:

node {
    label "XXX-XXX-XXX"
    properties([
        parameters([
            [$class: 'ChoiceParameter', 
                choiceType: 'PT_SINGLE_SELECT', 
                description: 'The names', 
                filterLength: 1, 
                filterable: true, 
                name: 'Name', 
                randomName: 'choice-parameter-5631314439613978', 
                script: [
                    $class: 'GroovyScript', 
                    script: [
                        classpath: [], 
                        sandbox: false, 
                        script: '''
                            def gettags = "git ls-remote git@XXX-XXX-XXX.git".execute()
                            def tagList = []
                            def t1 = []
                            String tagsString = null;
                            gettags.text.eachLine {tagList.add(it)}
                            for(i in tagList)
                                t1.add(i.split()[1].replaceAll('\\^\\{\\}', ''))
                            t1 = t1.unique()
                            tagsString = StringUtils.join((String[])t1, ',');

                            return tagsString
                                '''
                    ]
                ]
            ], 
        ])
    ])
}

На данный момент я перепробовал слишком много разных подходов и хотел бы сделать go шаг назад.

Может ли кто-нибудь поддержать меня подходом и некоторые намеки или ресурсы?

Спасибо и с наилучшими пожеланиями,

1 Ответ

0 голосов
/ 27 апреля 2020

Я предложу вам создать файл с перечнем удаленных веток, после чего у вас может быть этап для утверждения и выбора правильной ветки - вы пробовали многоотраслевые конвейеры? Может быть, это относится к вашему случаю использования ...

pipeline {

    agent { node { label "XXX-XXX-XXX" } }

    options {
        gitLabConnection('XXX-XXX-XXX')
        skipDefaultCheckout() //this will avoid to checkout the code by defaul
    }

    stages {
        stage("Get Branches from Git Remote"){ // you might need to tweak the list retrieved from git branches cmd
            steps{
                 withCredentials([usernamePassword(credentialsId: 'git-credential', passwordVariable: 'key', usernameVariable: 'gitUser')]) {    
                     sh """
                        mkdir git_check
                        cd git_check
                        git clone https://${gitUser}:${key}@${GIT_URL} .
                        git branch -a | grep remotes > ${WORKSPACE}/branchesList.txt 
                        cd ..
                        rm -r git_check
                     """
                  }
               }    
            }
        }
        stage('User Input'){
           steps{
               listBranchesAvailable = readFile 'branchesList.txt'
                    env.branchToDeploy = timeout (time:1, unit:"HOURS") {
                        input message: 'Branch to deploy', ok: 'Confirm!',
                                parameters: [choice(name: 'Branches Available:', choices: "${listBranchesAvailable }", description: 'Which branch do you want to build?')]
                        }     
           }       
        }
        stage('Checkout Code'){
            steps{
                cleanWs() // ensure workspace is empty
                git branch: "${branchToDeploy}", changelog: false, credentialsId: 'gitcredential', poll: false, url: "${GIT_URL}" //checks out the right code branch

            }
        }
        stage("STAGE A") {
            parallel{
                stage("A"){
                    steps {
                        // DO STUFF
                    }
                }
                stage("B"){
                    steps {             
                        // DO STUFF
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...