デプロイメント後に 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