嘗試使用 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檢查了env。除了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 完成,它就會殺死所有剩餘的進程。這意味著在我的例子中,伺服器實際上在進程被終止之前運行了很短的時間。這就是為什麼我得到空日誌檔案的原因。

我透過簡單地編寫一個 init 腳本來啟動和關閉 tomcat 解決了這個問題。 tomcat 現在有自己的使用者(和群組)。現在tomcat進程樹是由/sbin/init啟動的。現在 gitlab-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

相關內容