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 startlog/catalina.out 파일에는 다음 한 줄만 포함됩니다.tomcat Listening for transport dt_socket at address: 8080


환경이 다르다고 생각해서 cmd로 확인해 봤습니다 env. TERM=unknowngitlab-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가 완료되자마자 나머지 모든 프로세스가 종료됩니다. 이는 제 경우에는 프로세스가 종료되기 전에 서버가 실제로 짧은 시간 동안 실행 중이었음을 의미합니다. 그래서 빈 로그 파일이 생겼습니다.

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

관련 정보