Как отправить единственную конвейерную команду в python, используя bash из grovy script console (Jenkins)? - PullRequest
0 голосов
/ 29 апреля 2019

Я использую скриптовую консоль groovy, предложенную Jenkins. У меня есть эта хорошо работающая строка для подчиненного Jenkins (на базе Windows):

println "cmd /c echo print(\"this is a sample text.\") | python".execute().text

Теперь я хочу функциональный эквивалент для ведомого Jenkins (на базе Linux). Итак, я начал в командной строке Linux и получил эту команду ядра для меня:

bash -c 'echo print\(\"this is a sample text.\"\) | python'

Затем я завернул всю эту командную строку консоли в еще несколько управляющих кодов и оформление вызова - но после этого он перешел в нерабочее состояние:

println "bash -c \'echo print\\(\\\"this is a sample text.\\\"\\) | python\'".execute().txt

Результат при запуске:

пусто

Я чувствую, что застрял на данный момент из-за того, что не смог решить множество воздействующих уровней побега персонажа. В чем дело? Как это решить? (А может быть: почему?)

PS: если неясно - я хочу (если вообще возможно) придерживаться однострочного текста, как было в исходном пункте.

Ответы [ 3 ]

1 голос
/ 01 мая 2019

Если вам не нужно передавать bash в python, может, это подойдет вам?

['python','-c','print("this is a sample text")'].execute().text

Если вам нужно , попробуйте

['bash','-c', /echo print\(\"this is a sample text.\"\) | python/].execute().text

Использование List .execute() помогает уточнить, что представляет собой каждый аргумент. Слэш-строки помогают, изменяя escape-символ.

1 голос
/ 29 апреля 2019
print "bash -c 'echo \"print(\\\"this is a sample text.\\\")\" | python'"

Выход:

bash -c 'echo "print(\"this is a sample text.\")" | python'
0 голосов
/ 02 мая 2019

Поработав еще некоторое время, я обнаружил несколько независимое от платформы решение для канала ошибок (stderr), способное реагировать на ошибки исполнения, которое позволяет избежать даже таких специфических для ОС компонентов, как bash / cmd.exe:

try {
  def command = ['python', '-c', /print("this is a sample text.")/];
  if (System.properties['os.name'].toLowerCase().contains('windows'))
  {
    command[2] = command[2].replaceAll(/\"/, /\\\"/)
  }
  println "command=" + command
  def proc = command.execute()
  def rc = proc.waitFor()
  println "rc=" + rc

  def err = proc.err.text
  if( err != "" ) { print "stderr=" + err }

  def out = proc.text
  if( out != "" ) { print "stdout=" + out }
} catch(Exception e) {
  println "exception=" + e
}
println ""
...