
在前两篇中我们学会了如何编写 Declarative Pipeline。但随着项目增多你会发现每个 Jenkinsfile 中都在重复写着类似的代码拉取代码、Maven 构建、Docker 打包、发送通知……维护几十个几乎相同的 Pipeline 会变成一场噩梦。Jenkins Shared Library共享库 正是为解决这个问题而生——它让你把通用的 Pipeline 逻辑抽取为可复用的函数一处修改全局生效。一、什么是 Shared LibraryShared Library 是 Jenkins 提供的流水线代码复用机制本质上是一个独立的 Git 仓库存放可被多个 Jenkinsfile 调用的通用 Groovy 脚本。它的核心价值消除重复代码多个项目的流水线无需重复编写相同逻辑统一标准流程强制所有项目使用相同的构建/部署逻辑简化维护通用逻辑变更时只需修改共享库中的一处代码团队协作共享库可以在团队内跨项目复用二、Shared Library 的目录结构一个标准的 Shared Library 仓库需要遵循固定的目录结构Jenkins 会自动识别并加载对应文件textjenkins-shared-library/├── vars/ # 核心目录全局函数必选│ ├── ciPipeline.groovy # 完整的 CI 流水线封装│ ├── notifySlack.groovy # Slack 通知函数│ └── deployApp.groovy # 部署函数├── src/ # Groovy 类可选│ └── org/example/│ └── Utils.groovy # 工具类└── resources/ # 静态资源文件可选└── templates/└── email.txt # 邮件模板各目录的作用 核心约定vars/ 目录下的每个 .groovy 文件其文件名就是函数名文件内必须包含一个 call 方法作为默认入口。三、编写第一个 Shared Library 函数3.1 创建函数vars/hello.groovy// vars/hello.groovydefcall(String nameJenkins){echoHello,${name}! Welcome to Shared Library!}3.2 创建工具类src/org/example/Utils.groovy// src/org/example/Utils.groovypackageorg.exampleclassUtils{staticvoidprintHeader(script,String msg){script.echo${msg}}staticStringgetTimestamp(){returnnewDate().format(yyyy-MM-dd HH:mm:ss)}}3.3 推送共享库到 Git 仓库mkdirjenkins-shared-librarycdjenkins-shared-librarymkdir-pvars src/org/example# 创建上述文件后提交到 Gitgitinitgitadd.gitcommit-mfeat: initial shared librarygitremoteaddorigin https://github.com/your-team/jenkins-shared-library.gitgitpush-uorigin main四、在 Jenkins 中配置 Shared Library4.1 全局配置推荐登录 Jenkins → 系统管理 → 系统配置滚动到 Global Pipeline Libraries点击 新增填写以下字段点击 保存4.2 文件夹级别配置如果只想让某个文件夹下的 Pipeline 使用该库可以在文件夹的配置中单独添加 Shared Library。五、在 Jenkinsfile 中使用 Shared Library5.1 使用 Library 注解推荐在 Jenkinsfile 顶部使用 Library 注解导入库Library(my-shared-lib)_pipeline{agent any stages{stage(打招呼){steps{// 调用 vars/hello.groovyhello(World)}}}}⚠️ 注意Library(‘my-shared-lib’) _ 中的下划线不能省略它是 Groovy 语法的一部分。5.2 指定特定分支或版本// 使用特定分支Library(my-shared-libdevelop)_// 使用特定 TagLibrary(my-shared-libv1.2.0)_5.3 使用 src/ 目录中的类Library(my-shared-lib)_importorg.example.Utils pipeline{agent any stages{stage(使用工具类){steps{script{Utils.printHeader(this,开始构建)echo时间${Utils.getTimestamp()}}}}}}六、实战封装完整的 CI 流水线库下面是一个更完整的共享库示例涵盖了从代码拉取到部署通知的全流程。6.1 核心流水线函数vars/ciPipeline.groovy// vars/ciPipeline.groovydefcall(Map config[:]){// 默认参数defappNameconfig.appName?:unknown-appdefregistryconfig.registry?:registry.example.comdefimageTagconfig.imageTag?:env.BUILD_NUMBER?:latestdefrunTestsconfig.runTests!null?config.runTests:truestage(拉取代码){checkout scm}stage(编译打包){shmvn clean package -DskipTests}stage(单元测试){if(runTests){shmvn test}else{echo跳过单元测试}}stage(构建镜像){sh docker build -t${registry}/${appName}:${imageTag}. }stage(推送镜像){withCredentials([usernamePassword(credentialsId:docker-registry,usernameVariable:DOCKER_USER,passwordVariable:DOCKER_PASS)]){sh docker login -u${DOCKER_USER}-p${DOCKER_PASS}${registry}docker push${registry}/${appName}:${imageTag}}}stage(归档产物){archiveArtifacts artifacts:target/*.jar}}6.2 通知函数vars/notifySlack.groovy// vars/notifySlack.groovydefcall(Map config[:]){defmessageconfig.message?:Build finisheddefstatusconfig.status?:SUCCESSdefcolorconfig.color?:(statusSUCCESS?good:danger)defchannelconfig.channel?:#buildsechoSending Slack notification to${channel}:${message}(${status})// 实际使用时需安装 Slack Notification PluginslackSend(channel:channel,message:message,color:color)}6.3 使用共享库的 JenkinsfileLibrary(my-shared-lib)_pipeline{agent any environment{APP_NAMEorder-serviceREGISTRYregistry.company.comSLACK_CHANNEL#ci-cd}stages{stage(完整 CI 流水线){steps{ciPipeline(appName:env.APP_NAME,registry:env.REGISTRY,runTests:true)}}}post{success{script{notifySlack(message:✅${env.APP_NAME}构建部署成功,status:SUCCESS,channel:env.SLACK_CHANNEL)}}failure{script{notifySlack(message:❌${env.APP_NAME}构建部署失败,status:FAILURE,channel:env.SLACK_CHANNEL)}}}}七、多环境配置驱动通过 JSON/YAML 配置表驱动多环境部署可以实现“一套代码多环境复用”。7.1 环境配置文件resources/environments.jsonjson{“dev”: {“namespace”: “dev”,“replicas”: 1,“cpu”: “200m”,“memory”: “256Mi”},“staging”: {“namespace”: “staging”,“replicas”: 2,“cpu”: “500m”,“memory”: “512Mi”},“prod”: {“namespace”: “production”,“replicas”: 3,“cpu”: “1000m”,“memory”: “1Gi”}}7.2 加载配置的函数vars/deployApp.groovy// vars/deployApp.groovydefcall(String env,String imageTag){// 读取环境配置defconfigJsonlibraryResourceenvironments.jsondefconfigreadJSON text:configJsondefenvConfigconfig[env]if(!envConfig){error环境${env}未在配置中定义}stage(部署到${env}环境){sh helm upgrade --install myapp ./chart \ --namespace${envConfig.namespace}\ --set image.tag${imageTag}\ --set replicaCount${envConfig.replicas}\ --set resources.limits.cpu${envConfig.cpu}\ --set resources.limits.memory${envConfig.memory}}}7.3 使用示例Library(my-shared-lib)_pipeline{agent any parameters{choice(name:ENV,choices:[dev,staging,prod],description:部署环境)}stages{stage(部署){steps{deployApp(params.ENV,env.BUILD_NUMBER)}}}}八、Shared Library 版本管理策略共享库本身也需要版本管理。推荐采用以下策略生产环境最佳实践生产环境的 Pipeline 应锁定到具体的 Git Tag确保变更不会意外影响生产部署。九、最佳实践总结共享库本身也要版本管理使用 Git Tag 标记每个稳定版本保持函数单一职责一个函数只做一件事便于组合和测试提供默认参数让函数在大多数场景下可以直接调用为共享库编写文档在仓库根目录添加 README.md在测试环境先验证共享库变更影响范围广先在测试分支验证使用 libraryResource 读取配置文件将配置与代码分离十、小结Jenkins Shared Library 让 Pipeline 代码从“复制粘贴”走向“复用共享”。通过将通用逻辑抽取到 Git 仓库中你可以消除重复代码统一维护和升级实现 Pipeline 的版本化管理Shared Library 是 Jenkins 高级用法的核心技能掌握它你就能构建出可维护、可扩展的企业级 CI/CD 体系。