Skip to content

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

最近更新

采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟