第46章|Jenkins Pipeline 2:共享库(Shared Library)与复用

上一章把流水线写进仓库;本章把全公司的套路写进另一个仓库—— Shared Library 像团队共用的工具箱 + 施工规范:封装标准阶段、统一通知、集中修一次、全项目受益。 你会搞清 vars/src/ 分工、如何在 Jenkins 里注册与版本化库,以及治理里绕不开的兼容性与信任边界。

Layout

Repo shape

  • vars/ steps
  • src/ classes
  • resources/
Wire-up

Global lib

  • SCM retriever
  • @Library
  • default version
Govern

Ship safe

  • semver tags
  • trusted flag
  • tests & rollout

1. 为什么需要共享库?

复制粘贴 Jenkinsfile 的坏处是指数级的:一处改安全策略要改一百个仓库;通知渠道、制品上传、质量门禁各自分叉。 共享库把共性抽到 Groovy 组件里,业务仓库只保留差异参数(语言版本、artifact 名、环境列表)。 代价是:你维护的是内部平台产品,需要版本语义、发布说明与向后兼容策略。

One library · many pipelines Shared Library Git tag v2.3.0 vars · src · resources service-a service-b mobile data job Change once in library → roll forward with tags; pin version per team when needed
图 1:共享库是“上游依赖”;业务仓是“调用方”——心态上要当内部开源项目维护。

2. 目录结构:vars/src/resources/

// vars/standardPipeline.groovy — simplified
def call(Map cfg) {
  pipeline {
    agent { label cfg.agentLabel ?: 'linux' }
    stages {
      stage('Build') {
        steps { sh cfg.buildCommand ?: './mvnw -B package' }
      }
    }
  }
}
// Jenkinsfile in an application repo
@Library('team-pipeline-lib@2.3.0') _

standardPipeline(
  agentLabel: 'docker && jdk17',
  buildCommand: './mvnw -B -DskipTests package'
)
注意:@Library('name@ref')ref 可以是分支、tag 或 commit; 生产建议钉死 tag或经测试的分支,避免“共享库 main 一推送,全员流水线语义突变”。

3. 在 Jenkins 中注册:Global Pipeline Libraries

管理员在 Manage Jenkins → System → Global Pipeline Libraries 添加:名称(供 @Library 引用)、默认版本、SCM、凭据。 可勾选 Allow default version to be overridden、以及是否信任库(影响沙箱与加载行为,详见官方文档)。 团队应把库名、推荐版本、升级流程写进内部文档。

Load path at build start Git (library repo) tag v2.3.0 immutable ref preferred Jenkins controller resolve @Library → checkout → compile classpath for this build only trusted vs untrusted rules apply Pipeline run standardPipeline() available org.team.* classes importable
图 2:每次构建按需解析库版本——把“依赖升级”当成发布事件。

4. 版本治理:语义化与渐进 rollout

推荐对共享库打 Git tagvMAJOR.MINOR.PATCH):破坏性变更升主版本;新 stage 默认向后兼容。 可先让少数仓库在 @Library('lib@feature-xyz') 验证,再推广默认版本。 维护 CHANGELOG迁移指南,比口头通知可靠一个数量级。

5. 测试共享库

Rollout waves v3.0.0-rc1 canary repos v3.0.0 platform team default bump all repos Breaking change in call() signature → major bump + migration doc
图 3:像发布 SDK 一样发布共享库—— waves 降低“周五下午全员爆红”。

6. 反模式与风险

反模式 后果
默认跟踪 main 且不钉版本 上游小改引发大规模流水线失败
在库里藏环境特定 IP / 密钥 泄露面扩大;应走凭据与配置注入
巨型上帝步骤(几千行 call 难测难改;应拆类 + 资源文件
跳过评审直接推库 供应链风险;与“信任库”设置冲突
Internal layering (keep vars thin) vars/ — thin entry · parameter validation · pipeline {} glue src/ — domain Groovy (builders, policies, parsers) resources/ — templates, shell snippets, policy JSON (libraryResource)
图 4:vars 像门面;复杂逻辑下沉到 src,资源外置——测试与复用都更轻松。

7. 本章清单

  1. 新建 Git 仓库,按 vars/ + src/ 搭骨架,提交最小可调用步骤。
  2. 在 Jenkins 注册 Global Pipeline Library,用 @Library 从试验项目引用 tag。
  3. 写 CHANGELOG 与升级策略;破坏性变更走 major 版本。
  4. 配置评审分支保护与只读默认权限;敏感操作走双人批准。
  5. 预告下一章:共享库跑在哪种 agent 上——容器与 Kubernetes 弹性。
← 上一章:Pipeline 与 Jenkinsfile 下一章:Agents 与容器 →