我的目标是部署一个测试环境。这是一个 PHP 应用程序,我可以使用嵌入式服务器简单地提供 PHP 文件。
我的 .gitlab-ci.yml 非常简单:
docker_test:
stage: deploy
image: php:7.2
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
environment:
name: development/$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
url: $CI_SERVER_PROTOCOL://$CI_SERVER_HOST:8000/$CI_PROJECT_PATH_SLUG/$CI_ENVIRONMENT_SLUG:8000
auto_stop_in: 1 hour
script:
- php -S 0.0.0.0:8000 -t /builds/$CI_PROJECT_PATH
我想要的是:当管道运行时,环境将处于活动状态,容器应启动并运行,并且测试人员应该能够使用 URL 访问它。一小时后,或者如果按下“停止”按钮,环境应停止,Docker 容器应停止并被删除。但是,我还没有弄清楚如何让容器在后台运行。执行管道时,它会在脚本上冻结,取消时,Docker 容器将停止。
有什么想法可以实现这个目标吗?
答案1
看来 docker runners 不会轻易允许这种情况发生。我刚刚改用了一个 shell 执行器来运行启动和停止所需的 docker 命令:
docker_test:
stage: deploy
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
environment:
name: development/$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
url: $CI_SERVER_PROTOCOL://$CI_SERVER_HOST:8000/$CI_PROJECT_NAME/$CI_ENVIRONMENT_SLUG:8000
auto_stop_in: 1 hour
script: docker run --name $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME --rm -dt -v $CI_PROJECT_DIR:/app:Z -p 8000:8000 php:7.2 php -S 0.0.0.0:8000 -t /app
stop_docker_test:
stage: deploy
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
environment:
name: development/$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
action: stop
when: manual
script: docker stop $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME