Jenkins Pipeline:如何使用writeFile编写UTF-8文件?

Hos*_*oss 9 groovy encoding utf-8 jenkins jenkins-pipeline

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

我已经使用fart.exe和powershell进行搜索和替换,但我真的很想在Jenkins中使用groovy并消除对fart/powershell /等的依赖.并使这个代码在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"
Run Code Online (Sandbox Code Playgroud)

我已经向多个文本编辑器确认,当我启动时test.txt文件是UTF-8,而writeFile行之后是ANSI.我已经尝试了包括/不包括编码属性和"utf-8"与"UTF-8"的所有组合.但在所有情况下,该文件都写为ANSI(由Notepad ++和VS Code报告).此外,添加问号(HEX 3F)作为文件的第一个字符.

回显线不显示额外的3F字符,所以看起来问题出现在writeFile行中.

nev*_*ves 7

您的代码看起来正确。如果仅使用非重音字符和数字,请参见ANSI和UTF-8相同。尝试在文件中添加带重音的字母(áéíóúç),以使编辑者可能会将其识别为UTF-8文件。

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

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

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

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

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

  • 如果整个内容位于变量后面,则不需要字符串插值:`writeFile([file: fileName, text:contents])`。除非将原始字符串与变量组合:`writeFile([file: "/tmp/${fileName}", text: "Contents: ${contents}"])`。 (3认同)
  • 您还可以使用变量,例如“writeFile file: "${outFileDest}" text: "${output}" (2认同)