【问题标题】:Clear cache in GitHub Actions清除 GitHub Actions 中的缓存
【发布时间】:2020-12-10 18:08:21
【问题描述】:

我正在开发一个 R 包并使用 GitHub Action (GHA) 作为持续集成 (CI) 提供程序。我使用actions/cache 缓存 R 包(依赖项)。现在我想清除所有缓存。我该怎么做?


我使用的 GHA 工作流程的一部分:
on: push

name: R-CMD-check

jobs:
  R-CMD-check:
    runs-on: ${{ matrix.config.os }}

    name: ${{ matrix.config.os }} (${{ matrix.config.r }})

    strategy:
      fail-fast: false
      matrix:
        config:
          # - {os: windows-latest, r: 'devel'}
          - {os: macOS-latest,   r: 'release'}

    env:
      R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
      RSPM: ${{ matrix.config.rspm }}
      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

    steps:
      - uses: actions/checkout@v2

      - uses: r-lib/actions/setup-r@master

      - name: Query dependencies
        run: |
          repos <- c("https://r-hyperspec.github.io/hySpc.pkgs/", getOption("repos"))
          saveRDS("remotes::dev_package_deps(dependencies = TRUE)", ".github/depends.Rds", version = 2)
          writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version")
        shell: Rscript {0}

      - name: Cache R packages
        if: runner.os != 'Windows'
        uses: actions/cache@v1
        with:
          path: ${{ env.R_LIBS_USER }}
          key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }}
          restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-

      - name: Install dependencies
        run:   remotes::install_deps(dependencies = TRUE)
        shell: Rscript {0}

      - name: Session info
        run: |
          options(width = 100)
          pkgs <- installed.packages()[, "Package"]
          sessioninfo::session_info(pkgs, include_base = TRUE)
        shell: Rscript {0}

【问题讨论】:

标签: caching github-actions


【解决方案1】:

您目前无法强制清除缓存,目前似乎有一个开放的功能请求https://github.com/actions/cache/issues/2。如果我是你,我也会在那里发布请求,以便他们知道更多人希望实现该功能。

关于该操作的一些注意事项:

动作中没有参数,甚至在构建此动作的工具包中也没有。

深入研究工具包代码,他们使用缓存 api url 来做所有好事。这意味着我们甚至不知道该 api 是否支持它,假设我们尝试对其进行测试并通过直接点击它来查看它还提供了什么。这是从 env ACTIONS_CACHE_URL 获取基本 url 的 api 调用行

https://github.com/actions/toolkit/blob/c2bc747506bf562195a02bd4fdb1ff2a95d8b7ed/packages/cache/src/internal/cacheHttpClient.ts#L44

npm 包作为参考 https://www.npmjs.com/package/@actions/cache

既然我们已经深入研究了动作/缓存代码及其工作原理,那么如果我们退后一步,回到 github 文档,

根据 github 文档https://docs.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows

有两点需要注意,

Once you create a cache, you cannot change the contents of an existing 
cache but you can create a new cache with a new key.
GitHub will remove any cache entries that have not been accessed in over 7 days.

【讨论】:

    【解决方案2】:

    @GegznaV 你可以使用tmate 之类的东西,并通过 ssh 进入跑步者手动清除缓存。

    【讨论】:

      【解决方案3】:

      正如corresponding issue中所指出的,目前还没有清除缓存的原生解决方案。

      但是,使用新缓存有两种实用的解决方法。这与清除当前缓存并不完全相同,但它确实可以完成这项工作。

      为此,您必须更改缓存key(以及任何restore-keys)。因为如果键不同,这将被视为缓存未命中,您将从一个新的开始。

      您可以通过直接修改工作流文件来更改缓存键,例如,通过添加版本号:

      key: ${{ runner.os }}-mycache-v1-${{ hashFiles(...) }}
      

      如果你现在想使用一个新的缓存,你所要做的就是提交一个不同的版本号:

      key: ${{ runner.os }}-mycache-v2-${{ hashFiles(...) }}
      

      如果你不想修改工作流文件而更喜欢使用 UI,你可以滥用secrets

      key: ${{ runner.os }}-mycache-${{ secrets.CACHE_VERSION }}-${{ hashFiles(...) }}
      

      每当密码发生变化时,都会使用新的缓存。

      【讨论】:

      • 看起来,如果您在同一个缓存上重新运行不同的工作流程,它会得到更新。
      • @red-isso 你到底是什么意思?如果两个(或更多)不同的工作流共享同一个缓存?
      • @beatngu13 巧妙地利用秘密来破坏缓存!谢谢!
      • 感谢您的回答。我想另一种选择是通过 on/workflow_dispatch/CACHE_VERSION 使用构建参数,以便在手动发布构建时设置新版本。
      • @zakmck 基本上是的,但是当没有手动触发构建并且缓存版本输入为空(或默认为某个值)时,则再次使用旧/损坏的缓存;至少在它被实际驱逐之前。因此,如果缓存导致构建问题,可以使用这种方法进行快速测试。如果是这种情况,仍然需要永久更改密钥。
      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2023-01-27
      • 2021-06-25
      • 2020-06-14
      • 2021-11-18
      • 2020-07-15
      • 2020-04-03
      相关资源
      最近更新 更多