![Попытка перезапустить tomcat 8 с помощью gitlab-runner, pid-файл создан, журнал пуст, сервер не запущен](https://rvso.com/image/668039/%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C%20tomcat%208%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20gitlab-runner%2C%20pid-%D1%84%D0%B0%D0%B9%D0%BB%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%2C%20%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%20%D0%BF%D1%83%D1%81%D1%82%2C%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%20%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD.png)
Я пытаюсь перезапустить свой сервер 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, который затем выполняет ту же команду сверху.
- Обычно при запуске tomcat я вижу следующий вывод: Для завершения работы:
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-файл с 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
решение1
Я наконец нашел решение, которое работает.
Что касается проблемы отсутствия отображения переменных окружения, я ссылаюсь на это: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 есть свой пользователь (и группа). Теперь дерево процессов tomcat инициируется /sbin/init. Теперь gitlab-runner больше не знает об этом процессе или не может его убить. В любом случае tomcat продолжает работать после остановки runner.
решение2
Для этого достаточно просто отказать в доступе к вашему процессу, например tomcat (напишите это в вашем .gitlab-ci.yml
):
deploy_to_tomcat:
stage: deploy
script:
- sudo /opt/apache-tomcat-7.0.77-dbservice/bin/startup.sh &
- disown