要使用 GitHub 操作缓存,我应该在工作流.yml 文件中将“key”的值设置为什么?

问题描述 投票:0回答:1

我正在尝试使用 Github 操作部署到 S3。我已经创建了 .github/workflows 目录,并遵循教程来帮助我编写工作流.yml 文件。

一切似乎都运行良好,直到我需要缓存node_modules。我遵循的教程没有详细说明或解释需要向“键”添加什么值以及从哪里获取该值。目前我刚刚使用了我的存储库的名称,但我认为这是不正确的。这就是我的 .yml 文件的缓存部分现在的样子...

- name: Caching Gatsby
        id: gatsby-cache-build
        uses: actions/cache@v2
        with:
          path: |
            public
            .cache
            node_modules
          key: ${{ runner.os }}-gatsby-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-gatsby-

当我的操作在 Github 中运行时收到的错误是“找不到输入键的缓存:Linux-gatsby-1563397146,Linux-gatsby-”

我尝试阅读 Github 上有关这些键的使用的文档,但我发现它们太难理解了。我认为这里需要使用一些特定的值,具体取决于构建脚本的运行方式以及我的安装方式。我允许构建在 ubuntu-latest 上运行,并使用 npm 进行安装并运行构建。

谁能告诉我,我在“key”和“restore-keys”旁边使用什么值以及从哪里获取这些值?

github deployment github-actions continuous-deployment
1个回答
1
投票

这不起作用,因为

${{ github.run_id }}
仅标识存储库中的工作流程,并且在重新运行时不会更改,因此不会检测到后续提交中对已安装包的更改,因为它会像第一次一样重用缓存已创建。

您应该选择一个唯一标识缓存目录将包含的内容并相应更改的键。在您的情况下,将是 package-lock.json 文件的内容,您可以对其进行哈希处理。

所以像这样:

- name: Caching Gatsby
    id: gatsby-cache-build
    uses: actions/cache@v2
    with:
      path: |
        public
        .cache
        node_modules
      key: ${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}

一些注意事项:

  1. 只有作业成功才会保存缓存
  2. 缓存是不可变的(我花了一段时间才发现这一点)
  3. 缓存的范围仅限于分支,因此它不会找到为另一个分支创建的具有相同键的缓存,默认分支除外。
  4. 如果没有找到完全匹配的键,它会查看恢复键并使用这些键来“填充”您的目录以及找到的内容,但这不算是缓存命中,因此您的目录将被保存如果作业成功则到它自己的缓存(我认为这是正确的) 如果您没有获得缓存匹配,则用作缓存的目录将只是在运行器上找到的目录,在某些情况下(例如Python的站点包)已经包含大量文件。根据该目录所在的位置,它可能不会在运行之间被清除,这意味着即使没有缓存命中,您也会预先安装大量软件包,这会加快速度,但也可能会搞砸。
  5. 动作缓存功能有时有点问题,它可能无法找到明显存在的缓存。
  6. Github 的
自己的缓存页面

很好地解释了这一点。它非常简洁,值得仔细梳理,因此当它实际上以另一种方式工作时,您不会假设它以一种方式工作。

© www.soinside.com 2019 - 2024. All rights reserved.