Github Actions:如何在不同分支的工作流运行之间缓存依赖项?

9
我有一个CI,它会在每次创建拉取请求和推送新的提交时运行。该CI会安装Python依赖并运行一些测试。我使用两个不同的requirements.txt文件,因为其中一个包含更重的软件包,并且它们在Docker中处理方式不同。
我试图使用actions/cache@v2操作来缓存这些依赖项,但据我所了解,它仅在同一分支的运行之间进行缓存。因此,例如当我创建一个新的PR时,缓存将无法从另一个分支检测到,而所有内容都将从头开始安装。
是否有办法在workflow运行之间缓存依赖项?这样,如果requirements没有发生变化,则可以通过一个分支中CI创建的缓存来供另一个分支使用吗?
查看运行于两个不同分支的工作流日志,缓存键是相同的:
  • 位于 branchA 的工作流
Cache not found for input keys: /opt/hostedtoolcache/Python/3.8.12/x64-03a86b868f006751e123da18168c989ab4c3c2713de4f5c87cf732ffbb6fb4ae-cd1b416332d9d5b55f413e2bd74c2efce6107aef1ce3f497fa5a81b9abc83deb
  • branchB中的工作流程
Cache not found for input keys: /opt/hostedtoolcache/Python/3.8.12/x64-03a86b868f006751e123da18168c989ab4c3c2713de4f5c87cf732ffbb6fb4ae-cd1b416332d9d5b55f413e2bd74c2efce6107aef1ce3f497fa5a81b9abc83deb
  • 这是我的工作流程:
name: ci

on:
  pull_request:
    types: [opened, synchronize]
    branches-ignore:
      - "master"
      - "staging"

  push:
    branches-ignore:
      - "master"
      - "staging"

jobs:
  run-tests:
    name: Run tests
    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
        with:
          path: ${{ env.pythonLocation }}
          key: ${{ env.pythonLocation }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements-ml.txt') }}

      - 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

@LearningToNLP 是的,我做到了!问题在于,由于我们所有的分支都是针对“staging”分支创建的,因此在基本分支中创建的任何缓存都将可用于从中创建的分支。因此,我在暂存CI中创建了一个新作业,每次有新的推送事件时都会并行更新缓存。但好处是只有在真正需要时才会更新缓存。我将我的解决方案发布为答案。 - everspader
1个回答

4
我的问题的解决方案非常愚蠢但有效。我为每个提交推送创建了一个特定的工作流程,以更新缓存(如果需要)。这很有帮助,因为所有开发分支都是从暂存分支创建的,并且基本分支中可用的所有缓存也可用于派生分支。因此,在最后,解决方案就像原始帖子一样,但事件已更新。
来自Github 文档

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接