Jenkins Pipeline: Comment écrire les fichiers UTF-8 avec writeFile?
J'espère que ce n'est pas un bug et que je suis tout à fait quelque chose de mal. J'ai un Jenkins (v2.19.1) Pipeline d'emploi et c'est groovy script, j'ai besoin de rechercher et de remplacer du texte dans un fichier texte existant, sur un Windows nœud.
J'ai utilisé fart.exe et powershell pour faire de la recherche et de remplacement, mais je voudrais vraiment le faire avec le groovy dans Jenkins et éliminer la dépendance sur pet/powershell/etc. et rendre ce code plus réutilisable sur linux et windows nœuds.
Après beaucoup de recherches sur google et essayer différentes approches, le plus proche que j'ai eu était d'utiliser readFile et writeFile. Cependant, je n'ai pas été en mesure d'obtenir writeFile pour créer un fichier UTF-8. Il crée un fichier ANSI même quand je spécifier l'encodage UTF-8 (en supposant que je suis en train de faire 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é avec plusieurs éditeurs de texte que l'test.txt le fichier est en UTF-8 quand j'ai commencer, et ANSI après le writeFile ligne. J'ai essayé toutes les combinaisons de la y compris/pas-y compris la propriété de codage et de "utf-8" vs "UTF-8". Mais dans tous les cas, le fichier est écrit comme ANSI (tel que rapporté par les deux Notepad++ et VS Code). Aussi, un point d'interrogation (HEX 3F) est ajouté en tant que premier caractère du fichier.
La ligne echo n'affiche pas les extra 3F personnage, il semble donc que le problème est dans le writeFile ligne.
Je peux pas en ce moment. Seulement unix nœud que j'ai est maître, mais il s'exécute dans un conteneur Docker que je n'ai pas accès. À un certain moment, nous n'avons unix nœuds disponibles et peuvent essayer alors si je n'ai pas pensé à elle.
OriginalL'auteur Hoss | 2017-02-23
Vous devez vous connecter pour publier un commentaire.
Votre code est correct. Voir ANSI et UTF-8 sont les mêmes si vous êtes en utilisant non seulement les caractères accentués et les nombres. Essayez d'avoir quelques lettres accentuées (áéíóúç) dans votre fichier l'éditeur, de ne probablement le reconnaître comme un fichier UTF-8.
Vous devez utiliser le Jenkins pipeline fonction writeFile. C'est un spécial Jenkins méthode pour écrire des fichiers à l'intérieur de votre espace de travail. La valeur par défaut de Java les objets de Fichier ne fonctionne pas.
Spécifier l'encodage, vous devez utiliser des paramètres nommés. Voici un exemple:
Cela va créer à la racine de votre espace de travail, un fichier nommé filename.txt avec "áéíóú" en tant que contenu et codé en UTF-8.
BTW, si vous avez le contrôle complet du fichier que vous devez rechercher et remplacer, envisager l'utilisation de Groovy est builtin SimpleTemplateEngine
OriginalL'auteur neves
vous devriez être en mesure de le faire dans le plus pur groovy en utilisant simplement:
Mise à JOUR: selon les commentaires ci-dessous cette approche ne fonctionnera pas dans le jenkins groovy sandbox que le
new File(...)
opération est limitée. Veuillez ne pas tenir compte.Jenkins Pipeline empêche l'utilisation de certaines opérations,
new File(...)
est l'un de ceux-ci. Afin d'écrire quelque chose sur un emplacement arbitraire sur le système de fichiers, vous avez à 1. employerwriteFile(...)
et d'abord l'écrire dans le (Jenkins) de l'espace de travail vous êtes sur puis 2. exécuter un shell script qui copie le juste écrit temporaty fichier sur le bon emplacement.OriginalL'auteur Matias Bjarland