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处理,可按如下方式实现:
- 编写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="")
- Jenkins流水线中调用脚本获取结果:
def templateName = sh( script: "python3 get_template_name.py ${template}", returnStdout: true ).trim()
内容的提问来源于stack exchange,提问作者devopsinka
相关产品推荐
相关产品推荐

