我试图为单声道存储库设置GitLab CI。
为了论证,我们假设我要处理2个JavaScript包:
我已定义了3个阶段:
因为我正在重复使用之前步骤中的文件,所以我使用了GitLab缓存。
我的配置如下:
stages:
- install
- test
- build
- deploy
install_app:
stage: install
image: node:8.9
cache:
policy: push
paths:
- app/node_modules
script:
- cd app
- npm install
install_cli:
stage: install
image: node:8.9
cache:
policy: push
paths:
- cli/node_modules
script:
- cd cli
- npm install
test_app:
image: node:8.9
cache:
policy: pull
paths:
- app/node_modules
script:
- cd app
- npm test
test_cli:
image: node:8.9
cache:
policy: pull
paths:
- cli/node_modules
script:
- cd cli
- npm test
build_app:
stage: build
image: node:8.9
cache:
paths:
- app/node_modules
- app/build
script:
- cd app
- npm run build
deploy_app:
stage: deploy
image: registry.gitlab.com/my/gcloud/image
only:
- master
environment:
name: staging
url: https://example.com
cache:
policy: pull
paths:
- app/build
script:
- gcloud app deploy app/build/app.yaml
--verbosity info
--version master
--promote
--stop-previous-version
--quiet
--project "$GOOGLE_CLOUD_PROJECT"
问题出在测试阶段。大多数情况下test_app
作业失败,因为缺少app/node_modules
目录。有时重试是有效的,但大部分都没有。
另外,我想为build_app
作业使用两个缓存。我想提取app/node_modules
并推送app/build
。我无法找到实现这一目标的方法。这让我觉得我不完全理解缓存是如何工作的。
为什么我的缓存文件消失了?我是否误解了GitLab CI缓存的工作原理?
答案 0 :(得分:1)
缓存是在尽力而为的基础上提供的,因此不要指望缓存始终存在。
如果您的作业之间存在硬依赖关系,请使用artifacts和dependencies。
无论如何,如果它仅适用于node_modules
,我建议你在每一步安装它,而不是使用工件 - 你不会在工件上节省太多时间。