Запись файла из консоли сценариев Jenkins Groovy Script-Console
Я пытаюсь найти способ записать некоторый контент в файл с помощью 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 из этой консоли сценария.
Спасибо :)
1 ответ
["bash", "echo the text > /mnt/efs-ci-state/path/to/the-state-file.txt"].execute().text
или используйте простой Groovy:
new File('/mnt/efs-ci-state/path/to/the-state-file.txt').text = "echo the text"
почему не работает:
варианты 1, 2, 4: echo и piping - это особенность оболочки / bash- она не будет работать без bash
вариант 3 у вас есть
c echo
а такжеc
не действительная командаиспользовать массив для выполнения сложных команд и разделения
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()
}