Jenkins使用共享库封装pipeline代码

之前有一个需求,是要在Jenkins的流水线中,调用相关的SDK去执行业务业务逻辑,而且调用SDK会有签名、返回值校验等逻辑

我想将SDK的调用逻辑封装起来,只提供一个入口,而且需要提供一些复用的方法,类似下文这样

scss 复制代码
pipeline {
        agent any
        stages {
            stage('调用sdk') {
                steps {
                    result = sdk.method(param1,param2)
                    if(result.code != 200){
                        error "fail"
                    }
                    var body = toJson(result.body)
                }
            }
        }
    }

可以将代码写到一个库中,然后Jenkins引用这个库达到这个效果

www.jenkins.io/doc/book/pi...

共享库(Shared libraries)是一种可以用来封装函数、变量甚至整个 Pipeline 的机制。通过共享库,可以将常用的功能和流程逻辑定义在单独的 Groovy 脚本中,然后在多个 Pipeline 中重复使用,从而实现代码重用和统一管理

使用方式

less 复制代码
//引入库
@Library('lib')
import com.mycorp.pipeline.somelib.Helper'

//加 _ 就不用import
@Library('lib') _
//使用
def method = new com.mycorp.pipeline.Utils.someStaticMethod()

简单使用

比如说我想复用将返回结果转换成json的方法,这样就可以在多个pipeline中复用

java 复制代码
//tool.groovy
import groovy.json.JsonSlurper

def toJson(result){
    def jsonSlurper = new JsonSlurper()
    return jsonSlurper.parseText(result)
}

//流水线
 steps {
   script {
        var result = callSdk()
        def body = tool.toJson("${result.body}")
   }
 }

封装stage,比如说我这个stage的功能就是调用SDK

scss 复制代码
//callSdk.groovy
def callSdk(param1, param2) {
    var sdk = new sdk();
    var sign = ....;
    var result = sdk.method(sign,param1,param2);
    if(result == ...)
    ...
}
//流水线
@Library('my-shared-library') _
pipeline {
    agent any
    stages {
        stage('My Stage') {
            steps {
                script {
                    callSdk(param1: 'value1', param2: 'value2')
                }
            }
        }
    }
}

封装变量,比如不同环境的变量

ini 复制代码
// test.groovy
def url = 'test.com'


// dev.groovy
def url = 'dev.com'

//流水线
steps {
    script {

        if (env == 'test') {
            config = load 'test.groovy'
        } else if (env == 'dev') {
            config = load 'url.groovy'
        }

        // 使用变量
        def url = config.url
        callSdk(url)
    }
}

可以通过在共享库根目录创建Jenkinsfile,来动态加载pipeline模板

typescript 复制代码
//Jenkinfile
@Library('[email protected]') _

def env = 'dev' // 环境

//通过参数调用不同的流水线脚本
if (env == 'dev') {
    deployPipeline = libraryResource('deployDev.groovy')
} else if (env == 'test') {
    deployPipeline = libraryResource('deployTest.groovy')
} else {
    echo "Unsupported environment: ${env}"
}

deployPipeline(appName: 'my-app', deploy: true)

// deployDev.groovy
def deployPipeline(Map params) {
    pipeline {
        agent any
        stages {
            stage('Deploy to Dev') {
                when {
                    expression { params.deploy == true }
                }
                steps {
                    sh 'echo "Deploying ${params.appName} to Dev environment..."
                }
            }
        }
    }
}

// deployTest.groovy
def deployPipeline(Map params) {
    pipeline {
        agent any
        stages {
            stage('Deploy to Test') {
                when {
                    expression { params.deploy == true }
                }
                steps {
                    sh 'echo "Deploying ${params.appName} to Test environment..."'
                }
            }
        }
    }
}

通过共享库,可以将复杂的流水线拆分,可以复用函数和动态组合等等,非常灵活

项目结构

erlang 复制代码
project/
├── Jenkinsfile
└── my-shared-library/
    ├── vars/
    │   ├── deployPipeline.groovy
    │   └── ...
    ├── src/
    │   ├── com/
    │   │   ├── example/
    │   │   │   ├── MyClass.groovy
    │   │   │   └── ...
    │   │   └── ...
    │   └── ...
    ├── resources/
    │   ├── deployDev.groovy
    │   ├── deployTest.groovy
    │   └── ...
    └── README.md

vars/ 目录用于存放定义全局变量和流程函数的 Groovy 文件,比如上边复用的函数和封装step的函数

resources/ 目录用于存放资源文件,比如环境变量、配置文件等。比如上边的变量文件

src/ 目录用于存放如自定义的类、函数等,一般是写更复杂的类

需要注意的是vars下的groovy可以使用 Jenkins Pipeline的语法,比如echo、error等函数,在src下,只能写groovy语法的函数

src和resources都可以被vars调用

bash 复制代码
// 使用 load 方法加载 src/com/example/MyClass.groovy
load 'com/example/MyClass.groovy'

// 在 vars/deployPipeline.groovy 中调用 resources/deployDev.groovy
libraryResource 'my-shared-library/deployDev.groovy'

配置共享库

首先要将共享库上传到代码仓库中,Jenkins会拉取共享库并编译加载注意,在jenkins也要安装对应的scm插件

在系统配置中找到Global Pipeline Libraries,选择一个Retrieval method,一般是选择Modern method,需要安装scm插件,这里才有有选项,比如git插件

然后在流水线中配置

如果要使用共享库的Jenkinsfile,需要指定路径

相关推荐
小小寂寞的城4 小时前
Jenkins里构建一个简单流水线
java·运维·jenkins
我喜欢山,也喜欢海20 小时前
Jenkins Maven 带权限 搭建方案2025
java·jenkins·maven
kaikaile199520 小时前
Jenkins集成Maven
servlet·jenkins·maven
深海蜗牛2 天前
Jenkins linux安装
linux·jenkins
阳光普照世界和平2 天前
Jenkins:库博静态工具CI/CD 的卓越之选
运维·ci/cd·jenkins
liudongyang1232 天前
jenkins 启动报错
java·运维·jenkins
xbd_zc2 天前
【Jenkins简单自动化部署案例:基于Docker和Harbor的自动化部署流程记录】
docker·自动化·jenkins·harbor
nangonghen3 天前
jenkins built-in节点如何删除
jenkins
全栈工程师修炼指南4 天前
解锁 Jenkins Agent 技巧,容器化轻松实现分布式构建节点扩展
运维·分布式·jenkins
梁萌4 天前
Windows系统Jenkins企业级实战
运维·windows·ci/cd·svn·jenkins