Estou tentando otimizar o fluxo de trabalho de CI/CD no GitHub Actions para meu projeto movendo o cache de dependências para o primeiro trabalho. As dependências são baseadas em dois arquivos requirements.txt
e requirements_dev.txt
. O cache é criado, mas parece conter apenas dependências do primeiro arquivo (trabalhos que usam dependências do segundo arquivo falham em pacotes ausentes). Não encontrei nenhuma ajuda na actions/setup-python@v5
documentação ou em nenhum tópico semelhante do Stack Overflow (havia alguns relacionados ao cache de trabalho, mas não ao setup-python
). O que estou fazendo errado aqui?
name: code quality
on: [push, workflow_dispatch]
jobs:
check-cache:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: python setup
id: pydeps
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
cache-dependency-path: 'requirements*.txt'
- name: dependencies
if: steps.pydeps.outputs.cache-hit == 'false'
run: |
python -m pip install -r requirements.txt
python -m pip install -r requirements_dev.txt
lint:
needs: check-cache
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: check black and mypy
run: |
python -m black --check src
python -m mypy src
test-unit:
needs: check-cache
name: run unit tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: test code
id: test
run: python -m pytest tests/unit_tests
- name: test artifacts
if: failure() && steps.test.outcome == 'failure'
uses: actions/upload-artifact@v4
with:
name: log-unit-tests
path: logs-unit
test-module:
needs: check-cache
name: run module tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: test code
id: test
run: python -m pytest tests/module_tests
- name: test artifacts
if: failure() && steps.test.outcome == 'failure'
uses: actions/upload-artifact@v4
with:
name: log-module-tests
path: logs-module
EDIT: Executei novamente o fluxo de trabalho com pip install -r requirements -r requirements_dev.txt
lint e trabalhos de teste adicionados, e descobri que eles requirements.txt
foram instalados novamente (nenhuma mensagem dizendo "Requisito já atendido"), então não é apenas um problema com o requirements_dev.txt
.
Você está armazenando dependências em cache usando:
cache-dependency-path: 'requirements*.txt'
o que está correto — isso irá gerar uma chave de cache com base no conteúdo de
requirements.txt
erequirements_dev.txt
.Entretanto, em
check-cache
, você instala dependências:python -m pip install -r requirements.txt
python -m pip install -r requirements_dev.txt
Mas em seus outros empregos, você:
não instale o Python nem dependências, então o cache nem estará sendo usado.
setup-python@v5
não é invocado nos trabalhoslint
,test-unit
etest-module
, então a lógica do cache pip nunca entra em ação lá.A solução:
Adicionar
setup-python@v5
e instalar dependências em todos os trabalhosVeja como você deve refatorar seus trabalhos (por exemplo, para
lint
):Por que seu cache parece vazio em outros trabalhos
Cada trabalho do GitHub Actions é executado em uma VM nova — o
pip
cache de um trabalho (comocheck-cache
) não persiste, a menos que:Você usa
setup-python
em cada trabalhoVocê usa
cache: pip
+ mesmocache-dependency-path
Você executa novamente
pip install
cada trabalho para ler do cache