«Включить» конвейер разделяемой библиотеки в другие конвейеры той же разделяемой библиотеки - PullRequest
1 голос
/ 30 сентября 2019

У меня есть несколько микросервисов, использующих один и тот же конвейер из общей библиотеки , которая называется jenkins-shared-pipelines . Jenkinsfile для микросервиса выглядит следующим образом:

@Library(['jenkins-shared-pipelines']) _

gradleProjectPrPipeline([buildAgent: 'oc-docker-jdk11', disableIntegrationTestStage: true])

В jenkins-shared-pipelines / vars, gradleProjectPrPipeline имеет следующие этапы:

/**
 * gradleProjectPrPipeline is a generic pipeline
 * @param pipelineProperties map used to pass parameters
 * @return
 */
void call(Map pipelineProperties = [:]) {
            .
            .
            .

    pipeline {
        agent {
            node {
                label "${pipelineProperties.buildAgent}"
            }
        }

        options {
            skipDefaultCheckout true
            timeout(time: 1, unit: 'HOURS')
            buildDiscarder(logRotator(
                    numToKeepStr: '5',
                    daysToKeepStr: '7',
                    artifactNumToKeepStr: '1',
                    artifactDaysToKeepStr: '7'
            ))
        }

        stages {
            stage('Clone') {                
                steps {
                    //clone step
                }
            }
            stage('Compile') {                
                steps {
                    script {
                       /*Some custom logic*/
                    }
                    runGradleTask([task: 'assemble',
                                   rawArgs: defaultGradleArgs + " -Pcurrent_version=${releaseTag}"
                    ])
                }
            }
            stage('Tests') {
                parallel {
                    stage('Unit tests') {                        
                        steps {
                            //Unit tests
                        }
                    }
                    stage('Integration tests') {                        
                        steps {
                            //Integration tests
                        }
                    }
                }
            }
            stage('Sonar scan') {                
                steps {
                    //Sonar scanning
                }
            }

        }

        post {

            unsuccessful {
                script {
                    bitbucketHandler.notifyBuildFail([
                        displayName: pipelineName,
                        displayMessage: "Build ${env.BUILD_ID} failed at ${env.BUILD_TIMESTAMP}."
                    ])
                }
            }
            success {
                script {
                    bitbucketHandler.notifyBuildSuccess([
                        displayName: pipelineName,
                        displayMessage: "Build ${env.BUILD_ID} completed at ${env.BUILD_TIMESTAMP}."
                    ])
                }
            }
        }
    }
}

Сейчас, в дополнение к указанному выше конвейеру в jenkins-shared-pipelines (в том же каталоге vars) будет еще несколько конвейеров например: awsPipeline, azurePipeline и т. Д., Которые также будут включать этапы развертывания. Эти дополнительные конвейеры потребуют все этапы в вышеупомянутом gradleProjectBranchWrapper, а также добавят несколько своих собственных этапов . В настоящее время мы просто копируем и вставляем эти этапы в эти дополнительные конвейеры,

void call (Map pipelineProperties = [:]) {. ,.

    pipeline {
        agent {
            node {
                label "${pipelineProperties.buildAgent}"
            }
        }

        options {
            skipDefaultCheckout true
            timeout(time: 1, unit: 'HOURS')
            buildDiscarder(logRotator(
                    numToKeepStr: '5',
                    daysToKeepStr: '7',
                    artifactNumToKeepStr: '1',
                    artifactDaysToKeepStr: '7'
            ))
        }

        stages {
            stage('Clone') {                
                steps {
                    //clone step
                }
            }
            stage('Compile') {                
                steps {
                    script {
                       /*Some custom logic*/
                    }
                    runGradleTask([task: 'assemble',
                                   rawArgs: defaultGradleArgs + " -Pcurrent_version=${releaseTag}"
                    ])
                }
            }
            stage('Tests') {
                parallel {
                    stage('Unit tests') {                        
                        steps {
                            //Unit tests
                        }
                    }
                    stage('Integration tests') {                        
                        steps {
                            //Integration tests
                        }
                    }
                }
            }
            stage('Sonar scan') {                
                steps {
                    //Sonar scanning
                }
            }  
           stage('AWS'){

           }          
        }

        post {

            unsuccessful {
                script {
                    bitbucketHandler.notifyBuildFail([
                        displayName: pipelineName,
                        displayMessage: "Build ${env.BUILD_ID} failed at ${env.BUILD_TIMESTAMP}."
                    ])
                }
            }
            success {
                script {
                    bitbucketHandler.notifyBuildSuccess([
                        displayName: pipelineName,
                        displayMessage: "Build ${env.BUILD_ID} completed at ${env.BUILD_TIMESTAMP}."
                    ])
                }
            }
        }
    }
}

затем мы вызываем эти новые конвейеры из микроуслуг, например:

@Library(['jenkins-shared-pipelines']) _

awsPipeline([buildAgent: 'oc-docker-jdk11', disableIntegrationTestStage: true])

Как очевидно, существует избыточность кода как клонирование на стадии sonarScanраспространены, но не существует «базового конвейера» или другого способа включить эти общие этапы во все конвейеры . Мне было интересно, есть ли способ «включить» gradleProjectPrPipeline (который может служить «базовым конвейером») в такие конвейеры, как awsPipeline, azurePipeline и так далее. Примечание:

  • Рабочее пространство (где олень-клон проверяет код и работают более поздние этапы) будет использоваться awsPipeline и т. Д. Другими словами, переменные и результаты изgradleProjectBranchWrapper должен быть доступен для awsPipeline и т. д.
  • В gradleProjectBranchWrapper есть постоблок, другие конвейеры могут иметь свои собственные постблоки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...