Github actions:如何缓存不同分支的工作流运行之间的依赖关系?

eve*_*der 14 github github-actions

我有一个 CI,它在创建的每个拉取请求和每次推送新提交时运行。此 CI 安装 Python 依赖项,然后运行一些测试。我使用两个单独的requirements.txt 文件,因为其中一个包含较重的包,并且它们在 Docker 中的处理方式不同。我正在尝试使用actions/cache@v2操作来缓存依赖项,但据我所知,它仅在同一分支中的运行之间进行缓存。因此,例如,当我创建新的 PR 时,不会从另一个分支检测到缓存,并且所有内容都会从头开始安装。有没有办法缓存工作流运行之间的依赖关系?那么,如果需求没有发生任何变化,CI 在一个分支中创建的缓存可以被另一个分支使用吗?

查看在两个不同分支中运行的工作流的日志,缓存键是相同的:

  • 工作流程在branchA
Cache not found for input keys: /opt/hostedtoolcache/Python/3.8.12/x64-03a86b868f006751e123da18168c989ab4c3c2713de4f5c87cf732ffbb6fb4ae-cd1b416332d9d5b55f413e2bd74c2efce6107aef1ce3f497fa5a81b9abc83deb
Run Code Online (Sandbox Code Playgroud)
  • 工作流程在branchB
Cache not found for input keys: /opt/hostedtoolcache/Python/3.8.12/x64-03a86b868f006751e123da18168c989ab4c3c2713de4f5c87cf732ffbb6fb4ae-cd1b416332d9d5b55f413e2bd74c2efce6107aef1ce3f497fa5a81b9abc83deb
Run Code Online (Sandbox Code Playgroud)
  • 这是我的工作流程:
Cache not found for input keys: /opt/hostedtoolcache/Python/3.8.12/x64-03a86b868f006751e123da18168c989ab4c3c2713de4f5c87cf732ffbb6fb4ae-cd1b416332d9d5b55f413e2bd74c2efce6107aef1ce3f497fa5a81b9abc83deb
Run Code Online (Sandbox Code Playgroud)

eve*_*der 10

我的问题的解决方案非常愚蠢但有效,详细信息请参见此处。我为每个提交推送的暂存分支创建了一个特定的工作流程,该工作流程将更新缓存(如果需要)。这很有用,因为所有开发分支都是从暂存分支创建的,并且基础分支中可用的每个缓存也可供派生分支使用。所以最后,解决方案与原始帖子类似,但事件已更新。

来自 github 的文档

工作流可以访问和恢复在当前分支、基本分支(包括分叉存储库的基本分支)或默认分支(通常是主分支)中创建的缓存。例如,在默认分支上创建的缓存可以从任何拉取请求访问。此外,如果分支 feature-b 具有基本分支 feature-a,则在 feature-b 上触发的工作流将有权访问在默认分支(主)、feature-a 和 feature-b 中创建的缓存。

name: update-cache

on:
  push:
    branches:
      - "staging"

jobs:
  # This workflow builds the Python package dependencies every time that the requirements
  # files are modified and store it in cache to be accessible by all the CI in all other
  # branches.
  build-cache:
    name: Build Cache
    runs-on: ubuntu-latest

    steps:
      - name: Set up Python 3.8
        uses: actions/setup-python@v2
        with:
          python-version: 3.8

      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Cache dependencies
        uses: actions/cache@v2
        id: cache
        with:
          path: ${{ env.pythonLocation }}
          key: ${{ env.pythonLocation }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements-ml.txt') }}
          restore-keys:
            ${{ env.pythonLocation }}-

      - if: steps.cache.outputs.cache-hit != 'true'
        name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install -r requirements.txt
          python -m pip install -r requirements-ml.txt

Run Code Online (Sandbox Code Playgroud)