在我们的GitLab CI环境中,我们有一个构建服务器,它有很多RAM,但有机械磁盘,运行npm安装需要很长时间(我添加了缓存,但它仍然需要咀嚼现有的包,所以缓存无法单独解决所有这些问题(。
我想以tmpfs的形式在构建器docker映像中挂载/构建,但我很难弄清楚该将此配置放在哪里。我可以在构建器图像本身中这样做吗?或者可以在每个项目的.gitlab-ci.yml中这样做?
目前我的gitlab-ci.yml看起来是这样的:
image: docker:latest
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
cache:
key: node_modules-${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
stages:
- test
test:
image: docker-builder-javascript
stage: test
before_script:
- npm install
script:
- npm test
我发现,直接在before_script部分使用mount命令可以解决这个问题,尽管这需要您复制源代码。我设法大大减少了测试时间。
image: docker:latest
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
stages:
- test
test:
image: docker-builder-javascript
stage: test
before_script:
# Mount RAM filesystem to speed up build
- mkdir /rambuild
- mount -t tmpfs -o size=1G tmpfs /rambuild
- rsync -r --filter=":- .gitignore" . /rambuild
- cd /rambuild
# Print Node.js npm versions
- node --version
- npm --version
# Install dependencies
- npm ci
script:
- npm test
由于我现在使用npm ci
命令而不是npm install
,所以我不再使用缓存,因为它在每次运行时都会清除缓存。
您可能想要这样的东西来在runner上添加数据卷:
volumes = ["/path/to/volume/in/container"]
https://docs.gitlab.com/runner/configuration/advanced-configuration.html#example-1-adding-a-data-volume
不过,我可能会使用文章中的第二个选项,并从主机容器中添加数据卷,以防缓存因某种原因损坏,因为这样更容易清理。
volumes = ["/path/to/bind/from/host:/path/to/bind/in/container:rw"]
我以前为作曲家缓存做过这样的操作,效果非常好。您应该能够使用.gitlab-ci.yaml:中的以下环境变量为npm设置缓存
npm_config_cache=/path/to/cache
另一种选择是在构建之间使用工件,如下所述:如何在.gitlab-ci.yml中的docker容器中装载卷?