O CI de uma biblioteca
O que só quebra fora da sua máquina — e o formato de defeito que isso sempre tem.
A suíte local não é o que o CI roda, e a diferença não é detalhe. Todo defeito desta classe tem o mesmo formato: uma decisão do ambiente que o repositório não contém.
yaml
name: ci
on: [push, pull_request]
jobs:
testes:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-15, windows-latest]
python: ["3.10", "3.13"]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "${{ matrix.python }}" }
- run: pip install dataforge-lang
- run: dataforge check . --strict
- run: dataforge fmt . --check
- run: dataforge test . --cobertura --minimo=80
- run: dataforge install && dataforge test . # numa pasta limpa
As cinco do Windows#
| Sintoma | Causa |
|---|---|
[Errno 22] com o caminho mutilado | "C:\temp" numa string: \t é tabulação. Em macOS e Linux é pior — o nome é válido, e o arquivo nasce em outro lugar sem erro nenhum |
| traceback depois de o pacote estar pronto | which é do Unix; use shutil.which, que também conhece PATHEXT |
WSAEINVAL (10022) | getsockname num socket ainda não ligado; no Unix devolve 0 |
| a conexão “expira” onde devia ser recusada | o firewall descarta o SYN de uma porta fechada |
| saída ilegível de um subprocesso | a saída do Windows não é UTF-8 — declare encoding |
O relatório também mente#
| O quê | O efeito |
|---|---|
pytest -rf lista o que falhou, não o que deu erro | 11 erros invisíveis no resumo por meses — use -rfE |
o resumo corta no primeiro \n | a anotação do job mostrou a primeira linha de um stdout de sucesso como motivo de reprovação |
| o que é gerado fora do repositório não existe no CI | todo pacote saiu com o manifesto e zero JavaScript, porque a compilação só rodava nesta máquina |
Continue em Prometer desempenho e DevOps.