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

Jenkins运维之路(初次调试共享库)

前面的章节基本上已经把流水线基本模板都做出来了,现在Jenkinsfile已经都放置在了git上进行统一管理,但是每次新建流水线的时候都要去复制粘贴一份那么长的流水线实在太长了,可读性也不是很好,所以这次将一些流水线中共性的东西抽离到共享库中,以减少流水线中的冗余代码,同时也能增强复用性。

1. 共享库创建

1.1 目录结构

# 这里的目录结构src vars resource是参考官方建立的
tree  ops-share-librarya       ├── Ansible # Ansible部署脚本
├── Jenkinsfile # 用于存放流水线
├── Readme.md
├── resources  # 一般用于存放静态资源文件,这些文件可以在构建或运行时被访问和使用
│   ├── config
│   ├── Readme.md
│   ├── scripts
│   ├── static
│   └── templates
├── src   # 业务逻辑一般都在这里编写
│   └── org
│       └── devops
└── vars # 定义全局变量和函数,这些变量和函数可以在不同的 Jenkins Pipeline 中共享和重用。└── Readme.md

1.2 Jenkins引用Git上的共享库资源

image-20250922105847114

image-20250922105847114

2.定义方法&引用

2.1 直接定义方法并在jenkins中引用

//在代码库中创建一个测试方法
//src/org/devops/test.groovy
package org.devops
def PrintMes(){println "PrintMes"
}
def PrintError(){println "PrintError"
}//JenkinsPipeline中引用
@Library('ops-share-librarya@master') _  //引入共享库
def test = new org.devops.test()  //定义个对象并传入变量中
pipeline {stages {stage('Check requirement') {steps {script {// 调用org.devops.test()也就是test中的方法test.PrintMes()test.PrintError()}}}}//流水线运行结果
[Pipeline] echo
13:41:15  PrintMes
[Pipeline] echo
13:41:15  PrintError

2.2 定义类并在jenkins中引用

//在代码库中创建一个Utils测试类
//src/org/devops/Utils.groovy
package org.devopsclass Utils {//静态方法可以在pipeline引入后直接用类名+方法直接调用 全局为一static def createVersionStaticId(buildId) {return "${new Date().format('yyyyMMddHHmmss')}_${buildId}"}//普通方法在pipeline中引用后需要创建对象进行引用new ,不同的对象拥有自己的状态def createVersionId(buildId) {return "${new Date().format('yyyyMMddHHmmss')}_${buildId}"}
}//JenkinsPipeline中引用
@Library('ops-share-librarya@master') _  //引入共享库
import org.devops.Utils  //导入测试类pipeline {stages {stage('Check requirement') {steps {script {//调用静态方法,注意静态方法是可以直接通过类名+方法的方式来进行调用的//def version = Utils.createVersionStaticId(env.BUILD_ID.toString())def version = Utils.createVersionStaticId(env.BUILD_ID)echo "Generated version: ${version}"//-----------------------------------------------//调用普通方法 ,必须要先创建实例才能使用def utils = new org.devops.Utils()  // 创建 Utils 类的实例 utils//def instanceVersionId = utils.createVersionId(env.BUILD_ID.toString())def instanceVersionId = utils.createVersionId(env.BUILD_ID) //调用示例,传入参数来生成IDecho "Instance Version ID: ${instanceVersionId}"}}}}// 引用后的输出
[Pipeline] echo
14:07:53  Generated version: 20250922140753_33
[Pipeline] echo
14:07:53  Instance Version ID: 20250922140753_33

3.实际案例

上一章中我们在流水线中定义了Nexus的上传操作,这里我们就以这个操作来展现下共享库的好处

3.1 创建上传方法

package org.devops
def NexusUpload(){// 使用之前生成的 version 变量nexusArtifactUploader artifacts: [[artifactId: 'basejar', // 替换为您的 artifactIdclassifier: '',file: 'target/spring-boot-3-hello-world-1.0.0-SNAPSHOT.jar', // 替换为您的文件路径type: 'jar' // 根据您的文件类型进行修改],[artifactId: 'basejar', // 同样的 artifactId,或根据需要修改classifier: 'pom',file: 'pom.xml', // 指向您的 pom.xml 文件type: 'pom' // 文件类型为 pom]],//文件file类型有jar,pom,war,zip,tar.gzcredentialsId: 'Nexus3-DevOps',groupId: 'top.xxx',nexusUrl: 'registryv.xxx.top',nexusVersion: 'nexus3',protocol: 'https',repository: 'DevopsArtifact',version: "v8"
}

image-20250922182654605

image-20250922182654605

3.2 Pipeline中引用方法

#!groovy
@Library('ops-share-librarya@master') _
def createVersion() {// 创建了一个方法createVersion()// 定义一个时间戳+构建ID作为版本号,为tag使用return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}
pipeline {
//省略......stages {//省略......//调用方法stage('Upload to Nexus') {steps {script {def nexustest = new org.devops.nexus()nexustest.NexusUpload()}}}}post {//省略......}
}

image-20250922183313387

image-20250922183313387

image-20250922183935203

image-20250922183935203

3.3 流水线引用方法前后对比

通过对比可以看出,将流水线中一些公用的操作,抽出来作为一个方法可以减少很多不必要的重复过程,同时也能增加其他流水线的组件过程。

image-20250922183615676

image-20250922183615676

重点说一下,这里只是展示下定义方法的好处,能够抽离一些通用的步骤作为方法,在后面的流水线中引用,减少重复编写,现在展示的里面很多的值都是固定的,如果你是要进行生产上的部署还是要有很多参数要改为变量的方式,同时你的方法可能也会需要各种传参。

http://www.dtcms.com/a/398442.html

相关文章:

  • 离线下载npm包
  • 【UE5.6.1】UE5初学者教程学习笔记:编辑器操作 (1-7集)
  • 伊春seo公司seo网站页面诊断
  • Spring依赖注入:@Resource与@Autowired详解及避免空指针的最佳实践
  • 52Hz——FreeRTOS学习笔记——延时函数
  • 阿里巴巴做网站教程免费网站模板下载大全下载
  • 贪心算法之分数背包问题
  • LLMs之AgentDevP:FastGPT的简介、安装和使用方法、案例应用之详细攻略
  • 贪心算法之船舶装载问题
  • 面试_常见大厂面试题
  • 网站地图怎么建设wordpress文章页样式修改
  • 网站如何做交互热门seo推广排名稳定
  • 【第29话:路径规划】自动驾驶启发式搜索算法(A星搜索算法( A* 搜索算法))详解及代码举例说明
  • React学习教程,从入门到精通,React Router 语法知识点及使用方法详解(28)
  • Docker Compose 从入门到实践
  • D3.js 与数据可视化
  • RNA-seq分析之最佳cutoff(TCGA版)
  • 浏览器直接进入网站的注意事项钢筋网片价格
  • scrapy-redis项目:爬取某网站图书信息
  • (论文速读)DiffBlender:可组合和通用的多模态文本到图像扩散模型
  • 第三方网站测试工具:【Postman使用基础指南】
  • Pytest+requests进行接口自动化测试5.0(5种assert断言的封装 + pymysql)
  • C# MVC 模型绑定全解析:从基础机制到自定义绑定器实战指南
  • 企业网站网页设计专业的团队网站建设
  • 网站建设可上传视频的wordpress 数据库类型
  • 广州南沙区建设和交通局网站个人建立网站要多少钱
  • Vue3 》》vite》》vite-plugin-mock mock 模拟数据 ,loadEnv
  • 宝塔面板搭建RustDesk教程:告别命令行,一键拥有私有远程桌面
  • Docker + IDEA 一键部署!
  • Rust开源HyperSwitch实战指南