【问题标题】:Jenkins Pipeline: How to write UTF-8 files with writeFile?Jenkins Pipeline:如何使用 writeFile 编写 UTF-8 文件?
【发布时间】:2017-02-23 14:53:36
【问题描述】:

我希望这不是错误,我只是做错了什么。我有一个 Jenkins (v2.19.1) 流水线作业,在它的 groovy 脚本中,我需要在 Windows 节点上搜索和替换现有文本文件中的一些文本。

我已经使用 fart.exe 和 powershell 来进行搜索和替换,但我真的很想只使用 Jenkins 中的 groovy 来执行此操作,并消除对 fart/powershell/etc 的依赖。并使这段代码在 linux 和 windows 节点上都更可重用。

经过大量谷歌搜索并尝试了各种方法,我得到的最接近的是使用 readFile 和 writeFile。但是,我无法让 writeFile 创建一个 UTF-8 文件。即使我指定 UTF-8(假设我做得正确),它也会创建一个 ANSI 文件。

这是我目前所拥有的......

def fileContents = readFile file: "test.txt", encoding: "UTF-8"
fileContents = fileContents.replace("hello", "world")
echo fileContents
writeFile file: "test.txt", text: fileContents, encoding: "UTF-8"

我已经通过多个文本编辑器确认 test.txt 文件在我开始时是 UTF-8,而在 writeFile 行之后是 ANSI。我已经尝试了包含/不包含编码属性和“utf-8”与“UTF-8”的所有组合。但在所有情况下,文件都以 ANSI 形式写出(由 Notepad++ 和 VS Code 报告)。此外,还添加了一个问号 (HEX 3F) 作为文件的第一个字符。

echo 行没有显示额外的 3F 字符,因此问题似乎出在 writeFile 行。

【问题讨论】:

  • 你能在 unix 节点上测试吗?我刚刚在我的 Jenkins 上测试了您的代码,并且在针对 unix 节点运行代码时没有编码问题......我猜测 Windows 节点存在某种问题,无论是在操作系统端还是在使用 Windows 时的插件端..
  • @Pom12,我现在不能。只有我拥有的 unix 节点是主节点,但它在我无权访问的 Docker 容器中运行。在某个时候,我们将有可用的 unix 节点,如果我还没有弄清楚,可以尝试一下。

标签: jenkins groovy encoding utf-8 jenkins-pipeline


【解决方案1】:

您的代码看起来正确。如果您只使用非重音字符和数字,请注意 ANSI 和 UTF-8 是相同的。尝试在文件中添加一些重音字母 (áéíóúç),以便编辑器将其识别为 UTF-8 文件。

您必须使用 Jenkins 管道 writeFile function。这是一种在工作区中写入文件的特殊 Jenkins 方法。默认的 Java File 对象不起作用。

要指定编码,您必须使用命名参数。这是一个例子:

writeFile(file: "filename.txt", text: "áéíóú", encoding: "UTF-8")

这将在您工作区的根目录创建一个名为 filename.txt 的文件,其内容为“áéíóú”,编码为 UTF-8。

顺便说一句,如果您对必须搜索和替换的文件有完全控制权,请考虑使用 Groovy 的内置 SimpleTemplateEngine

【讨论】:

  • 你也可以使用变量,比如“writeFile file:”${outFileDest}“text:”${output}”
  • 如果整个内容是变量后面的内容,则不需要字符串插值:writeFile([file: fileName, text: contents])。除非您将原始字符串与变量组合:writeFile([file: "/tmp/${fileName}", text: "Contents: ${contents}"]).
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 2017-10-31
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多