我有一个远程服务器,可以通过Nginx为我的项目提供服务。我正在使用Gitlab CI来自动化部署过程,但遇到了问题。 当我将提交推送到master分支时,gitlab-runner运行良好,但问题是它删除了我的React build文件夹(没关系,因为我已经将其放入.gitignore中了),但是因为它总是删除我的构建文件夹,所以在构建完成之前,Nginx无法提供任何文件,并且创建了新的构建文件夹。 此问题有解决方案吗?如果可以在构建过程完成之前缓存构建文件,那就太好了。我附加了gitlab.ci.yml。谢谢你!
image: docker:latest
services:
- docker:dind
stages:
- build
- deploy
variables:
GIT_SSL_NO_VERIFY: "1"
build-step:
stage: build
tags:
- shell
script:
- docker image prune -f
- docker-compose -f docker-compose.yml -f docker-compose.prod.yml build
deploy-step:
stage: deploy
tags:
- shell
script:
- docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
答案 0 :(得分:1)
应该可以在启动部署作业时使用git fetch并禁用git clean。这是变量的链接,以执行此操作:
https://docs.gitlab.com/ee/ci/yaml/#git-clean-flags
https://docs.gitlab.com/ee/ci/yaml/#git-strategy
它看起来像这样:
deploy-step:
variables:
GIT_STRATEGY: fetch
GIT_CLEAN_FLAGS: none
stage: deploy
tags:
- shell
script:
- docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
这应该使GitLab使用git fetch
而不是git clone
,并且不要运行任何git clean ...
命令。然后,不应删除之前运行的构建工件。
但是这有一些问题。如果构建出现问题,您可能最终不得不手动登录到运行程序要对其进行修复的服务器。 GitLab使用git clean
的原因是为了防止此类问题。
一个更合适的解决方案是使用nginx来拥有一种dubble缓冲区。您可以有两个不同的构建文件夹,在nginx中更改配置,然后向nginx发送信号以重新加载配置。然后,nginx将确保正常切换到应用程序的新版本,而不会出现任何中断。这是执行此操作的人的链接:
https://syshero.org/2016-06-09-zero-downtime-deployments-using-nginx/