web-dev-qa-db-ja.com

Jenkins Pipeline:writeFileを使用してUTF-8ファイルを書き込む方法

これはバグではなく、何か間違ったことをしていることを願っています。 Jenkins(v2.19.1)パイプラインジョブがあり、そのグルーヴィーなスクリプトで、Windowsノード上の既存のテキストファイル内のテキストを検索して置き換える必要があります。

私はfart.exeとpowershellを使用して検索と置換を行いましたが、Jenkinsのグルービーだけでこれを実行し、fart/powershell/etcへの依存を排除​​したいと思います。そして、このコードをLinuxノードとWindowsノードの両方で再利用可能にします。

多くのグーグルとさまざまなアプローチを試みた後、最も近いのはreadFileとwriteFileを使用することでした。ただし、UTF-8ファイルを作成するwriteFileを取得できませんでした。 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」と「UTF-8」の包含/非包含のすべての組み合わせを試しました。ただし、すべての場合において、ファイルはANSIとして書き出されます(Notepad ++とVS Codeの両方で報告されています)。また、ファイルの最初の文字として疑問符(HEX 3F)が追加されます。

エコー行には余分な3F文字が表示されないため、問題はwriteFile行にあるようです。

10
Hoss

コードは正しいようです。アクセント記号のない文字と数字のみを使用している場合は、ANSIとUTF-8が同じであることを確認してください。エディターがおそらくUTF-8ファイルとして認識できるように、ファイルにアクセント付き文字(áéíóúç)を含めるようにしてください。

Jenkinsパイプライン writeFile function を使用する必要があります。これは、ワークスペース内にファイルを書き込むための特別なJenkinsメソッドです。デフォルトのJavaファイルオブジェクトは機能しません。

エンコーディングを指定するには、名前付きパラメーターを使用する必要があります。次に例を示します。

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

これにより、ワークスペースのルートにfilename.txtという名前のファイルが作成され、コンテンツが「áéíóú」で、UTF-8でエンコードされます。

ところで、ファイルを完全に制御して検索および置換する必要がある場合は、Groovyの組み込み SimpleTemplateEngine の使用を検討してください。

11
neves

あなたはこれを使うだけで純粋なグルーヴィーでこれを行うことができるはずです:

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

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

[〜#〜] update [〜#〜]:以下のコメントのとおり、new File(...)操作が制限されているため、このアプローチはjenkins groovyサンドボックス内では機能しません。無視してください。

0
Matias Bjarland