引言

由于项目越来越多, 而且编写的jenkinsfile也大同小异.我们引入Jenkins的Shared Library插件来实现多个项目使用同一个Jenkinsfile.

项目结构

单独创建工程用于存放jenkins的文件, 不再每个项目的存放Jenkinsfile
在这里插入图片描述

由于我是直接调用了完整的声明式管道, 这个项目实际上只需要vars目录和根目录下的Jenkinsfile文件.

jenkins job

首先系统设置->配置 找到Global Pipeline Libraries 然后如图配置即可:
在这里插入图片描述

然后修改job配置
前面的环境变量设置略, 修改流水线的git地址为新建的存放统一Jenkinsfile的git地址
注意git地址不再是构建任务的git地址了

编写Jenkinsfile 和 共享库
Jenkinsfile文件
library 'xxxx-library' // 在Global Pipeline Libraries中配置的library name

    def config = [:]  //一些环境变量与job中配置的环境变量对应
    config.put('IPS',"$ips")
    config.put('CREID',"$credentials_id")
    config.put('GITURL', "$git_url")
    config.put('MVN_PARAM', "$mvn_param")
    config.put('MVN_PACK_PARAM', "$mvn_package_param")
    config.put('SERVICE_NAME',"$service_name")
    config.put('PROJECT_NAME', "$project_name")
    config.put('ISMODULE', "$isModule")
    config.put('DEFAULT_BRANCH',"$default_branch")

    if("$isModule" == "true"){  //进行判断根据不同类型的服务调用不同的pipeling
        pipelineCall(config)
    }else{
        normalCall(config)
    }
normalCall.groovy

执行的计划几乎之前文章一样, 可参考上篇博文


def call(Map config){

    pipeline {
        agent any
        environment { //设置环境变量 与Jenkinsfile对应
            ipList = "${config.IPS}"
            credentials_id = "${config.CREID}"
            git_url = "${config.GITURL}"
            mvn_param = "${config.MVN_PARAM}"
            mvn_package_param = "${config.MVN_PACK_PARAM}"
            service_name = "${config.SERVICE_NAME}"
            project_name = "${config.PROJECT_NAME}"
            default_branch = "${config.DEFAULT_BRANCH}"
        }

        parameters {
            gitParameter (
                    defaultValue: default_branch,
                    branchFilter: 'origin/(.*)',
                    name: 'BRANCH',
                    quickFilterEnabled: true,
                    selectedValue: 'DEFAULT',
                    sortMode: 'DESCENDING_SMART',
                    tagFilter: '*',
                    type: 'PT_BRANCH',
                    description: 'Please select a branch or tag to build',
                    useRepository: git_url
            )
        }

        stages{
            stage('Build') {
                steps{
                    git  branch:  params.BRANCH, changelog: false, credentialsId:credentials_id , poll: false, url: git_url
                    sh "mvn clean -P ${mvn_param}  ${mvn_package_param} -Dmaven.test.skip=true"
                }

                post {
                    success {
                        archiveArtifacts 'target/*.jar'
                    }
                }
            }

            stage('Deploy') {
                steps {
                    //发布项目  参考之前的文章
                    //构建失败终止计划
                    if('FAILURE'.equals(currentBuild.result) || 'UNSTABLE'.equals(currentBuild.result)) {
                        echo "Current build is in FAILURE or UNSTABLE state, the whole process will exit!!"
                        break;
                    }
                }
            }
        }
    }
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐