gpt4 book ai didi

caching - 仅当在 gitlab ci 中未缓存或 package.json 更改时,我如何才能运行依赖项安装作业?

转载 作者:行者123 更新时间:2023-12-03 14:23:26 25 4
gpt4 key购买 nike

我在 gitlab 中有一个带有角度前端和 nestjs 后端的 monorepo。我每个人都有 package.json ,根中有 1 个。我的管道由多个阶段组成,如下所示:

stages:
- build
- verify
- test
- deploy

我在 .pre 有一份工作安装依赖项的阶段。如果 package-lock.json 中的任何一个,我想在作业之间以及分支之间缓存它们改变了,而且如果没有缓存 node_modules目前。
我有一份看起来像这样的工作:
prepare:
stage: .pre
script:
- npm run ci-deps # runs npm ci in each folder
cache:
key: $CI_PROJECT_ID
paths:
- node_modules/
- frontend/node_modules/
- backend/node_modules/
only:
changes:
- '**/package-lock.json'

现在的问题是,如果缓存以某种方式被清除,或者我没有对 package-lock.json 进行更改第一次推送时,我根本不会运行这项工作,因此其他一切都会失败,因为它需要 node_modules .如果我删除 changes:从那里,然后它为每个管道运行作业。当然,我仍然可以在作业之间共享它,但是如果我再次提交并推送它需要近 2 分钟来安装所有依赖项,即使我没有更改任何关于应该存在的内容......我错过了什么吗?如何以某种方式缓存它,以便仅在缓存过时或不存在时才重新安装依赖项?

最佳答案

最后,我想我可以在不依赖 gitlab ci 功能的情况下做到这一点,但可以像这样进行自己的检查:

prepare:
stage: .pre
image: node:12
script:
- if [[ ! -d node_modules ]] || [[ -n `git diff --name-only HEAD~1 HEAD | grep "\package.json\b"` ]];
then
npm ci;
fi
- if [[ ! -d frontend/node_modules ]] || [[ -n `git diff --name-only HEAD~1 HEAD | grep "\frontend/package.json\b"` ]];
then
npm run ci-deps:frontend;
fi
- if [[ ! -d backend/node_modules ]] || [[ -n `git diff --name-only HEAD~1 HEAD | grep "\backend/package.json\b"` ]];
then
npm run ci-deps:backend;
fi
cache:
key: '$CI_COMMIT_REF_SLUG-$CI_PROJECT_DIR'
paths:
- node_modules/
- frontend/node_modules
- backend/node_modules

这样做的好处是,它只会在项目的特定部分安装依赖项,如果它还没有 node_modules 或者 package.json 被更改。但是,如果我推送多个提交并且 package.json 不会在最后一次更改,则这可能是错误的。在这种情况下,我仍然可以手动清除缓存并重新运行管道,但我会尝试进一步改进我的脚本并更新我的答案。

关于caching - 仅当在 gitlab ci 中未缓存或 package.json 更改时,我如何才能运行依赖项安装作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60092738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com