неизмененный стандартный, неизмененный стандартный
Я полагаю, что что-то в вашем сценарии вмешивается в стандартный ввод.
Ваш сценарий должен передать весь поток stdin без изменений процессу агента Jenkins.
Универсальное решение
Команда OP для установки сеанса Jenkins отличается от моей, но, тем не менее, вы должны разбить свой сценарий запуска на 3 основные части:
Настройка: В этой части нет вмешательства в стандартный ввод или стандартный вывод.
Установить сеанс Jenkins: java -jar jenkins-cli.jar ...
Снесите: В этой части нет вмешательства в стандартный ввод или вывод.
#!/bin/bash
function set_up {
# your set-up code here
}
function tear_down {
# your tear-down code here
}
function main {
# set-up (no stdin, no stdout)
set_up "$@" < /dev/null > /dev/null || exit $?
# establish Jenkins session
java -jar jenkins-cli.jar -blah -blah -blah
# tear-down (no stdin, no stdout)
tear_down "$@" < /dev/null > /dev/null || exit $?
}
main "$@"
Но ... почему?
Задача вашего сценария запуска - установить нетронутый канал связи (через stdin и stdout) между мастером и агентом сборки.
+------------+
"Hello Agent" | |
_ _ ----+ +----
v Hello Agent ->
----+ +----
| |
| | "Hello Master"
----+ +---- _ _
<- Hello Master v
----+ +----
| |
+------------+
launch
script
Если этот канал связи подделан, Дженкинс не будет работать.
+------------+
"Hello Agent" | |
_ _ ----+ +-----------
v Hel PLZ SEND HELP!! t ->
----+ +-----------
| |
| |
----+ +---- | |
^
----+ +----
| |
+------------+
launch
script
Некоторые команды Unix могут «проглотить» стандартный код вашего сценария запуска, если вы ничего не передаете в эту команду, и, следовательно, «повредить» канал связи. Рассмотрим следующий сценарий.
#!/bin/bash
function keep_stdin_intact {
printf 'I do not consume any stdin, ' >&2
echo 'and I do not alter the original stdout.' >&2
}
function swallow_stdin {
echo 'I swallow stdin. Did you see any hexdump below?' >&2
read yn # read consumed some stdin
}
echo 'yes' | { keep_stdin_intact; cat -; } | xxd
echo 'yes' | { swallow_stdin; cat -; } | xxd
echo "no you can't now :P" | { swallow_stdin < /dev/null; cat -; } | xxd
Первый yes
был передан по каналу и выгружен в шестнадцатеричном формате, потому что keep_stdin_intact
не вмешивался в stdin, в данном случае это поток "yes".
Второй yes
пропал, потому что swallow_stdin
потреблял его, поэтому cat
не имеет ничего для кошки, а xdd
нечего читать.
Отправив /dev/null
команде на проглатывание стандартного ввода, мы защитили наш собственный стандартный вывод.
Что случилось с ssh?
ssh
- одна из злых команд, которые поглощают ваш стандартный ввод.
Допустим, вы хотите удалить некоторые файлы в агенте сборки до запуска agent.jar
. Без образца вы можете написать:
ssh $OPTIONS "$remote" 'sudo rm -rf /var/log/nginx/*'
ssh $OPTIONS "$remote" 'cd $HOME && java -jar agent.jar'
^ Но это неправильно! Первая команда ssh
поглотит ваш стандартный ввод, и сеансу Дженкинса нечего будет читать.
Первый ssh
должен быть "замолчать". Передайте /dev/null
как его стандартный номер.
ssh $OPTIONS "$remote" 'sudo rm -rf /var/log/nginx/*' < /dev/null
ssh $OPTIONS "$remote" 'cd $HOME && java -jar agent.jar'