Jenkins Share Library开发入门(一)

news/2025/10/13 21:08:07/文章来源:https://www.cnblogs.com/longronglang/p/19139381

写在前面

今日心情有点小丧,但总体问题不大,有一些突然来的活,还没整完,明天再继续搞把。

有难度吗?

有一些把,我觉得还是要做一些自己不擅长的工作,才会有成长的吧,为什么?

用我们测试同学的话术,就是提升“自己”的“测试覆盖率”,即解决问题的能力,核心就是会了就是赚了!

学习目标

通过本教程,你将学会:

✅ 理解 Jenkins Shared Library 是什么
✅ 创建自己的共享库项目(Git 仓库)
✅ 在 Jenkinsfile 中调用共享库
✅ 实际运行一个示例流水线
✅ 能独立维护公司内部的通用 Jenkins 函数


一、什么是 Jenkins Shared Library?

可以把 Jenkins 比喻成一个“厨师”,而 Shared Library 就是一份“菜谱合集”。

在没有共享库时,每个 Jenkinsfile 都要写重复的步骤,比如:

pipeline {agent anystages {stage('Build') {steps {sh 'mvn clean install'}}stage('Test') {steps {sh 'mvn compile test'}}}
}

几百个项目要是都这样写的话,会非常麻烦。

于是我们可以把这些公共逻辑抽取出来放到一个“共享库”里,以后只要一句话就能复用。

也就是可以直接通过方法实现调用:

@Library('my-shared-lib') _
pipeline {agent anystages {stage('Build & Test') {steps {myPipeline.buildAndTest()}}}
}

这样,所有项目就能共享一套逻辑,方便统一管理和维护。


二、准备环境

你需要的环境

工具 说明
Jenkins 版本 >= 2.3(最好用 LTS)
Git 版本管理工具
一个 Git 仓库 用来存放共享库代码(GitHub / GitLab 都行)

三、创建共享库项目

在你的 Git 仓库中新建项目,例如:

https://github.com/yourname/jenkins-shared-lib-demo

项目结构如下:

jenkins-shared-lib-demo/
├── vars/
│   └── helloWorld.groovy
├── src/
│   └── org/example/Utils.groovy
└── resources/└── templates/email.txt

四、编写第一个共享函数

新建文件:vars/helloWorld.groovy

def call(String name = 'Jenkins') {echo "Hello, ${name}! Welcome to Shared Library!"
}

解释:

  • vars/ 目录下的每个 .groovy 文件会自动变成一个全局函数。
  • 文件名 helloWorld.groovy 就对应函数名 helloWorld()
  • def call(...) 是约定写法,表示默认执行逻辑。

五、在 Jenkins 中配置共享库

1️⃣ 打开 Jenkins → “系统管理” → “系统配置”

2️⃣ 滚动到 “Global Pipeline Libraries(全局流水线库)”

点击 “Add” 新建一条:

字段
名称 my-shared-lib(后面要引用这个名字)
Default version main(你的 Git 默认分支)
Source Code Management Git
Repository URL https://github.com/yourname/jenkins-shared-lib-demo.git

保存。


六、在 Jenkinsfile 中使用

在你的项目 Jenkinsfile 写:

@Library('my-shared-lib') _
pipeline {agent anystages {stage('Say Hello') {steps {helloWorld('软件测试君')}}}
}

运行后,你会在控制台输出看到:

[Pipeline] echo
Hello, 软件测试君! Welcome to Shared Library!

恭喜!你已经完成了第一个共享库调用!


七、进阶示例(模块化封装)

创建一个更实用的函数,比如构建 Maven 项目:

📁 vars/buildApp.groovy

def call(Map config = [:]) {stage('Build') {sh 'mvn clean install'}stage('Test') {sh 'mvn compile test'}if (config.deploy == true) {stage('Deploy') {echo "Deploying to ${config.env ?: 'staging'}..."}}
}

然后 Jenkinsfile:

@Library('my-shared-lib') _
pipeline {agent anystages {stage('CI Flow') {steps {buildApp(env: 'prod', deploy: true)}}}
}

八、实践练习

练习 1:

编写一个 notifySlack.groovy,当构建失败时自动通知 Slack。

提示:

def call(String message) {echo "Send Slack notification: ${message}"
}

练习 2:

src/org/example/Utils.groovy 编写工具类:

package org.exampleclass Utils {static String getTimestamp() {return new Date().format("yyyy-MM-dd HH:mm:ss")}
}

然后在 Jenkinsfile 调用:

@Library('my-shared-lib') _
import org.example.Utilspipeline {agent anystages {stage('Show Time') {steps {echo "Current time: ${Utils.getTimestamp()}"}}}
}

运行后,你会在控制台输出看到:

image


九、共享库版本管理

在企业项目中,你通常会:

  • 使用 Git tag 来发布共享库版本(例如 v1.0.0
  • 在 Jenkinsfile 中固定使用特定版本:
@Library('my-shared-lib@v1.0.0') _

这样能防止库更新影响旧项目。


恭喜你 ,到此Jenkins Share Library开发就算入门了。

写在最后

改一改自己懒惰的毛病,学起来,顺便也锻炼下自己的写作能力,没有什么华丽的辞藻了,只剩下热诚地坚持了!

最后,感谢您的观看,如文章对您有帮助,老规矩,点赞转发就哦了,如有疑问,欢迎文末留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十三篇

今天是10月13号,今天是满课,上午学习了栈的相关知识,下午学习了Java。

网络安全基础--第五课:跨站脚本攻击XSS - 实践

网络安全基础--第五课:跨站脚本攻击XSS - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

成员内部类

成员内部类在类的内部定义,与实例变量,实例方法同级别的类外部类的一个实例部分,创建内部类对象时必须依赖外部类对象Outer out = new Outer(); Inner in = out.new Inner();//外部类 public class Outer {//实例变…

用 Fortran 进行英文数字验证码识别

一、引言 Fortran 是历史最悠久的高级语言之一,广泛应用于数值计算与工程模拟。在验证码识别方面,尽管 Fortran 并不是图像处理或 OCR 的主流语言,但我们可以借助系统调用与外部 OCR 工具如 Tesseract 实现简单的验…

webpack优化前端性能

Webpack 优化前端性能主要从构建时优化和运行时优化两个维度进行。以下是全面的优化方案: 1. 代码分割与按需加载 1.1 动态导入 (懒加载) // React 路由懒加载 const Home = lazy(() => import(/* webpackChunkNam…

2025.10.13总结 - A

今天满课,生活充实且乏力。加油

洛谷版自我介绍

清华大学紫荆书院学生科学技术协会 (ZAST) 赛事部 副部长 Deputy Director of the Competition Department, Zijing Association of Science and Technology(ZAST), Tsinghua University 清华大学紫荆书院科协常年举办…

Windows五次shift漏洞复现

前言 当我们每次按五次shift之后都会弹出如下图所示的样式,在早期的windows7版本,就可以利用这个漏洞进行取得意想不到的效果。一、原理 我们可以给sethc进行改名,将本该启动sethc变成启动cmd,然后利用dos命令进行…

P8186 [USACO22FEB] Redistributing Gifts S 题解 - 符星珞

题目描述 FJ 有 \(N\) 个礼物给他的 \(N\) 头奶牛,这 \(N\) 个礼物和 \(N\) 头奶牛都分别按顺序被标记为从 \(1\) 到 \(N\) 的整数。每头奶牛都有一个愿望单,记录着一个含有 \(N\) 个礼物的排列。比起在愿望单中出现…

深入解析:个人用云计算学习笔记 --17(DNS 服务器)

深入解析:个人用云计算学习笔记 --17(DNS 服务器)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

Windows续

一、Windows 文件系统 1.1 文件系统基本概念 文件系统是操作系统用于明确存储设备或区分上的文件的方法和数据结构。 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 1.2 文件系统格式(…

uml九类例图详解

九种常见UML图(分类+图解) 九种常见UML图1.类图 概述 类图(Class Diagram)是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。 类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种…

继续学习,争取早日找到实习 - Irving11

关于SQL的一些经典实例 一、TOP n 1、路径问题: csv_path = "student_score.csv" df = pd.read_csv(r"D:\Pycharm\pythonProject3\student_score.csv") 文件路径里的 \ 在 Python 中被当作转义字…

悟空原创:零门槛编程?实现了!拖拉流程,支持窗口界面设计支持生成独立可执行程序

悟空原创:零门槛编程?实现了!拖拉流程,支持窗口界面设计支持生成独立可执行程序悟空原创:零门槛编程?实现了!拖拉流程,支持窗口界面设计支持生成独立可执行程序零门槛编程,不会写代码,只想简单拖拉图形控件就…

Keil MDK 将不同文件中的特定数据链接到同一位置

最近在一个STM32的项目中,为了方便现场调试的抓取一些运行数据,就想在项目中增加类似于 linux 的串口终端,实现一些基本命令行的调试命令。本着开源优先的原则,一通搜索,最终选定了 xcmd 这个开源库。 XCMD 介绍 …

详细介绍:用于水管和污水管道巡检机器人的同步定位与建图综述

详细介绍:用于水管和污水管道巡检机器人的同步定位与建图综述2025-10-13 20:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

1013日总结

今天把作业写了一点,也就是界面那一块。 写了1000行左右,但还是有问题--前端数据反馈不到后端,明天我再看看。

C语言自学--自定义类型:结构体 - 指南

C语言自学--自定义类型:结构体 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

2025公众号排版效率榜:5款AI工具实测对比,从排版到分发一站搞定

作为新媒体运营者,你是否也曾经历过这些场景:花2小时排版一篇公众号文章,换平台发布时格式错乱需重新调整;追热点时选题慢半拍,配图担心版权风险;团队协作时版本混乱,分发10个平台重复操作到深夜?2025年,随着…

完整教程:R语言——离群点检测应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …