一尘不染

如何使用GitLab运行程序启动服务并防止其停止?

spring-boot

我将使用GitLab CI服务器部署简单的Spring Boot应用程序。我.gitlab-ci.yml的如下:

stages:
  - build_and_test
  - deploy

web_server_build_and_test:
  stage: build_and_test
  script:
    - mvn clean package

web_server_deploy:
  stage: deploy
  script:
    - mvn clean package -Pprod
    - service gitlab-runner-test stop
    - cp target/*.war /var/gitlab-runner-test/gitlab-runner-test.war
    - chmod +x /var/gitlab-runner-test/gitlab-runner-test.war
    - service gitlab-runner-test start

deploy阶段产生以下输出:

$ service gitlab-runner-test stop
Stopped [13247]
$ cp target/*.war /var/gitlab-runner-test/gitlab-runner-test.war
$ chmod +x /var/gitlab-runner-test/gitlab-runner-test.war
$ service gitlab-runner-test start
Started [21177]

但是,由于跑步者完成阶段后服务已停止,因此我无法加载应用程序:

$ service gitlab-runner-test status
Not running (process 21177 not found)

我的服务脚本将实际工作委托给组装好的war软件包:

#!/usr/bin/env bash

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre/bin/java
export MODE=service
export APP_NAME=gitlab-runner-test
export PID_FOLDER=/var/run/gitlab-runner-test


/var/gitlab-runner-test/gitlab-runner-test.war $*

而且,当我手动启动服务(service gitlab-runner-test start)时,即使关闭了用户会话,它仍然保持运行状态。

我不确定问题的根源是什么-Spring Boot启动脚本,GitLab配置,我的服务脚本或其他内容?

我正在使用GitLab CI多运行者版本0.5.0(c38415a)运行Ubuntu 14.04。

UPD:

将Runner升级到版本1.0.1(cffb5c7)不能解决问题。


阅读 1321

收藏
2020-05-30

共1个答案

一尘不染

为什么这样做是个坏主意…

正如其文档中明确指出的那样,GitLab Runner “运行 测试 并将结果发送到GitLab”。

而且由于应该及时启动和停止测试,因此设计人员可以在完成每次构建后终止所有已创建的过程。

因此,杀死服务不是 错误 ,而是 功能 。;)

GitLab
CI文档建议使用dpl进行
部署

dpl是一个项目,可让您在各种PaaS提供商(例如Google App Engine,Heroku或Elastic Beanstalk)中部署应用程序。

因此,它会向某些REST API发出一些请求,或者通过Internet推送一些其他数据,并且其过程会很好地退出。

因此,要做您想做的事情实际上需要进行一些修改-覆盖默认的运行器行为。而且,您不应该将它作为长期解决方案,因为它可能会因为某些runner /
gitlab更新而停止工作。

…但是如果您坚持要这样做,那么这是方法:)

好的,这是说明:

  1. 确保您可以使用中的SSH私钥从运行主机托管到本身的SSH /root/.ssh/id_rsa,而无需输入密码,也无需确认指纹。ssh localhost运行root应该非交互地工作。

  2. 编辑您的gitlab-runner的配置文件,/etc/gitlab-runner/config.toml使其看起来像这样:

    [[runners]]
    

    name = “your-runner-name”
    url = “https:///ci”
    token = “
    tls-ca-file = “”
    executor = “ssh”
    [runners.ssh]
    user = “root”
    password = “”
    host = “localhost”
    port = “22”
    identity_file = “/root/.ssh/id_rsa”

(跑步者将在保存配置文件后重新加载自身)

  1. 编辑您的服务脚本,这样它将创建的进程将不是init脚本的子进程,并且不会打开stdin,stdout和stderr:

    #!/usr/bin/env bash
    

    export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre/bin/java
    export MODE=service
    export APP_NAME=gitlab-runner-test
    export PID_FOLDER=/var/run/gitlab-runner-test

    /var/gitlab-runner-test/gitlab-runner-test.war $* <&- >&- 2>&- & disown

通过重试上次构建或提交项目回购进行测试。


PS我用如下初始化脚本测试了我的解决方案:

#!/usr/bin/env bash

start() {
  # Completely disowned process, not a child
  # Credits: Joe at https://stackoverflow.com/a/26420299/2693875
  sleep 99999 <&- >&- 2>&- & disown
  exit 0
}

stop() {
  echo "doing nothing"
  exit 0
}

echo "running on $HOSTNAME..."

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  *)
    echo $"Use this options $0 {start|stop}"
    exit 1
esac

..在具有gitlab-multi-runner v.1.02和GitLab CE 8.5.0的Ubuntu 14.04上。

2020-05-30