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 には次の 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

関連情報