web-dev-qa-db-fra.com

Jenkins Pipeline: Comment écrire des fichiers UTF-8 avec writeFile?

J'espère que ce n'est pas un bug et que je fais quelque chose de mal. J'ai un travail dans le pipeline Jenkins (v2.19.1) et, dans son script groovy, je dois rechercher et remplacer du texte dans un fichier texte existant, sur un nœud Windows.

J'ai utilisé fart.exe et powershell pour effectuer la recherche et le remplacement, mais j'aimerais vraiment le faire uniquement avec le groovy de Jenkins et éliminer la dépendance à l'égard de fart/powershell/etc. et rendre ce code plus réutilisable sur les nœuds Linux et Windows.

Après avoir beaucoup cherché sur Google et essayé diverses approches, le plus proche que j'ai obtenu était d'utiliser readFile et writeFile. Cependant, je n'ai pas pu obtenir writeFile pour créer un fichier UTF-8. Il crée un fichier ANSI même lorsque je spécifie UTF-8 (en supposant que je le fasse correctement). 

Voici ce que j'ai jusqu'à présent ...

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"

J'ai confirmé auprès de plusieurs éditeurs de texte que le fichier test.txt est UTF-8 lorsque je démarre et ANSI après la ligne writeFile. J'ai essayé toutes les combinaisons d'inclusion/non-inclusion de la propriété d'encodage et de "utf-8" par rapport à "UTF-8". Mais dans tous les cas, le fichier est écrit en tant qu'ANSI (comme indiqué par Notepad ++ et VS Code). En outre, un point d'interrogation (HEX 3F) est ajouté en tant que tout premier caractère du fichier. 

La ligne echo n'indiquant pas le caractère 3F supplémentaire, il semble donc que le problème se trouve dans la ligne writeFile.

7
Hoss

Votre code semble correct. Vérifiez que ANSI et UTF-8 sont identiques si vous utilisez uniquement des caractères et des caractères non accentués. Essayez d’avoir des lettres accentuées (áéíóúç) dans votre fichier que l’éditeur reconnaîtra probablement comme un fichier UTF-8.

Vous devez utiliser le pipeline Jenkins writeFile function . Il s'agit d'une méthode Jenkins spéciale pour écrire des fichiers dans votre espace de travail. Les objets Java File par défaut ne fonctionneront pas. 

Pour spécifier l'encodage, vous devez utiliser des paramètres nommés. Voici un exemple:

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

Cela créera à la racine de votre espace de travail un fichier nommé filename.txt avec "áéíóú" comme contenu et encodé au format UTF-8.

En passant, si vous avez le contrôle total du fichier que vous devez rechercher et remplacer, envisagez d’utiliser la fonction intégrée de Groovy SimpleTemplateEngine

1
neves

vous devriez être capable de le faire en pure groovy simplement en utilisant: 

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

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

UPDATE: selon les commentaires ci-dessous, cette approche ne fonctionnera pas dans le bac à sable jenkins groovy car l'opération new File(...) y est limitée. S'il vous plaît ignorer. 

1
Matias Bjarland