expect, jenkins и `send spawn id exp0 not open`

Aug 08, 2022 23:28


Jenkins-agent не может в pty. Это факт. И он происходит из того, что при создании субпроцесса (shell, pipeline, и т.д.), ему не создаётся pty. Потому что не нужно никогда и никому.

Но, есть expect ("ВНЕЗАПНО!"). И вот именно ему pty очень даже нужен. И если pty/pts/tty для expect нет, то при попытке общения с терминалом (например, через spawn) expect вываливается с ошибкой вида send spawn id exp0 not open . А так как expect нежно любим в отдельных местах, то перед devopsом встаёт призрак заката солнца в ручную. Что неправильно.

Однако, есть pty.h в котором есть функция openpty. Но, так как таскать с собой пристяжной к jenkins pipeline бинарь (или, что исчио хужее таво) компилить его jit не самая хорошая идея, то есть такой вариант для python3:
  1. тривиальный вариант: python3 -c 'import pty; pty.spawn("tty") , вывод будет на stdout родителя, но с лишними переводами строк в логе jenkins.
  2. чуть менее тривиально: python3 -c 'import pty; import subprocess; (pM,pS) = pty.openpty(); subprocess.run("tty".split(), stdin=pM, stdout=pS, shell=False) , причём если опустить stdout=pS, то вывод будет на stdout родителя.
  3. для Ъ-джедаев: python3 -c 'import pty; import subprocess; (pM,pS) = pty.openpty(); subprocess.run("tty | tee -a /tmp/istty.log", stdin=pM, stdout=pS, shell=True)

expect, python, linux, jenkins, devops, unix, очумелые ручки

Previous post Next post
Up