You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins模板引擎(JTE)中如何在共享库方法间传递值?

Jenkins JTE共享库方法调用与值传递问题解决

场景说明

治理层Jenkinsfile代码:

node("Build-Node") {
def artifactVersion
checkout()
build()
sourceArtifact = docker_build()
push(sourceArtifact)
}

共享库目录结构:

shared-library
|
|--docker
|   |--steps
|       |--docker_build.groovy
|       |--push.groovy
|--maven
|   |--steps
|        |--build.groovy
|--npm
|   |--steps
|        |--build.groovy

客户端pipeline_config.groovy配置:

libraries {
   docker {
   url = "REGISTRY_URL"
   credentials = "REGISTRY_CREDENTIALS"
   @override sourceArtifact= "" //需在Jenkinsfile中重写,并将新值传入push()方法。
    //更多Docker配置
   }
}

docker_build.groovy代码:

def call() {
     //执行Docker构建操作
     return sourceArtefact 
}

当前存在两个问题:

  1. 报错提示push.groovy中找不到call方法
  2. 不清楚如何在JTE共享库的不同方法间正确传递值

问题1:修复push.groovy找不到call方法的问题

JTE共享库的step文件必须实现call()方法(支持带参数的重载),JTE会通过该方法触发step调用。你的push.groovy未定义符合要求的call方法,导致调用失败。

修复示例:

// docker/steps/push.groovy
def call(sourceArtifact) {
    // 结合配置中的仓库地址和凭证执行推送逻辑
    echo "推送镜像 ${sourceArtifact} 到仓库 ${config.url}"
    // 替换为实际Docker推送命令,比如:
    // withCredentials([usernamePassword(credentialsId: config.credentials, usernameVariable: 'REGISTRY_USER', passwordVariable: 'REGISTRY_PWD')]) {
    //     sh "docker login ${config.url} -u ${REGISTRY_USER} -p ${REGISTRY_PWD}"
    //     sh "docker push ${sourceArtifact}"
    // }
}

注:JTE会自动将当前库的配置注入config变量,可直接通过config.url、config.credentials读取配置值。


问题2:共享库方法间的正确传值方式

结合你的场景,需将docker_build()的返回值传递给push(),同时配合配置变量,可按以下步骤调整:

  1. 修正拼写错误:docker_build.groovy中返回的sourceArtefact是英式拼写,与Jenkinsfile中的sourceArtifact不一致,先统一拼写避免变量未定义:
// docker/steps/docker_build.groovy
def call() {
     // 执行实际Docker构建逻辑,生成镜像标识
     def builtArtifact = "my-project:${env.BUILD_NUMBER}" // 替换为真实构建结果
     // 返回构建产物标识
     return builtArtifact 
}
  1. Jenkinsfile传值逻辑保留:当前Jenkinsfile的写法是正确的,docker_build()的返回值会赋值给sourceArtifact,再传入push(),只要push.groovy的call方法接收该参数,即可正常获取值。

  2. 结合配置变量的进阶处理:如果需要用配置中的sourceArtifact作为默认值,同时支持方法返回值覆盖,可调整push.groovy的参数默认值:

// docker/steps/push.groovy
def call(sourceArtifact = config.sourceArtifact) {
    // 优先使用调用时传入的值,无传入则用配置中的默认值
    echo "推送目标镜像:${sourceArtifact}"
    // 执行推送逻辑
}

若需要将构建结果同步到配置变量,也可在docker_build中更新config:

// docker/steps/docker_build.groovy
def call() {
     def builtArtifact = "my-project:${env.BUILD_NUMBER}"
     config.sourceArtifact = builtArtifact // 更新配置中的变量
     return builtArtifact 
}

内容的提问来源于stack exchange,提问作者user2179627

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:46:09