2. 共享库目录结构:vars、src、resources 的作用与规范

Jenkins 共享库的目录结构是版本准入的物理基础。一个标准共享库仓库包含三个顶层目录:vars、src 和 resources。每个目录承载不同职责,遵循不同的加载与作用域规则。理解这三者的分工,是设计可复用、可测试、可准入的共享库的前提。

核心原则: 三个目录分别对应“声明式全局变量”、“面向对象逻辑”和“静态资源”。版本准入策略需要针对每个目录的特性分别制定检查规则。

2.1 目录总览与职责对比

目录 核心职责 文件类型 加载时机 作用域
vars 声明式全局变量 / 流水线步骤 .groovy + .txt (帮助文档) 流水线解析时自动加载 全局 Pipeline 脚本
src Groovy 类 / 面向对象逻辑 .groovy (符合包路径) 按需 import 或实例化 类作用域
resources 静态资源文件 (模板、配置、脚本) 任意文件类型 通过 libraryResource 按需加载 文件内容读取
版本准入视角: vars 目录中的全局变量变更影响面最广,应作为准入检查的首要关注点;src 目录关注类接口兼容性;resources 目录关注文件完整性。
共享库三层目录结构及数据流向 共享库三层目录结构及数据流向 共享库仓库根目录 vars/ 全局变量 + 步骤 src/ Groovy 类 resources/ 静态资源 Pipeline DSL 直接调用 (如 buildDockerImage) import / new 实例化 (如 new Utils()) libraryResource 读取 (如 readJSON) 准入检查要点: vars → 签名与行为兼容性 | src → 类接口与包路径 | resources → 文件存在性与内容校验

2.2 vars 目录:全局变量与步骤定义

vars 目录是共享库最常用的入口。每个 .groovy 文件定义了一个全局变量或流水线步骤,文件名即变量名。文件内实现 call 方法,Pipeline 脚本可直接调用。

2.2.1 文件命名规范

  • 小写驼峰命名: 如 buildDockerImage.groovy、notifySlack.groovy。
  • 避免关键字冲突: 不要使用 Jenkins 内置步骤名(如 sh、echo、stage)。
  • 可选帮助文档: 同名 .txt 文件(如 buildDockerImage.txt)提供步骤说明,在 Jenkins Pipeline Syntax 中可见。

2.2.2 代码结构规范

// vars/buildDockerImage.groovy
def call(Map config = [:]) {
    // 参数校验
    String imageName = config.imageName ?: error("imageName is required")
    String dockerfile = config.dockerfile ?: 'Dockerfile'
    // 核心逻辑
    sh "docker build -t ${imageName} -f ${dockerfile} ."
}
版本准入风险: 修改 vars 中已有步骤的 call 方法签名(如增加必选参数、改变参数类型),会导致所有引用该步骤的流水线失败。准入检查必须包含签名兼容性检测。

2.3 src 目录:Groovy 类与面向对象封装

src 目录遵循标准 Groovy 包路径结构,用于封装复杂业务逻辑。类文件通过 import 语句引入,支持继承、接口、静态方法等面向对象特性。

2.3.1 目录与包路径规范

仓库路径 对应包名 导入语句
src/org/team/utils/VersionCheck.groovy org.team.utils import org.team.utils.VersionCheck
src/com/company/pipeline/DockerHelper.groovy com.company.pipeline import com.company.pipeline.DockerHelper

2.3.2 类设计规范

  • 单一职责: 每个类只封装一个领域逻辑,如版本校验、Git 操作、制品上传。
  • 显式构造函数: 避免使用隐式无参构造,明确参数依赖。
  • 静态方法 vs 实例方法: 工具类优先使用静态方法;需要状态管理的场景使用实例方法。
// src/org/team/utils/VersionCheck.groovy
package org.team.utils

class VersionCheck {
    static boolean isSemanticVersion(String version) {
        return version ==~ /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?$/
    }
}
版本准入建议: 对 src 目录中的公开方法进行接口契约测试。新增方法不影响已有调用,但修改或删除公开方法必须标记为破坏性变更。

2.4 resources 目录:静态资源管理

resources 目录存放流水线运行时需要的静态文件,如 JSON 配置文件、Shell 模板、YAML 定义等。通过 libraryResource 步骤按需加载。

2.4.1 典型使用场景

  • 配置模板: 如 resources/templates/deploy.yaml.tpl,在流水线中填充变量后使用。
  • 准入规则文件: 如 resources/rules/version-policy.json,定义版本准入策略。
  • 辅助脚本: 如 resources/scripts/pre-check.sh,在节点上执行。

2.4.2 加载方式

// 加载 resources 目录下的文件
def policy = libraryResource 'rules/version-policy.json'
def template = libraryResource 'templates/deploy.yaml.tpl'
版本准入注意: resources 目录中的文件变更不会触发编译错误,但可能导致运行时行为异常。准入检查应包含文件内容校验(如 JSON Schema 验证、YAML 语法检查)。
版本准入视角下的目录变更影响范围 版本准入视角下的目录变更影响范围 vars/ 全局步骤变更 src/ 类接口变更 resources/ 静态资源变更 影响范围:全局 所有引用该步骤的 Pipeline 影响范围:局部 仅 import 该类的 Pipeline 影响范围:运行时 按需加载时触发 准入策略:vars 签名检查 → src 接口兼容性检查 → resources 内容完整性检查

2.5 目录规范总结与准入检查清单

检查项 vars 目录 src 目录 resources 目录
命名规范 小写驼峰,无关键字冲突 包路径与目录一致 按功能子目录组织
签名兼容性 call 方法参数不可破坏性变更 公开方法签名不可删除或改参 不适用
文件完整性 每个 .groovy 文件必须包含 call 方法 类定义与文件名一致 文件存在性 + 格式校验
文档要求 推荐提供同名 .txt 帮助文件 推荐类级别注释 推荐使用说明注释
准入优先级 最高 高 中
实践建议: 在共享库仓库根目录放置 .jenkins-shared-library.yaml 配置文件,显式声明每个目录的版本策略、兼容性规则和准入检查开关,便于 CI/CD 流水线自动执行准入校验。