![gitlab-runner を使用して tomcat 8 を再起動しようとしましたが、pid ファイルが作成され、ログは空で、サーバーは起動されませんでした](https://rvso.com/image/668039/gitlab-runner%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%20tomcat%208%20%E3%82%92%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E3%80%81pid%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E4%BD%9C%E6%88%90%E3%81%95%E3%82%8C%E3%80%81%E3%83%AD%E3%82%B0%E3%81%AF%E7%A9%BA%E3%81%A7%E3%80%81%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AF%E8%B5%B7%E5%8B%95%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F.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 には次の 1 行だけが含まれます。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 が終了するとすぐに、残りのプロセスがすべて強制終了されます。つまり、私の場合、プロセスが強制終了される前にサーバーは実際には短時間実行されていました。そのため、ログ ファイルが空になりました。
私は、単に tomcat を起動およびシャットダウンする init スクリプトを記述することで問題を解決しました。これで、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