我有一个GitHub Actions工作流,当一个pull请求被创建到dev时触发。它下载一些pip依赖并使用PyLint检查项目。在此操作中,它查找pip依赖项的缓存。如果找到,就使用它来下载需求。合并拉请求后,我有一个被触发的合并后工作流。这个工作流有一个动作,它将缓存分支开发上的pip依赖项,如果它还不存在的话。因此,任何后续对开发工作流的pull请求都应该有权访问这个缓存。
我有同样的直觉,这里的问题,非常密切地跟随,试图模仿他们有什么,但无法产生相同的结果。我遇到的另一个问题是,这个问题和我下面要做的事情是一样的。最初,我看到缓存被安装到特定的拉取请求,即refs/pull/.../merge
,我明白这就是为什么没有后续的拉取请求可以访问缓存。拉取请求缓存操作如下:
pylint-backend:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Cache pip packages
id: cache-pip
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Checking existence of pip cache
run: echo "Cache exists ${{ steps.cache-pip.outputs.cache-hit }}"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r ./back-end/requirements.txt
pip install pylint
为了解决这个问题,我通读了缓存文档和这个问题,其中说功能分支可以访问基本分支上的缓存。因此,我包含了一个post merge到dev操作,它将在dev分支上创建这个缓存。这个动作看起来像这样:
create-pip-cache:
runs-on: ubuntu-latest
steps:
- name: Checkout the code
uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Creating the cache, won't create if it exists
id: cache-pip
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Installing dependencies if the cache doesn't hit
if: ${{ steps.cache-pip.outputs.cache-hit != 'true' }}
run: pip install -r ./back-end/clientdek/requirements.txt
现在,在两个工作流都运行之后,正如预期的那样,pull request工作流找不到缓存,因为它还不存在于dev上。我合并了分支,合并后的操作开始了。现在,缓存确实存在于dev上。我从另一个分支创建了另一个拉请求到dev。pull请求工作流中的缓存操作查找键中具有完全相同哈希值的完全相同的缓存,但仍然表示未找到。为什么会这样呢?我已经验证了缓存与确切的关键存在于开发上,那么为什么一个工作流被从开发的子分支的拉请求触发无法在开发上找到缓存,如果文档说它可以?我的猜测是,任何推送工作流到我的子分支都可以访问开发缓存,但拉请求在不同的环境中运行,因此没有访问权限。
我找到了一个解决这个问题的方法。问题是,在我的后合并工作流程中,标题看起来像这样:
name: Post Dev Merge Tasks
on:
pull_request:
types:
- "closed"
branches: [dev]
虽然这在开发分支上创建了缓存,但它不能被pull请求工作流访问。为了解决这个问题,我将其更改为
name: Post Dev Merge Tasks
on:
push:
branches: [dev]
workflow_dispatch:
这使得所有的差异和拉请求工作流能够访问缓存。