2. 共享库目录结构:vars、src、resources 的作用与规范
Jenkins 共享库的目录结构是版本准入的物理基础。一个标准共享库仓库包含三个顶层目录:vars、src 和 resources。每个目录承载不同职责,遵循不同的加载与作用域规则。理解这三者的分工,是设计可复用、可测试、可准入的共享库的前提。
核心原则: 三个目录分别对应“声明式全局变量”、“面向对象逻辑”和“静态资源”。版本准入策略需要针对每个目录的特性分别制定检查规则。
2.1 目录总览与职责对比
| 目录 | 核心职责 | 文件类型 | 加载时机 | 作用域 |
|---|---|---|---|---|
vars |
声明式全局变量 / 流水线步骤 | .groovy + .txt (帮助文档) |
流水线解析时自动加载 | 全局 Pipeline 脚本 |
src |
Groovy 类 / 面向对象逻辑 | .groovy (符合包路径) |
按需 import 或实例化 |
类作用域 |
resources |
静态资源文件 (模板、配置、脚本) | 任意文件类型 | 通过 libraryResource 按需加载 |
文件内容读取 |
版本准入视角:
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 语法检查)。
2.5 目录规范总结与准入检查清单
| 检查项 | vars 目录 | src 目录 | resources 目录 |
|---|---|---|---|
| 命名规范 | 小写驼峰,无关键字冲突 | 包路径与目录一致 | 按功能子目录组织 |
| 签名兼容性 | call 方法参数不可破坏性变更 | 公开方法签名不可删除或改参 | 不适用 |
| 文件完整性 | 每个 .groovy 文件必须包含 call 方法 | 类定义与文件名一致 | 文件存在性 + 格式校验 |
| 文档要求 | 推荐提供同名 .txt 帮助文件 | 推荐类级别注释 | 推荐使用说明注释 |
| 准入优先级 | 最高 | 高 | 中 |
实践建议: 在共享库仓库根目录放置
.jenkins-shared-library.yaml 配置文件,显式声明每个目录的版本策略、兼容性规则和准入检查开关,便于 CI/CD 流水线自动执行准入校验。