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

Groovy/Jenkins流水线中如何替换被禁用的new File方法

替换方案说明

报错原因

  • 语法问题:你调用new File(file: "${template}")时传入了Map类型参数,java.io.File本身没有接收Map的构造方法,写法本身不符合Java类调用规则
  • 权限问题:即使修正为正确的new File("${template}")写法,Jenkins脚本安全沙箱也已将java.io.File构造方法列入禁用黑名单,不允许在沙箱环境中直接调用,避免任意文件读写风险

核心结论

不需要额外对接Python脚本就能实现需求,你当前的代码逻辑仅需要提取路径中的文件名并去除指定后缀,用Jenkins沙箱允许的内置方法即可完成。如果确有需要对接Python的场景,也提供对应实现方案。

具体实现方案

方案1:使用沙箱白名单内的工具类实现(性能最优,无需调用外部进程)

你可以直接用Jenkins内置的org.apache.commons.io.FilenameUtils工具类,该类已列入沙箱白名单,可直接调用:

import org.apache.commons.io.FilenameUtils

// 先标准化路径(等价于原来的normalize方法,处理.././这类相对路径标识)
def normalizedPath = FilenameUtils.normalize(template)
// 提取文件名并去除后缀
def templateName = FilenameUtils.getName(normalizedPath).replace(".html", "").replace(".yaml", "")

如果不需要处理相对路径的标准化,直接用纯字符串处理就能实现:

def templateName = template.tokenize('/').last().replace(".html", "").replace(".yaml", "")

方案2:使用流水线内置步骤调用系统命令实现

如果需要兼容复杂的路径处理规则,可以调用sh(Linux节点)或bat(Windows节点)步骤实现:

// Linux节点示例
def templateName = sh(
  script: "basename ${template} | sed 's/\\.html$//;s/\\.yaml$//'",
  returnStdout: true
).trim()

方案3:对接Python脚本实现

如果确需通过Python处理,可按如下方式实现:

  1. 编写Python处理脚本get_template_name.py:
import os
import sys

if __name__ == "__main__":
    template_path = sys.argv[1]
    normalized_path = os.path.normpath(template_path)
    file_name = os.path.basename(normalized_path)
    res = file_name.replace(".html", "").replace(".yaml", "")
    print(res, end="")
  1. Jenkins流水线中调用脚本获取结果:
def templateName = sh(
  script: "python3 get_template_name.py ${template}",
  returnStdout: true
).trim()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:18:02