Jenkins Pipeline 方法(函数)定义及调用

本文介绍如何在 Jenkinsfile 中定义和调用方法,通过示例演示如何简化部署流程,适用于多台服务器的自动化部署场景。


网上查了一些文档资料,Jenkins Pipeline 方法调用 的文章还是比较少的,就算有也描述得不太清楚。于是根据自己的经验总结了如何在 Jenkinsfile 进行方法调用。如有不当之处,请予指正。

首先来说一下为什么要使用方法?有这样一个场景,我有十几台远端服务器,这些服务器都是我的测试(或线上)服务器,我构建后的包需要部署到这些服务器上,于是我会为每台远程服务器定义相关登录信息(用户名、密码或密钥)等。这些配置对于每台服务器来说其实都是一样,无非就是 IP 不同而已(用户名、密钥或密码我暂且保持一致),于是我就可以将相同的部分定义为一个方法或叫函数,并在我的流水线阶段来调用这些方法或函数,当你定义的函数过多时,你还可以将这些函数写道共享库中,然后流水线调用共享库即可。

本案例以声明式 Jenkinsfile 为例进行演示!

1、定义方法(函数)

方法定义于 pipeline {} 之外,并在 pipeline {} 之内进行调用。如下,我定义了一个远程服务器的远程登录信息,方便我能把构建的包发布到远程服务器上。

// 创建函数
def RemoteHost(Jarnname, Host, ProJect) {
    withCredentials([usernamePassword(credentialsId: '131', passwordVariable: 'PassWord', usernameVariable: 'UserName')]){
        def remote = [:]
        remote.name = "$Jarnname"
        remote.host = "$Host"
        remote.user = "$UserName"
        remote.password = "$PassWord"
        remote.port = 22
        remote.allowAnyHosts = true
        sshPut remote: remote, from: "./target/$Jarnname", into: "./${ProJect}/", override: true
    }
}

// 流水线步骤
pipeline {
	stages {
		// 阶段 + 步骤
	}
}

2、调用方法(函数)

看下面代码块的项目发布阶段,在这里调用了上面定义的函数,并进行参数传递。

// 创建函数
def RemoteHost(Jarnname, Host, ProJect) {
    withCredentials([usernamePassword(credentialsId: '131', passwordVariable: 'PassWord', usernameVariable: 'UserName')]){
        def remote = [:]
        remote.name = "$Jarnname"
        remote.host = "$Host"
        remote.user = "$UserName"
        remote.password = "$PassWord"
        remote.port = 22
        remote.allowAnyHosts = true
        sshPut remote: remote, from: "./target/$Jarnname", into: "./${ProJect}/", override: true
    }
}

// 流水线步骤
pipeline {
    agent {
        docker {
            image 'maven:v2'
            args '-v /var/lib/jenkins/workspace/$JOB_NAME:/root/.m2 -v /root/mavenRepository:/usr/repository'
        }
    }
    ...
    ...
	stages {
	    // 拉取代码
        stage('拉取代码') {
            steps {
                checkout([$class: 'GitSCM',
                    branches: [[name: "${params.BRANCH_TAG}"]],
                    doGenerateSubmoduleConfigurations: false,
                    extensions: [],
                    gitTool: 'Default',
                    submoduleCfg: [],
                    userRemoteConfigs: [[url: 'https://codeup.aliyun.com/xx/java_code.git',credentialsId: 'yourid',]]
                ])
        }
        // 项目构建
        stage("构建项目") {
            steps {
                sh "mvn clean package -Dmaven.test.skip=true -P test"
            }
        }
        // 项目发布(在这里调用方法)
        stage ("项目发布") {
            steps {
                script {
                    switch("$p_name"){
                        case "cms":
                            Jarnname = "demo.jar"
                            Host = "192.168.56.131"
                            ProJect = "cms"
                            // 调用方法并传递参数
                            RemoteHost("${Jarnname}", "${Host}", "${ProJect}")
                        break
                    }
                }
            }
        }
        ...
        ...
	}
}

这样的话,我们就不用每次都写一遍定义的方法内容了,只需调用其函数名即可。

注意:上面只是我 Jenkinsfile 的一部分!

至此,Jenkins Pipeline 方法定义及调用已经完成。

### 定义和使用自定义函数Jenkins Pipeline 中,可以通过 `def` 关键字来定义定义函数。这些函数可以在整个 Jenkinsfile 或者共享库中被调用。 #### 在 Jenkinsfile 内部定义函数 当在一个特定的项目中需要重复使用的逻辑时,在 Jenkinsfile 文件内部定义函数是一个不错的选择: ```groovy // 定义一个名为 myCustomFunction 的函数 def myCustomFunction(param) { echo "Parameter received is ${param}" } node { stage('Example') { // 调用之前定义好的函数,并传递参数给它 myCustomFunction 'Hello, world!'[^1] } } ``` 这种方式适合于那些只在这个具体的管道里有用处的小型辅助功能实现。 #### 将函数放在全局环境中 如果希望某些公共的功能能够在多个不同的 pipeline 之间共享,则应该考虑把它们放到 global environment 下面去: ```groovy // Global variable definition at the top level of your script. env.MY_GLOBAL_FUNCTION = { param -> echo "Global function called with parameter: ${param}" } pipeline { agent any stages { stage('Use Global Function') { steps { script { env.MY_GLOBAL_FUNCTION.call("test message")[^2] } } } } } ``` 这种方法允许跨不同 job 和 project 来重用相同的代码片段而无需复制粘贴。 #### 利用 Shared Libraries 实现更复杂的复用机制 对于更加复杂的情况,比如想要封装一系列相关联的操作成一组 API 接口供其他团队成员方便地调用,那么就可以借助 Jenkins 提供的 shared libraries 功能了。这通常涉及到创建一个新的 Git repository 并按照一定的约定放置 Groovy scripts: - **vars/** 目录下存放的是可以直接作为 step 函数使用的简单脚本; - **src/org/example/*** 是用来组织更为正式化的 Java/Groovy 类的地方[^3]。 下面给出一个简单的例子展示如何利用 shared library 编写可复用组件: 假设已经设置好了一个叫作 `my-shared-lib` 的共享库... ```groovy @Library('my-shared-lib') _ import org.example.MyUtilityClass pipeline { agent any stages { stage('Call Utility Method from Lib') { steps { script { MyUtilityClass.doSomethingSpecial() // 假设这是一个静态方法 utilityMethodFromVarsDir() } } } } } ``` 这里展示了两种方式:一种是从 src 组织起来的对象模型中导入类并像平常那样实例化对象或访问静态成员;另一种则是直接引用 vars/ 下定义的过程式过程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值