为什么这样做是一个坏主意......
正如其文档明确指出的那样,亚搏体育app亚搏体育app亚搏体育app运行 https://gitlab.com/gitlab-org/gitlab-ci-multi-runner "runs tests并将结果发送到 GitLab”。
由于测试应及时启动和停止,因此运行程序被设计为在完成每次构建后终止所有创建的进程。
所以这不是一个bug你的服务被杀死了,这是一个feature. ;)
亚搏体育appGitLab CI文档推荐使用 dpl https://docs.gitlab.com/ce/ci/examples/deployment/README.html for 部署.
dpl 是一个项目,使您能够在各种 PaaS 提供商(例如 Google App Engine、Heroku 或 Elastic Beanstalk)上部署应用程序。
因此,它会向某些 REST API 发出一些请求,或者通过互联网推送一些其他数据,并且其进程会很好地退出。
因此,做你想做的事情实际上需要一些黑客行为 - 覆盖默认的跑步者行为。而且您不应该将其作为长期解决方案,因为它可能会因某些 runner/gitlab 更新而停止工作。
...但是如果您坚持,那么这里是操作方法:)
就您而言,当您想要在跑步者主机本身上实际部署和运行应用程序时,我们需要使用两个技巧:
- 不要使用默认值
shell
跑步者执行者但是ssh
并使执行器 ssh 到自身(受到启发迈克尔对这个问题的解答 https://stackoverflow.com/a/33840561/2693875(如果支持我的答案,请也支持他的答案!),
- 否认初始化脚本正在运行的进程(乔对这个问题的解答 https://stackoverflow.com/a/26420299/2693875(再次 - 请点赞!)
好的,这是说明:
确保您可以使用 SSH 私钥从运行器主机通过 SSH 连接到自身/root/.ssh/id_rsa
,无需密码,无需确认指纹。ssh localhost
run by root
应该以非交互方式工作。
-
编辑 gitlab-runner 的配置文件,/etc/gitlab-runner/config.toml
使它看起来像这样:
[[runners]]
name = "your-runner-name"
url = "https://<your_gitlab_instance_fqdn>/ci"
token = "<your_project_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 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
..在 Ubuntu 14.04 上,使用 gitlab-multi-runner v. 1.02 和 GitLab CE 8.5.0。