GitHub Actions: první CI workflow pro testy a lint
Návod na první GitHub Actions workflow – struktura YAML, spouštěče, testy v Pythonu a Node.js, matice verzí, cache závislostí a služba PostgreSQL.
GitHub Actions je CI/CD přímo v GitHubu. Při každém pushi nebo pull requestu spustí vaše testy na čistém stroji a výsledek ukáže u commitu. Odhalí chyby dřív, než se dostanou do main. Prvních pár workflow zvládnete za odpoledne.
Kam workflow patří
Každý workflow je YAML soubor ve složce .github/workflows/ v repozitáři. Název souboru je libovolný, třeba ci.yml. Po pushi ho GitHub sám najde a výsledky uvidíte v záložce Actions.
Minimální workflow (Python)
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
- name: Instalace závislostí
run: pip install -r requirements.txt
- name: Lint
run: |
pip install ruff
ruff check .
- name: Testy
run: pytest -q
Co jednotlivé části znamenají:
| Klíč | Význam |
|---|---|
on |
kdy se workflow spustí (push do main, každý PR) |
jobs |
jednotlivé úlohy, ve výchozím stavu běží paralelně |
runs-on |
typ stroje (runneru) – ubuntu-latest, windows-latest, macos-latest |
steps |
kroky v pořadí; uses volá hotovou akci, run spustí příkaz v shellu |
Krok actions/checkout je nutný – bez něj runner váš kód vůbec nemá.
Varianta pro Node.js
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run lint
- run: npm test
npm ci instaluje přesně podle package-lock.json a je pro CI vhodnější než npm install.
Matice: testy na více verzích
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- run: pip install -r requirements.txt
- run: pytest
Vzniknou tři paralelní joby. Verze pište v uvozovkách – jinak YAML z 3.10 udělá číslo 3.1.
Databáze pro testy: services
Potřebujete-li PostgreSQL, spusťte ho jako službu vedle jobu:
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_PASSWORD: test
POSTGRES_DB: app_test
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 5s
--health-timeout 5s
--health-retries 5
env:
DATABASE_URL: postgres://postgres:test@localhost:5432/app_test
steps:
- uses: actions/checkout@v4
# ... instalace a testy
Health check zajistí, že kroky začnou až po startu databáze.
Tajné údaje
Hesla a tokeny nikdy nepište do YAML. Uložte je v Settings → Secrets and variables → Actions a použijte:
- run: ./deploy.sh
env:
API_TOKEN: ${{ secrets.API_TOKEN }}
GitHub hodnoty secrets v logu maskuje. Workflow spuštěné z PR z forku k secrets ve výchozím stavu přístup nemají.
Užitečné doplňky
Ruční spuštění tlačítkem v záložce Actions:
on:
workflow_dispatch:
Spouštění jen při změně určitých souborů:
on:
push:
paths:
- "backend/**"
Zrušení starších běhů téže větve, když pushnete znovu:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
Minimální oprávnění tokenu (dobrá bezpečnostní praxe):
permissions:
contents: read
Ladění, když to selže
- Klikněte na neúspěšný job a rozbalte červený krok – uvidíte celý výstup.
- Re-run jobs → Enable debug logging přidá podrobnější logy.
- Lokálně lze workflow zkoušet nástrojem act (
act -j test), který používá Docker. Neodpovídá runneru stoprocentně, ale na rychlé iterace stačí. - Nejčastější chyby: špatné odsazení YAML, chybějící
actions/checkout, verze bez uvozovek, test spoléhající na lokální soubor, který není v repozitáři.
Badge do README

Další krok
Až budou testy zelené, propojte workflow s ochranou větve (Require status checks to pass), aby nešel sloučit PR s rozbitými testy. A pak můžete přidat automatický deploy na VPS.