为多模块Maven项目编写jenkins管道的最佳实践是什么

时间:2018-09-18 09:24:32

标签: jenkins-pipeline

这些是a simplified maven multiple-module project,项目结构如下:

-pom.xml

-eureka
    -src
    -pom.xml
-gateway
    -src
    -pom.xml
-order
    -src
    -pom.xml
-user
    -src
    -pom.xml

启动这些模块的詹金管道彼此非常相似,因此我创建了this jenkins pipeline project

结构如下:

-vars
    -springCloudPipeline.groovy

-eureka-JenkinsFile
-gateway-JenkinsFile
-order-JenkinsFile
-user-JenkinsFile

eureka-JenkinsFile

@Library('springCloudPipeline') _

springCloudPipeline(branch :'master',
    scmUrl : 'https://github.com/wuxudong/spring-cloud-best-practice.git',
    serviceName : 'eureka')

gateway-JenkinsFile

@Library('springCloudPipeline') _

springCloudPipeline(branch :'master',
    scmUrl : 'https://github.com/wuxudong/spring-cloud-best-practice.git',
    serviceName : 'gateway')

......

vars / springCloudPipeline.groovy

def call(Map pipelineParams) {
    pipeline {
        agent any
        environment {
            branch = "${pipelineParams.branch}"
            scmUrl = "${pipelineParams.scmUrl}"
            serviceName = "${pipelineParams.serviceName}"
        }
        stages {
            stage('checkout git') {
                steps {
                    git branch: branch, url: scmUrl
                }
            }

            stage('build') {
                steps {
                    sh 'mvn clean package -DskipTests=true'
                }
            }

            stage('deploy'){
                steps {
                    sh "JENKINS_NODE_COOKIE=dontKillMe nohup java -jar ${pipelineParams.serviceName}/target/${pipelineParams.serviceName}.jar &"
                }
            }


        }

    }
}

我创建了4个管道任务:eurekagatewayorderuser
唯一的区别是它们具有不同的脚本路径。

为了导入springCloudPipeline模板,我必须在jenkins->系统设置中定义一个全局管道库:springCloudPipeline-> https://github.com/wuxudong/multiple-module-jenkins-pipeline.git

因为springCloudPipeline仅由该项目本身使用,所以我想知道是否有一种方法无需定义全局pipleline库。

我确实找到了一个插件https://github.com/karolgil/SharedLibrary,可以将存储库的某些部分作为共享库加载,但是我想知道是否还有其他官方解决方案?

1 个答案:

答案 0 :(得分:1)

我想知道,为什么我们需要多个 Jenkinsfile(每个模块一个)?

我们只需要在根级别保留一个 Jenkinsfile 并仅从根级别触发 maven 构建。所有子模块都将以隐蔽方式构建/部署。

如果您想为每个模块构建/推送 Docker 镜像,您可以通过定义各个阶段从根 Jenkisfile 单独触发。