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

时间:2017-02-23 14:53:36

标签: jenkins groovy encoding utf-8 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"

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

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

2 个答案:

答案 0 :(得分:3)

您的代码看起来正确。如果仅使用非重音字符和数字,请参见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

答案 1 :(得分:0)

你应该能够通过使用:

在纯粹的groovy中做到这一点
def file = new File('test.txt')

def fileContents = file.getText('UTF-8')
fileContents     = fileContents.replace("hello", "world")
file.setText(fileContents, 'UTF-8')

UPDATE :根据下面的评论,这种方法在jenkins groovy沙箱中不起作用,因为new File(...)操作在那里被限制。请忽略。