主题
SharedLibrary共享库
一、共享库概述
1.1 什么是共享库
Jenkins共享库(Shared Libraries)是一种可重用的Groovy代码集合,允许您在多个Jenkins Pipeline中共享和重用代码。共享库可以包含Pipeline步骤定义、工具类、辅助函数等,有助于标准化CI/CD流程并减少重复代码。
共享库本质上是一个独立的Git仓库,包含结构化的目录和Groovy脚本文件,可以被多个Jenkins Pipeline作业引用和使用。Jenkins Pipeline 可以保存在 Git 仓库中,可以由运维人员/QA人员 或CI/CD工具自动更新,从而实现代码的集中管理和版本控制。
1.2 为什么要使用共享库
使用Jenkins共享库的主要优势包括:
- 代码复用:避免在多个Pipeline中重复编写相同的代码逻辑
- 标准化流程:确保所有项目遵循相同的构建、测试和部署标准
- 集中式管理:在一个地方维护和更新共享功能,所有Pipeline自动获得更新
- 版本控制:共享库代码可以进行版本控制,支持不同版本的并行使用
- 降低维护成本:减少重复代码,降低维护难度和错误风险
- 提高开发效率:团队可以专注于项目特定的配置,而不是基础设施代码
- 促进最佳实践:将经过验证的最佳实践封装到共享库中,供所有项目使用
1.3 共享库的结构
Jenkins共享库遵循特定的目录结构,主要包含以下三个关键目录:
- src目录:包含标准的Java/Groovy源文件,可以在Pipeline中导入和使用的类,比如封装的函数、类等
- vars目录:包含全局可访问的脚本文件,每个
.groovy
文件定义一个全局变量 - resources目录:包含非Groovy文件,如JSON、YAML、文本模板等资源文件
典型的共享库结构示例:
+- src # Java/Groovy类文件
| +- org
| +- example
| +- Utils.groovy # org.example.Utils类
+- vars # 全局变量脚本
| +- buildJava.groovy # buildJava变量/函数
| +- deployToK8s.groovy # deployToK8s变量/函数
| +- scanSonar.groovy # scanSonar变量/函数
+- resources # 资源文件
| +- templates # 模板目录
| +- deployment.yaml # Kubernetes部署模板
1.4 共享库的定义
共享库中的代码可以通过多种方式定义和组织:
1. 全局变量(vars目录):
- 每个
.groovy
文件定义一个全局可访问的变量 - 通常实现为函数或闭包,可以直接在Pipeline中调用
- 可以包含
call()
方法,使脚本可以像函数一样被调用 - 流水线模板
2. 类文件(src目录):
- 遵循标准的Java/Groovy类定义
- 可以在Pipeline中通过
import
语句导入 - 适合复杂的逻辑和可重用的组件
3. 资源文件(resources目录):
- 可以通过
libraryResource
步骤在Pipeline中加载 - 适用于配置文件、模板和其他非代码资源
1.5 如何在 Jenkins 中配置共享库
在Jenkins中配置共享库需要以下步骤:
1. 创建共享库Git仓库:
- 创建一个包含正确目录结构的Git仓库
- 添加必要的Groovy脚本和资源文件
- 推送到可访问的Git服务器(如GitLab、CNB等)
2. 在Jenkins中配置共享库:
- 进入
Jenkins管理 > 系统配置 > Global Pipeline Libraries
- 点击
Add
添加新的库配置 - 填写以下信息:
- Name:库的名称(注意这个名称后续在Jenkinsfile中引用)
- Default version:默认使用的分支或标签(如main)
- Retrieval method:选择Modern SCM > Git
- Project repository:Git仓库URL
- Credentials: 提供访问仓库的凭证
1.6 共享库使用
共享库的调用方法
groovy
//加载mylib共享库
@Library('mylib’)
//加载mylib共享库的1.0(分支)版本
@Library('mylib@1.0’)
//加载多个共享库,mylib共享库的默认版本,yourlib共享库的2.0版本(分支)
@Library(['mylib', 'yourlib@2.0'])
在Pipeline中使用共享库有多种方式:
1. 在Jenkinsfile中声明和使用共享库:
groovy
// 引入共享库(确保共享库名称"mylib"已在Jenkins系统配置中正确设置)
@Library("mylib") _
def devOpsUtils = new org.devops.demo()
pipeline {
agent any
stages {
stage("run") {
steps {
script {
// 定义用户数据(根据你的实际需求调整)
def users = [
[id: 1, name: "admin"],
[id: 2, name: "jenkins_user"],
[id: 3, name: "test_user"]
]
// 调用GetUserNameByID函数(传入id和users参数)
def userId = 2
def userName = devOpsUtils.GetUserNameByID(userId, users)
println "用户ID ${userId} 对应的用户名是:${userName}" // 输出:用户ID 2 对应的用户名是:jenkins_user
}
}
}
}
}
创建一个JOB
运行JOB