web-dev-qa-db-ger.com

Jenkins Pipeline: Wie schreibt man UTF-8-Dateien mit writeFile?

Ich hoffe, das ist kein Fehler und ich mache einfach etwas falsch. Ich habe einen Jenkins (v2.19.1) -Pipeline-Job, und in seinem groovigen Skript muss ich Text in einer vorhandenen Textdatei auf einem Windows-Knoten suchen und ersetzen.

Ich habe fart.exe und powershell verwendet, um die Suche durchzuführen und zu ersetzen, aber ich würde dies wirklich gerne mit den groovigen Jenkins tun und die Abhängigkeit von Furz/Powershell/etc beseitigen. und machen diesen Code auf Linux- und Windows-Knoten wiederverwendbar.

Nachdem ich viel gegoogelt und verschiedene Ansätze ausprobiert hatte, war die Verwendung von readFile und writeFile die am besten geeignete. Es ist mir jedoch nicht möglich, writeFile zum Erstellen einer UTF-8-Datei zu erhalten. Es wird eine ANSI-Datei erstellt, auch wenn ich UTF-8 angegeben habe (vorausgesetzt, ich mache es richtig). 

Hier ist was ich bis jetzt habe ...

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"

Ich habe mit mehreren Texteditoren bestätigt, dass die Datei test.txt beim Start UTF-8 und nach der writeFile-Zeile ANSI ist. Ich habe alle Kombinationen aus dem Einschließen/Nicht-Einschließen der Encoding-Eigenschaft und "utf-8" vs. "UTF-8" ausprobiert. In allen Fällen wird die Datei jedoch als ANSI (wie von Notepad ++ und VS Code gemeldet) geschrieben. Als allererstes Zeichen der Datei wird ein Fragezeichen (HEX 3F) hinzugefügt. 

In der Echozeile wird das zusätzliche 3F-Zeichen nicht angezeigt. Es scheint also, dass das Problem in der writeFile-Zeile liegt.

7
Hoss

Ihr Code sieht korrekt aus. Beachten Sie, dass ANSI und UTF-8 identisch sind, wenn Sie nur Zeichen und Zahlen ohne Akzent verwenden. Versuchen Sie, Akzentbuchstaben (áéíóúç) in Ihrer Datei zu haben, die der Editor wahrscheinlich als UTF-8-Datei erkennt.

Sie müssen die Jenkins-Pipeline writeFile-Funktion verwenden. Dies ist eine spezielle Methode von Jenkins, um Dateien in Ihren Arbeitsbereich zu schreiben. Die Standard-Java-Dateiobjekte funktionieren nicht. 

Um die Kodierung anzugeben, müssen Sie benannte Parameter verwenden. Hier ist ein Beispiel:

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

Dadurch wird im Stammverzeichnis Ihres Arbeitsbereichs eine Datei mit dem Namen filename.txt mit "áéíóú" als Inhalt erstellt und als UTF-8 codiert.

BTW, wenn Sie die vollständige Kontrolle über die Datei haben, die Sie suchen und ersetzen müssen, sollten Sie Groovys eingebaute SimpleTemplateEngine verwenden.

1
neves

sie sollten in der Lage sein, dies in reinem Groovy zu tun, indem Sie einfach Folgendes verwenden: 

def file = new File('test.txt')

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

UPDATE: Wie in den Kommentaren unten beschrieben, funktioniert dieser Ansatz nicht in der groovigen Sandbox von jenkins, da die new File(...)-Operation dort eingeschränkt ist. Ignorieren Sie bitte. 

1
Matias Bjarland