【问题标题】:Where should caching occur in a GitHub Action?GitHub Action 中的缓存应该发生在哪里?
【发布时间】:2021-09-25 11:35:13
【问题描述】:

caching in a GitHub Action 的正确位置是什么?具体来说,在使用其他操作运行工具设置之前或之后放置它是否正确?

例如,如果我是 using somethinghaskell/actions/setup 一样,我应该在使用 actions/cache 之前还是之后使用它?换句话说:如果setup 随后在我的 Action 的未来运行中安装更新的组件,缓存的相应部分是否会失效?

【问题讨论】:

  • example workflow 表明它位于您的操作之前。
  • @DannyB 该示例没有显示缓存在工具安装中的位置。特别是使用另一个动作安装工具。就是这个问题。
  • 缓存操作只是根据密钥将文件夹复制到永久位置。如果您正在使用另一个创建/使用缓存的操作,则缓存操作需要与其集成(如ruby setup action is doing),或者按照链接示例(或我的答案)中的说明进行配置。
  • @DannyB 那么在安装工具的haskell/actions/setup 之类的情况下,缓存会继续吗?
  • 不,缓存总是在前面——“后面”部分是自动发生的。理想情况下,haskell 操作的作者可以在他们的操作中实现缓存,但如果他们不这样做,那么您需要做的就是了解您想要缓存的文件夹,并使用该文件夹设置缓存操作,然后适当的键(可能使用我在代表依赖列表的 haskell 文件中提到的散列函数)。

标签: caching github-actions haskell-stack


【解决方案1】:

缓存操作应放置在任何消耗或创建该缓存的步骤之前。这一步负责:

  1. 定义缓存参数。
  2. 恢复缓存,如果它在过去被缓存。

GitHub Actions 将在所有步骤之后运行“Post *”步骤,这将存储缓存以供将来调用。

查看来自documentation 的示例工作流。

例如,考虑这个示例工作流:

name: Caching Test

on: push

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Enable Cache
      id: cache-action
      uses: actions/cache@v2
      with:
        path: cache-folder
        key: ${{ runner.os }}-cache-key

    - name: Use or generate the cache
      if: steps.cache-action.outputs.cache-hit != 'true'
      run: mkdir cache-folder && touch cache-folder/hello

    - name: Verify we have our cached file
      run: ls cache-folder

这是第一次运行时的样子:

这是第二次运行时的样子:

GitHub 不会使缓存失效。相反,开发者有责任确保缓存键对于它所代表的内容是唯一的。

执行此操作的常用方法是设置缓存键,使其包含存储库中文件的哈希,以便对该文件的更改将产生不同的缓存键。这种行为的一个很好的例子是,当您拥有列出所有存储库依赖项的锁定文件时(requirements.txt 用于 pyrhon,Gemfile.lock 用于 ruby​​ 等)。

这是通过类似这样的语法实现的:

key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}

如文档的Creating a cache key 部分所述。

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 2019-01-02
    • 2015-02-13
    • 2010-09-19
    • 2022-12-09
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多