Как запустить одни и те же этапы на нескольких узлах в декларативном конвейере Jenkins? - PullRequest
0 голосов
/ 22 мая 2019

У нас есть такой конвейер:

pipeline {
    agent none

    stages {
        stage('Build') {
            // ...
        }

        stage('Test') {
            parallel {
                stage('Test on Debian') {
                    agent {
                        label 'debian'
                    }
                    steps {
                        unstash 'compile-artifacts'
                        unstash 'dot-gradle'

                        sh './gradlew check --stacktrace'
                    }
                    post {
                        always {
                            junit '*/build/test-results/**/*.xml'
                        }
                    }
                }

                stage('Test on CentOS') {
                    agent {
                        label 'centos'
                    }
                    steps {
                        unstash 'compile-artifacts'
                        unstash 'dot-gradle'

                        sh './gradlew check --stacktrace'
                    }
                    post {
                        always {
                            junit '*/build/test-results/**/*.xml'
                        }
                    }
                }

                stage('Test on Windows') {
                    agent {
                        label 'windows'
                    }
                    steps {
                        unstash 'compile-artifacts'
                        unstash 'dot-gradle'

                        bat "gradlew.bat check --stacktrace"
                    }
                    post {
                        always {
                            junit '*/build/test-results/**/*.xml'
                        }
                    }
                }

                stage('Test on macOS') {
                    agent {
                        label 'macos'
                    }
                    steps {
                        unstash 'compile-artifacts'
                        unstash 'dot-gradle'


                        sh './gradlew check --stacktrace'
                    }
                    post {
                        always {
                            junit '*/build/test-results/**/*.xml'
                        }
                    }
                }
            }
        }
    }
}

Каждый этап по существу идентичен, за исключением одной строки в блоке Windows, с которой я уже знаю, как справиться, так есть ли способ отфильтровать общие части этих этапов для удаления дублирования?

Я уже пытался вставить inline цикл, но это не то, что декларативные конвейеры позволяют вам делать. (

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Вы можете реорганизовать свои step{} -блоки с помощью groovy-методов:

def stageX(boolean linux)
{
    unstash 'compile-artifacts'
    unstash 'dot-gradle'
    if (linux) {
        sh './gradlew check --stacktrace' }
    else {
        bat "gradlew.bat check --stacktrace" }
}

, который вы должны назвать следующим образом в step{}:

steps
{
   script { stageX( true) } // or with false for your windows agent
}

Конечно, вы можете сделать то же самое для своего вызова junit-plugin:

def junitCall()
{
    junit '*/build/test-results/**/*.xml'
}

и назовите это как:

            post {
                always {
                    script { junitCall() }   
                }
            }

Вы не выиграете много строк, но это значительно улучшит обработку кода. Если вы хотите очистить свой Jenkinsfile еще больше, вы можете поместить методы в разделяемую библиотеку, которую вы импортируете, чтобы они даже не были объявлены в вашем Jenkinsfile.

0 голосов
/ 11 июля 2019

По сути, то, что вы хотите сделать, в настоящее время невозможно. Как https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-declarative-pipelines заявляет:

Начиная с этого момента в общих библиотеках могут быть определены только целые конвейеры время. Это можно сделать только в vars / *. Groovy и только в вызове метод. Только один декларативный конвейер может быть выполнен в одном построить, и если вы попытаетесь выполнить второй, ваша сборка будет потерпеть неудачу в результате.

Таким образом, вы можете определить методы для объединения нескольких шагов или вы можете объединить весь конвейер в общей библиотеке, но ничего между ними. Что на самом деле стыдно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...