Я пытаюсь перезапустить свой сервер Tomcat 8 после развертывания.
Настроить:
gitlab-runner работает с собственным пользователем (называемым gitlab-runner)
tomcat использует своего собственного пользователя по имени tomcat
У sudoers есть запись, чтобы gitlab-runner мог запускать скрипт: gitlab-runner ALL=(tomcat) NOPASSWD: /home/tomcat/deploy.sh
Сценарий развертывания просто копирует файл в каталог webapps, завершает работу Tomact и перезапускает его:
cd /home/tomcat/bin
sh catalina.sh stop -force
...
sh catalina.sh start
Когда я запускаю скрипт вручную от имени пользователя gitlab-runner, все работает нормально:
sudo -u tomcat /home/tomcat/deploy.sh
Однако, когда задание запускается из gitlab-ci-multi-runner (с отправкой в репозиторий gitlab), происходят следующие вещи. Gitlab-runner в основном пишет script.sh, который затем выполняет ту же команду сверху.
Using CATALINA_BASE: /home/tomcat/
Using CATALINA_HOME: /home/tomcat/
Using CATALINA_TMPDIR: /home/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/tomcat/bin/bootstrap.jar:/home/tomcat/bin/tomcat-juli.jar
Using CATALINA_PID: /home/tomcat/bin/catalina.pid
Для запуска:
Using CATALINA_BASE: /home/tomcat/
Using CATALINA_HOME: /home/tomcat/
Using CATALINA_TMPDIR: /home/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/tomcat/bin/bootstrap.jar:/home/tomcat/bin/tomcat-juli.jar
Using CATALINA_PID: /home/tomcat/bin/catalina.pid
Existing PID file found during start.
Removing/clearing stale PID file.
Tomcat started.
Когда я запускаю его с помощью gitlab-runner, нет вывода для выключения, но сервер выключается. Это действительно работает.
Только для стартапа Tomcat started.
показывает.
Файл pid создается с идентификатором внутри, но процесс не существует.
Файлы журналов создаются, но они пусты.
Если я запускаю сервер в режиме отладки: sh catalina.sh jpda start
файл log / catalina.out содержит всего одну строку: tomcat Listening for transport dt_socket at address: 8080
Я подумал, что окружающая среда другая, поэтому я проверил env
cmd. Все равно, кроме TERM=unknown
когда он запускается gitlab-runner.
У вас есть какие-нибудь подсказки, что может произойти в фоновом режиме, или что я могу проверить?
gitlab-runner имеет открытый исходный код, и сценарий, запускающий сценарий сборки, выглядит следующим образом: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/executors/shell/executor_shell.go#L36
Просто откажитесь от вашего процесса, например, tomcat (напишите это в своем .gitlab-ci.yml
):
deploy_to_tomcat:
stage: deploy
script:
- sudo /opt/apache-tomcat-7.0.77-dbservice/bin/startup.sh &
- disown
Я наконец нашел решение, которое работает.
В связи с проблемой не отображения переменных среды я обращаюсь к этому: https://bz.apache.org/bugzilla/show_bug.cgi?id=37848 У gitlab-runner нет tty, поэтому вывод не отображается.
Причина неправильного запуска следующая: Заглянув в исходный код gitlab-runner, вы можете найти это: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/executors/shell/executor_shell.go#L84
В основном, как только gitlab-runner завершает работу, он убивает все оставшиеся процессы. Это означает, что в моем случае сервер фактически работал в течение короткого промежутка времени, прежде чем процесс был остановлен. Вот почему у меня есть пустые файлы журналов.
Я решил проблему, просто написав сценарий инициализации для запуска и выключения tomcat. У кота теперь есть собственный пользователь (и группа). Теперь дерево процессов tomcat инициируется / sbin / init. Теперь gitlab-runner больше не знает об этом процессе или не может его убить. В любом случае кот продолжает работать после остановки бегуна.