如何使用GitLab运行程序启动服务并防止其停止?
我将使用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 stopStopped [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 statusNot running (process 21177 not found)
我的服务脚本将实际工作委托给组装好的war
软件包:
#!/usr/bin/env bashexport 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。
将Runner升级到版本1.0.1(cffb5c7)不能解决问题。
回答:
为什么这样做是个坏主意…
正如其文档中明确指出的那样,GitLab Runner “运行 并将结果发送到GitLab”。
而且由于应该及时启动和停止测试,因此设计人员可以在完成每次构建后终止所有已创建的过程。
因此,杀死服务不是 错误 ,而是 功能 。;)
GitLab
CI文档建议使用dpl进行
。
dpl是一个项目,可让您在各种PaaS提供商(例如Google App Engine,Heroku或Elastic Beanstalk)中部署应用程序。
因此,它会向某些REST API发出一些请求,或者通过Internet推送一些其他数据,并且其过程会很好地退出。
因此,要做您想做的事情实际上需要进行一些修改-覆盖默认的运行器行为。而且,您不应该将它作为长期解决方案,因为它可能会因为某些runner /
gitlab更新而停止工作。
…但是如果您坚持要这样做,那么这是方法:)
好的,这是说明:
确保您可以使用中的SSH私钥从运行主机托管到本身的SSH
/root/.ssh/id_rsa
,而无需输入密码,也无需确认指纹。ssh localhost
运行root
应该非交互地工作。编辑您的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”
(跑步者将在保存配置文件后重新加载自身)
编辑您的服务脚本,这样它将创建的进程将不是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 bashstart() {
# 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上。
以上是 如何使用GitLab运行程序启动服务并防止其停止? 的全部内容, 来源链接: utcz.com/qa/433661.html