当前位置: 首页 > news >正文

Jenkins Share Library教程 —— 高级实战与最佳实践教程

image

写在前面

搞了近一天的PPT,讲真写英文PPT,确实比中文难多了,中午都没休息,最后还是在同事的帮忙下才搞完。

值得说的是,我今天算是见到了,做PPT强的人,是真的强,从色彩搭配到一些图形选择上,真的很丝滑,没一点多余动作,我看他调PPT就像给我化妆一样,一点点的变好看了。

见证成品那一刻,我就真的有那种,“哇,居然可以这么好看的感觉!”,心生羡慕!


项目结构

经过昨天的学习,你现在已经掌握了基础的 Shared Library 概念,接下来我们直接进入 高级实战 + 最佳实践案例

我会一步步讲给你听,像带你写项目一样,所有代码都能直接放进 Jenkins 跑起来。

在你的共享库 Git 仓库中创建以下结构:

jenkins-shared-lib-advanced/
├── vars/
│   ├── ciPipeline.groovy
│   ├── notifySlack.groovy
│   ├── deployApp.groovy
├── src/org/example/
│   └── Utils.groovy
└── resources/templates/└── slackMessage.txt

我们会用这套结构完成:

  • 参数化构建
  • 错误处理(try/catch)
  • 构建 + 测试 + 部署 + 通知
  • 可重用 pipeline 封装

编写工具类

📄 src/org/example/Utils.groovy

package org.exampleclass Utils {static void printHeader(script, String msg) {script.echo "========== ${msg} =========="}static String getTimestamp() {return new Date().format("yyyy-MM-dd HH:mm:ss")}
}

说明:

  • 所有公共函数写这里(类似工具包)。
  • import org.example.Utils 即可调用。

Jenkinsfile 调用方式

@Library('my-shared-lib') _
import org.example.Utilspipeline {agent anystages {stage('Demo') {steps {script {Utils.printHeader(this, "开始构建")echo "时间:${Utils.getTimestamp()}"}}}}
}

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

image


Slack 通知函数(notifySlack.groovy)

📄 vars/notifySlack.groovy

// vars/sendSlack.groovy
def call(Map config = [:]) {def message = config.message ?: "Build finished"def status  = config.status  ?: "SUCCESS"def color   = config.color   ?: (status == "SUCCESS" ? "good" : "danger")def channel = config.channel ?: '#builds'echo "📢 Sending Slack message to ${channel}: ${message} (${status})"slackSend(channel: channel,message: message,color: color)
}

说明:

  • Jenkins要安装Slack Notification Plugin插件
  • config 是参数化对象,可传入 message、status 等。
  • 这里先用 echo 模拟发送 Slack 通知。

Jenkinsfile 调用方式

@Library('my-shared-lib') _pipeline {agent any// 可选:启用彩色日志options {ansiColor('xterm')  // 需要安装 AnsiColor 插件}environment {BUILD_TITLE = 'CI Pipeline'SLACK_CHANNEL = '#builds'}stages {stage('Build') {steps {script {echo "🏗️  Building..."// 实际构建命令// sh 'make build'}}}stage('Test') {steps {script {echo "🧪 Running tests..."// sh 'exit 1'  // 模拟失败,实际替换为 sh 'make test'}}}}post {always {script {def buildStatus = currentBuild.result ?: 'SUCCESS'def color = buildStatus == 'SUCCESS' ? 'good' : 'danger'def buildUrl = env.BUILD_URL  // 或 currentBuild.rawBuild.absoluteUrldef message = "Pipeline ${buildStatus}: <${buildUrl}|${env.JOB_NAME} #${env.BUILD_NUMBER}>"sendSlack(message: message,status: buildStatus,color: color)}}success {echo "\u001B[32m✅ ${env.BUILD_TITLE} 成功!\u001B[0m"}failure {echo "\u001B[31m❌ ${env.BUILD_TITLE} 失败!\u001B[0m"}}
}

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

image


部署函数(deployApp.groovy)

📄 vars/deployApp.groovy

def call(Map config = [:]) {def envName = config.env ?: 'staging'echo "🚀 Deploying application to ${envName}..."sh "echo 'Deploy to ${envName} successful!'"
}

Jenkinsfile 调用方式

@Library('my-shared-lib') _pipeline {agent anystages {stage('deploy') {steps {script {echo "🏗️  Building..."deployApp(envName: 'prod')}}}}}

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

image


核心封装 Pipeline

📄 vars/ciPipeline.groovy

import org.example.Utilsdef call(Map config = [:], Closure body = null) {pipeline {agent anyparameters {string(name: 'BRANCH', defaultValue: 'main', description: 'Git branch to build')choice(name: 'DEPLOY_ENV', choices: ['dev', 'staging', 'prod'], description: 'Environment to deploy')}stages {stage('Init') {steps {script {Utils.printHeader(this,"CI Started")echo "Branch: ${params.BRANCH}"}}}stage('Build') {steps {script {try {Utils.printHeader(this,"Build Stage")echo 'mvn clean install'} catch (err) {sendSlack(message: "Build failed!", status: "FAILURE")error("Build failed: ${err}")}}}}stage('Test') {steps {script {try {Utils.printHeader(this,"Test Stage")echo 'mvn compile test'} catch (err) {sendSlack(message: "Tests failed!", status: "FAILURE")error("Tests failed: ${err}")}}}}stage('Deploy') {when {expression { return params.DEPLOY_ENV != 'dev' }}steps {script {try {deployApp(env: params.DEPLOY_ENV)sendSlack(message: "Deployment to ${params.DEPLOY_ENV} successful")} catch (err) {sendSlack(message: "Deployment failed!", status: "FAILURE")error("Deployment failed: ${err}")}}}}stage('Custom Steps') {steps {script {if (body != null) {Utils.printHeader(this,"Running custom steps")body()}}}}}post {always {script {sendSlack(message: "Pipeline completed at ${Utils.getTimestamp()}",status: currentBuild.result ?: 'SUCCESS')}}}}
}

💡 功能亮点:

  • 支持 Jenkins 参数(BRANCH、DEPLOY_ENV)
  • 内置错误捕获与 Slack 通知
  • 可注入自定义阶段(body)
  • 自动后置通知(post always)

调用示例 Jenkinsfile

@Library('my-shared-lib') _
ciPipeline(env: 'prod') {stage('Custom Verification') {echo '🔍 Running custom security scan...'echo '"Scan complete."'}
}

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

image

image


最佳实践建议(超实用)

类别 最佳实践 说明
📁 目录结构 vars/ 放函数入口,src/ 放类 让代码更干净、易维护
🧱 命名规则 函数名用动词开头,如 deployApp()runTests() 一目了然
🔄 参数管理 Map config + 默认值方式 兼容性强
🧩 错误处理 try/catch + notifySlack 保证失败有反馈
🔔 通知 用 post 块统一收尾 防止遗漏通知
🧪 测试 本地用 Jenkinsfile Runner 测试 Shared Library 避免推错到主库
🧬 版本管理 用 tag 固定版本 @Library('lib@v1.2.0') 稳定性保障

写在最后

这也许是最近一直想做的事情把,把自己练习和所学,从语雀中移到博客来,坚持输出,如果可以我希望明天的阅读量是200,HH,比昨天强就行。

当然,最近也在尝试收心,收回自己的注意力和能量,虽然说不太明白,但是总体感觉算是舒服把,先甭管别的,感动自己再说吧!

最后,感谢屏幕前认真阅读的你,如果文章对您有帮助,老规矩,还请帮忙点赞转发,谢谢啦!

今天就到这里啦,晚安,好梦!

http://www.hskmm.com/?act=detail&tid=31189

相关文章:

  • qoj.6555 Sets May be Good 做题记录
  • 结构化数据自动生成文本技术解析
  • CSharp: Aspose.CAD 25.10 Convert DWG and DXF to PDF
  • vtk学习——Pipeline
  • 长沙四大名校x东方project
  • Rust 的英文数字验证码识别系统设计与实现
  • IOS开发 - UIViewController 界面控制基类解析
  • SpringBoot运维实用篇(YW-1.SpringBoot程序的打包与运行,YW-2.配置高级,YW-3.多环境开发,YW-4.日志) - a
  • CSP-S模拟31
  • Fortran 实现英文数字验证码识别系统
  • 10.14 NOIP 模拟赛 T1. HappyLovelyEveryday!
  • CSP-J 2025 入门级模拟赛 Day6 复盘 B. 罐の水表
  • 10.14每日总结
  • 四边形不等式
  • 20251014 杂题
  • 二叉树的遍历
  • SQL在智能自动化业务场景中的应用 - Irving11
  • 拼接字符串要求字典序最小
  • 高级语言作业第一次随笔
  • C#实现开机自启动应用多种方式
  • 日志|二叉树|110平衡二叉树|111二叉树的最大深度|199二叉树的右视图
  • Chrome在Speedometer 3.1创下历史最高分,为用户节省数百万小时
  • 西电CTF平台——Moectf 2025 WriteUP
  • [笔记]并查集进阶(带权、扩展域、带删除)
  • 20251013 模拟赛 总结
  • 什么是反应式编程 - 详解
  • SDL3和其附属的编译记录
  • Qwen多模态系列模型笔记—Qwen2-VL
  • WPF 调用 ChangeWindowMessageFilterEx 修改指定窗口 (UIPI) 消息筛选器的用户界面特权隔离
  • 实验1 现代C++基础课程