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

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

1. 共享库创建

1.1 目录结构

bash 复制代码
# 这里的目录结构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

2.定义方法&引用

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

bash 复制代码
//在代码库中创建一个测试方法
//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中引用

bash 复制代码
//在代码库中创建一个Utils测试类
//src/org/devops/Utils.groovy
package org.devops

class 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) //调用示例,传入参数来生成ID
                  	echo "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 创建上传方法

bash 复制代码
package org.devops
def NexusUpload(){
    // 使用之前生成的 version 变量
    nexusArtifactUploader artifacts: [
                        [
                            artifactId: 'basejar', // 替换为您的 artifactId
                            classifier: '',
                            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.gz
    credentialsId: 'Nexus3-DevOps',
    groupId: 'top.xxx',
    nexusUrl: 'registryv.xxx.top',
    nexusVersion: 'nexus3',
    protocol: 'https',
    repository: 'DevopsArtifact',
    version: "v8"
}

image-20250922182654605

3.2 Pipeline中引用方法

bash 复制代码
#!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-20250922183935203

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

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

image-20250922183615676

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

相关推荐
数据库学啊7 小时前
团队小希望运维简单,时序数据库选型有什么推荐?
运维·数据库·时序数据库
霍格沃兹软件测试开发7 小时前
Playwright MCP浏览器自动化指南:让AI精准理解你的命令
运维·人工智能·自动化
郝学胜-神的一滴8 小时前
Linux命名管道:创建与原理详解
linux·运维·服务器·开发语言·c++·程序人生·个人开发
wanhengidc8 小时前
云手机性能如何?
运维·服务器·科技·智能手机·云计算
智者知已应修善业8 小时前
【51单片机普通延时奇偶灯切换】2023-4-4
c语言·经验分享·笔记·嵌入式硬件·51单片机
wan_da_ren9 小时前
Docker安装Elasticsearch9.2.1与Kibana9.2.1 保姆教程(带验证版)
运维·docker·jenkins
Hellc0079 小时前
Docker部署BaGet私有NuGet服务器:从入门到备份恢复完整指南 二
服务器·docker·eureka
t***316510 小时前
Docker 之mysql从头开始——Docker下mysql安装、启动、配置、进入容器执行(查询)sql
sql·mysql·docker
Eric.Lee202110 小时前
ubuntu 安装 Miniconda
linux·运维·python·ubuntu·miniconda
杭州泽沃电子科技有限公司10 小时前
在线监测:为医药精细化工奠定安全、合规与质量基石
运维·人工智能·物联网·安全·智能监测