为啥 GitLab Ci 找不到我的缓存文件夹?

Posted

技术标签:

【中文标题】为啥 GitLab Ci 找不到我的缓存文件夹?【英文标题】:Why does GitLab Ci not find my cached folder?为什么 GitLab Ci 找不到我的缓存文件夹? 【发布时间】:2021-11-16 16:57:06 【问题描述】:

我有一个在我的 GitLab 中运行的 CI 作业列表,但缓存没有按预期工作:

这就是我的文档生成工作的结束方式:

[09:19:33] Documentation generated in ./documentation/ in 4.397 seconds using gitbook theme
Creating cache angular...
00:02
WARNING: frontend/node_modules: no matching files  
frontend/documentation: found 136 matching files   
No URL provided, cache will be not uploaded to shared cache server. Cache will be stored only locally. 
Created cache
Job succeeded

然后我开始部署作业(到 GitLab 页面)但它失败了,因为它没有找到文档文件夹:

$ cp -r frontend/documentation .public/frontend
cp: cannot stat 'frontend/documentation': No such file or directory

这是一代的缓存配置:

generate_docu_frontend:
  image: node:12.19.0
  stage: build
  cache:
    key: angular
    paths:
      - frontend/node_modules
      - frontend/documentation
  needs: ["download_angular"]

这是用于部署的:

deploy_documentation:
  stage: deploy
  cache:
    - key: angular
      paths:
        - frontend/node_modules
        - frontend/documentation
      policy: pull
    - key: laravel
      paths:
        - backend/vendor
        - backend/public/docs
      policy: pull

有人知道为什么我的文档文件夹丢失了吗?

【问题讨论】:

看起来您的共享缓存配置有问题...No URL provided, cache will be not uploaded to shared cache server.。作为一种快速解决方法,您可以确保两个作业使用相同的跑步者。 顺便说一句,我觉得你最好在这里使用artifacts。 【参考方案1】:

您的作业输出中的消息No URL provided, cache will be not uploaded to shared cache server. Cache will be stored only locally. 仅表示您的跑步者没有使用Amazon S3 来存储您的缓存,或者类似Minio 之类的东西。

没有 S3/Minio,缓存只存在于首先运行作业并缓存资源的运行器上。因此,下次运行作业时,如果它被另一个运行器拾取,它将没有缓存,并且您会遇到这样的错误。

有几种方法可以解决这个问题:

    将您的跑步者配置为使用 S3/Minio(如果您有兴趣自己托管 Minio,它有一个开源、免费使用的许可证)。 只使用一个运行器(不是一个很好的解决方案,因为通常更多的运行器意味着更快的管道,这会大大减慢速度,尽管它会解决缓存问题)。 使用tags。标签用于确保作业在特定运行器上运行。例如,假设您的 10 个运行者中有 1 个可以访问您的生产服务器,但所有人都可以访问您的较低环境服务器。您的低环境作业可以在任何运行器上运行,但您的生产部署作业必须在具有 prod 访问权限的一个运行器上运行。您可以通过在运行器上放置一个名为让我们说prod-access 的标签并在产品部署作业上放置相同的标签来做到这一点。这将确保作业将在具有 prod 访问权限的运行器上运行。在这里可以使用相同的方法来确保缓存可用。 使用artifacts 代替缓存。我将在下面解释此选项,因为它确实是您应该用于此用例的选项。

让我们简单解释一下difference between Cache and Artifacts:

缓存通常最适合用于安装依赖项,例如 npmcomposer(用于 php 项目)。当您有一个运行 npm cicomposer install 的作业时,您不希望它每次都运行,因为您不需要更改依赖项,因为它会浪费时间。使用cache关键字缓存依赖,这样后续的管道就不用重新安装依赖了。

当您需要在同一管道中的作业之间共享文件或目录时,最好使用工件。例如,在安装 npm 依赖项后,您可能需要在管道中的另一个作业中使用 node_modules 目录。在作业结束时,运行器也会将工件上传到 GitLab 服务器,而不是在本地存储在运行作业的运行器上。除非使用dependenciesneeds 控制,否则将为所有后续作业下载所有以前的工件。

工件是您的用例的更好选择。

让我们更新您的.gitlab-ci.yml 文件以使用artifacts 而不是cache

stages:
  - build
  - deploy

generate_docu_frontend:
  image: node:12.19.0
  stage: build
  script:
    - ./generate_docs.sh # this is just a representation of whatever steps you run to generate the docs
  artifacts:
    paths:
      - frontend/node_modules
      - frontend/documentation
    expire_in: 6 hours # your GitLab instance will have a default, you can override it like this
    when: on_success # don't attempt to upload the docs if generating them failed

deploy_documentation:
  stage: deploy
  script:
    - ls # just an example showing that frontend/node_modules and frontend/documentation are present
    - deploy.sh # whatever else you need to run this job

【讨论】:

你有没有找到任何 gitlab 文档关于“只是意味着你的跑步者没有使用 Amazon S3 来存储你的缓存,或者类似 Minio 的东西。”?使用 gitlab 文档调试时遇到问题 它没有明确提到这个警告,但共享/分发的文档是here。它确实讨论了直接在跑步者上分发缓存与缓存。

以上是关于为啥 GitLab Ci 找不到我的缓存文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab CI/CD 运行器:找不到 mvn 命令

在 kotlin 中找不到我的 GitLab CI 测试

Gitlab CI 设置错误 - 找不到 JavaScript 运行时

Latexmk:在 Gitlab CI 中找不到命令

使用带有 gitlab 页面的 jekyll,它说当它使用 gitlab CI 部署网站时找不到主题,我已经安装了它

gitlab-runner 找不到 git