Запись файла из консоли сценариев 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()
}
Другие вопросы по тегам