我正在尝试部署后重新启动我的 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
我的想法是环境不同,所以我用 cmd 检查了一下。除了由 gitlab-runner 启动时env
的情况外,其他一切都一样。TERM=unknown
您是否知道后台可能会发生什么事情,或者只是我可以测试的事情?
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 一完成就会终止所有剩余进程。这意味着在我的情况下,服务器在进程被终止之前实际上只运行了一小段时间。这就是我得到空日志文件的原因。
我通过简单地编写一个 init 脚本来启动和关闭 tomcat 解决了这个问题。tomcat 现在有了自己的用户(和组)。现在 tomcat 进程树由 /sbin/init 启动。现在 gitlab-runner 不再知道这个进程,也无法终止它。无论哪种方式,在 runner 停止后,tomcat 都会继续运行。
答案2
只需放弃你的进程就可以了,例如 tomcat(在你的 中写入.gitlab-ci.yml
):
deploy_to_tomcat:
stage: deploy
script:
- sudo /opt/apache-tomcat-7.0.77-dbservice/bin/startup.sh &
- disown