Jenkins Shared Library 连载学习笔记 · 第 1 天
📚 今日主题:共享库概念入门与目录规范
一、理论知识点
1.1 什么是 Jenkins Shared Library?
Jenkins Shared Library(共享库)是一种代码复用机制,允许将通用的流水线逻辑、函数、类封装成可复用的代码模块,在多个 Pipeline 项目中共享调用。
核心价值:
- ✅ 消除流水线代码重复
- ✅ 统一团队 CI/CD 规范
- ✅ 降低维护成本
- ✅ 实现流水线即代码(Pipeline as Code)
1.2 共享库目录规范(标准结构)
shared-library/
├── vars/ # 全局变量/函数目录
│ ├── deploy.groovy # 可直接在 Pipeline 中调用的函数
│ ├── notify.groovy
│ └── kubernetesBuild.groovy
├── src/ # Groovy 源代码目录
│ └── com/
│ └── example/
│ └── utils/
│ ├── GitHelper.groovy # 可导入的类
│ └── DockerHelper.groovy
├── resources/ # 静态资源文件
│ └── config/
│ └── jenkins-config.yaml
└── test/ # 单元测试目录
└── vars/
└── deployTest.groovy
目录作用对比:
| 目录 | 调用方式 | 适用场景 | 沙箱限制 |
|---|---|---|---|
vars/ |
直接调用 deploy() |
简单函数、流水线步骤封装 | 受沙箱限制 |
src/ |
import 后调用 |
复杂逻辑、工具类 | 不受沙箱限制 |
resources/ |
libraryResource 加载 |
配置文件、模板 | 只读访问 |
二、实操步骤
2.1 配置共享库(Jenkins 全局配置)
路径: 系统管理 → 系统配置 → 全局流水线共享库
yaml
名称:my-shared-library
默认版本:main
源代码管理:Git
项目仓库:https://git.example.com/devops/shared-library.git
2.2 编写第一个共享库函数(vars/deploy.groovy)
groovy
// vars/deploy.groovy
// 可在 Pipeline 中直接通过 deploy() 调用
def call(Map config = [:]) {
// 参数校验
def environment = config.env ?: 'dev'
def appName = config.appName ?: 'unknown'
echo "🚀 开始部署应用:${appName} 到环境:${environment}"
// 部署逻辑
stage('Deploy') {
sh """
echo "部署到 ${environment} 环境"
echo "应用名称:${appName}"
"""
}
echo "✅ 部署完成"
}
return this
2.3 在 Pipeline 中调用共享库
groovy
// Jenkinsfile
@Library('my-shared-library') _
pipeline {
agent any
stages {
stage('部署测试') {
steps {
script {
// 调用共享库函数
deploy(env: 'test', appName: 'user-service')
}
}
}
}
}
2.4 编写 src 目录工具类(src/com/example/utils/GitHelper.groovy)
groovy
// src/com/example/utils/GitHelper.groovy
package com.example.utils
class GitHelper implements Serializable {
def script // 注入 Pipeline script 上下文
GitHelper(script) {
this.script = script
}
/**
* 获取当前 Git 分支名
*/
def getBranchName() {
return script.sh(script: 'git rev-parse --abbrev-ref HEAD', returnStdout: true).trim()
}
/**
* 获取 Git 提交哈希
*/
def getCommitHash() {
return script.sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
}
}
return this
2.5 在 Pipeline 中导入并使用 src 类
groovy
// Jenkinsfile
@Library('my-shared-library') _
import com.example.utils.GitHelper
pipeline {
agent any
stages {
stage('获取 Git 信息') {
steps {
script {
def gitHelper = new GitHelper(this)
echo "当前分支:${gitHelper.getBranchName()}"
echo "提交哈希:${gitHelper.getCommitHash()}"
}
}
}
}
}
三、生产踩坑清单
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 共享库加载失败 | 仓库权限不足 | 配置 Jenkins 凭据,使用 SSH/HTTPS+Token |
| vars 函数无法调用 | 未使用 @Library 注解 |
确保 Jenkinsfile 首行添加 @Library('xxx') _ |
| src 类导入报错 | 包路径与目录不匹配 | 确保 src/com/example/ 与 package com.example 一致 |
| 流水线执行缓慢 | 共享库每次重新克隆 | 配置共享库缓存,使用浅克隆 |
| 变量作用域问题 | 闭包内变量未序列化 | 实现 Serializable 接口 |
四、深度进阶对比
⚠️ 说明: 本日为连载第 1 天,无前一日学习内容,对比模块从第 2 天开始启用。
今日学习定位
| 维度 | 当前阶段 |
|---|---|
| 难度等级 | ⭐ 概念入门 |
| 核心能力 | 会调用共享库函数 |
| 知识边界 | 目录结构、基础配置、简单函数封装 |
| 下一步方向 | 代码开发(闭包、参数传递、@NonCPS) |
思维模式升级路线
第 1 天:会调用 → 第 2-3 天:会开发 → 第 4-5 天:会架构 → 第 6-7 天:会优化
五、今日练习任务
- ✅ 在测试 Jenkins 环境配置一个共享库
- ✅ 创建
vars/hello.groovy,编写一个输出问候语的函数 - ✅ 编写一个 Pipeline 调用该函数
- ✅ 尝试在
src/目录创建一个工具类并导入使用
六、明日预告
第 2 天主题: 闭包与参数传递机制
核心内容:
- Groovy 闭包在共享库中的应用
- 参数传递的多种模式(Map、Closure、默认值)
@NonCPS注解的使用场景与限制- 闭包序列化问题排查
📌 学习建议: 建议搭建本地 Jenkins 测试环境,所有代码示例亲自运行验证,记录执行日志与报错信息,形成个人知识库。