尝试使用 gitlab-runner 重新启动 tomcat 8,pid 文件已创建,日志为空,服务器未启动

尝试使用 gitlab-runner 重新启动 tomcat 8,pid 文件已创建,日志为空,服务器未启动

我正在尝试部署后重新启动我的 tomcat 8 服务器。

设置:

gitlab-runner 以其自己的用户(称为 gitlab-runner)运行

tomcat 使用自己的用户 tomcat

  1. sudoers 有一个条目,以便 gitlab-runner 可以运行脚本: gitlab-runner ALL=(tomcat) NOPASSWD: /home/tomcat/deploy.sh

  2. 部署脚本只是将文件复制到 webapps 目录中,关闭 tomact 并重新启动它:

cd /home/tomcat/bin sh catalina.sh stop -force ... sh catalina.sh start

当我以 gitlab-runner 用户身份手动运行脚本时,一切正常:

  1. sudo -u tomcat /home/tomcat/deploy.sh

但是,当从 gitlab-ci-multi-runner 启动作业(推送到 gitlab 存储库)时,会发生以下情况。gitlab-runner 基本上会编写一个 script.sh,然后执行上面的相同命令。

  1. 通常当我启动 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.显示。

  1. 创建了一个 pid 文件,其中包含一个 pid,但是该进程不存在。

  2. 日志文件已创建但是为空。

如果我以调试模式启动服务器: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

相关内容