Jenkins Pipeline中如何向文件追加内容(不使用echo命令)
原因说明
Jenkins 内置 writeFile 步骤默认是覆盖写入模式,每次执行都会清空目标文件的原有内容再写入新文本,本身没有提供追加写入的开关,因此连续调用时只会保留最后一次写入的内容。
无shell依赖的追加写入实现
以下两种方案都不需要调用shell的echo类命令,可根据环境选择:
方案1:原生步骤实现(无额外插件依赖,兼容性最好)
核心逻辑:写入新内容前先读取文件现有内容,将原有内容、换行符、新内容拼接完成后,再整体写回文件。
修正后的可运行Pipeline示例:
node("jenkins-builder") { stage("test") { // 修复原代码的语法问题:Groovy双引号字符串内部的双引号需要转义 String s = "JIRA-1234 | Use \"'\" in place of apostrophes in patient's names when exporting to CSV." dir(env.WORKSPACE) { // 首次写入:文件不存在时直接创建写入 writeFile(file: "./out.txt", text: "First line\n") // 追加逻辑:判断文件存在则读原有内容,不存在则初始化为空串,拼接新内容后写回 def existingContent = fileExists('./out.txt') ? readFile(file: './out.txt') : "" writeFile(file: "./out.txt", text: existingContent + s + "\n") def finalContent = readFile(file: "./out.txt") println finalContent } } }
注意:拼接内容时需要手动补充换行符
\n,否则多次写入的内容会粘连在同一行。
方案2:使用Pipeline Utility Steps插件的原生追加能力
如果你的Jenkins环境已经安装了Pipeline Utility Steps插件,该插件扩展的writeFile步骤原生支持append参数,不需要手动读写拼接:
node("jenkins-builder") { stage("test") { String s = "JIRA-1234 | Use \"'\" in place of apostrophes in patient's names when exporting to CSV." dir(env.WORKSPACE) { writeFile(file: "./out.txt", text: "First line\n") // 追加写入时指定append: true即可 writeFile(file: "./out.txt", text: s + "\n", append: true) def finalContent = readFile(file: "./out.txt") println finalContent } } }
- 两种方案执行后,目标文件都会完整保留所有写入的内容,不会出现覆盖问题。
- 额外提示:你原始代码中定义字符串
s时,内部直接嵌套了未转义的双引号,会触发Groovy语法报错,需要在内部双引号前加反斜杠转义,或者使用三引号定义字符串避免转义问题。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

