![嘗試使用 gitlab-runner 重新啟動 tomcat 8,已建立 pid 文件,日誌為空,伺服器未啟動](https://rvso.com/image/668039/%E5%98%97%E8%A9%A6%E4%BD%BF%E7%94%A8%20gitlab-runner%20%E9%87%8D%E6%96%B0%E5%95%9F%E5%8B%95%20tomcat%208%EF%BC%8C%E5%B7%B2%E5%BB%BA%E7%AB%8B%20pid%20%E6%96%87%E4%BB%B6%EF%BC%8C%E6%97%A5%E8%AA%8C%E7%82%BA%E7%A9%BA%EF%BC%8C%E4%BC%BA%E6%9C%8D%E5%99%A8%E6%9C%AA%E5%95%9F%E5%8B%95.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
我的想法是環境不同所以我用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