0

我正在尝试找到一种使用 Jenkins Groovy Script-Console 将一些内容写入文件的方法。

用例:我们的 CI 使用所有节点之间共享的卷(又映射到 EFS)来管理一些状态机。然而 - 在我们的 CI groovy 共享库中发现错误之后,我发现一些状态文件已损坏,需要将更正的值写入它们,同时修复错误。

但是,我可以使用 ssh 连接来做到这一点,因为我们正在抽象出我们试图从中退出的工作人员,并仅从脚本控制台和/或 ci 作业中管理自己。

我尝试了所有这些形式,但都失败了:

"echo 'the text' > /mnt/efs-ci-state/path/to/the-state-file.txt".execute().text
"""
cat <<<EOF > /mnt/efs-ci-state/path/to/the-state-file.txt
the text
EOF
""".execute().text
"bash -c 'echo the text > /mnt/efs-ci-state/path/to/the-state-file.txt'".execute().text
"echo 'the text' | tee /mnt/efs-ci-state/path/to/the-state-file.txt"

任何人都可以告诉我这样做的方法吗?

我也很感激解释为什么上面的表格不起作用和/或提示如何执行包括从该脚本控制台引导的管道和/或 stdio 的命令。

谢谢 :)

4

1 回答 1

1
["bash", "echo the text > /mnt/efs-ci-state/path/to/the-state-file.txt"].execute().text

或使用普通的常规:

new File('/mnt/efs-ci-state/path/to/the-state-file.txt').text = "echo the text"

为什么不工作:

  • 选项 1、2、4:回声和管道是 shell/bash 的一个特性 - 如果没有 bash,它将无法工作

  • 选项 3 你有c echoc不是一个有效的命令

  • 使用数组执行复杂的命令并与bash主​​要部分分离


如果您想捕获和验证,我建议您使用这种代码stderr

["bash", 'echo my text > /222/12345.txt'].execute().with{proc->
    def out=new StringBuilder(), err=new StringBuilder()
    proc.waitForProcessOutput(out, err)
    assert !err.toString().trim()
    return out.toString()
}
于 2021-10-11T14:02:22.583 回答