使用 groovy 脚本在 jenkins 管道中注入变量

Inject variable in jenkins pipeline with groovy script

我正在构建一个 jenkins 管道,该作业可以通过远程触发。我需要知道哪个 IP 触发了作业。所以我有一个 groovy 脚本,其中 returns 远程 IP。使用 EnvInject-plugin,我可以在普通的自由式作业中轻松使用这个变量,但是我如何在管道 scirpt 中使用它呢?我不能将 EnvInject 插件与管道插件一起使用 :(

这是获取 IP 的小脚本:

import hudson.model.*
import static hudson.model.Cause.RemoteCause


def ipaddress=""
for (CauseAction action : currentBuild.getActions(CauseAction.class)) {

    for (Cause cause : action.getCauses()) {
        if(cause instanceof RemoteCause){
             ipaddress=cause.addr
             break;
        }
    }
}
return ["ip":ipaddress]

您可以创建共享库函数(有关示例和目录结构,请参见 here)。这是 Jenkins 的未记录(或很难找到任何文档)功能之一。

如果您将文件 triggerIp.groovy 放入目录 vars 中,该目录位于 JENKINS_HOME 的根目录 workflow-libs 中,并将您的代码放入那个文件。 完整的文件名将是 $JENKINS_HOME/workflow-libs/vars/ipTrigger.groovy (您甚至可以为您的共享库创建一个 git 存储库并将其克隆到该目录中)

// workflow-libs/vars/ipTrigger.groovy
import hudson.model.*
import static hudson.model.Cause.RemoteCause

@com.cloudbees.groovy.cps.NonCPS
def call(currentBuild) {
    def ipaddress=""
    for (CauseAction action : currentBuild.getActions(CauseAction.class)) {

        for (Cause cause : action.getCauses()) {
            if(cause instanceof RemoteCause){
                ipaddress=cause.addr
                break;
            }
        }
    }
    return ["ip":ipaddress]
}

Jenkins 重启后,从您的管道脚本中,您可以通过您给它的文件名调用该方法。

因此,从您的管道中调用 def trigger = ipTrigger(currentBuild)

ipaddress 将是,trigger.ip(抱歉命名错误,无法想出原创的东西)