Workflow Guide - MocStepan/pdo GitHub Wiki

Práce s YAML pro GitHub Actions

Níže najdete stručný návod, jak strukturovat a pochopit YAML soubor pro GitHub Actions workflow. Ukážeme si základní části, ukázkový soubor a vysvětlíme, co jednotlivé klíče dělají.


1. Základní struktura

Každý workflow v GitHub Actions je definován v YAML souboru umístěném ve složce .github/workflows/. Standardní kostra vypadá takto:

name: Název workflow              # <1>
on:                              # <2>
  push:                          # například spuštění při pushi
    branches:
      - main
jobs:                            # <3>
  build:                         # název prvního jobu
    runs-on: ubuntu-latest       # prostředí, na kterém job běží
    steps:                       # <4>
      - name: Checkout code      # krok 1
        uses: actions/checkout@v3
      - name: Set up Node.js     # krok 2
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      - name: Install deps       # krok 3
        run: npm install
      - name: Run tests          # krok 4
        run: npm test
  1. name: – název workflow, který se zobrazí v GitHub Actions UI.
  2. on: – události, které workflow spouštějí (push, pull_request, schedule, …).
  3. jobs: – obsahuje jeden nebo více jobů (paralelních “úloh”), každý má svůj klíč.
  4. steps: – seznam jednotlivých kroků, které job vykoná (checkout kódu, instalace, build, testy, atd.).

2. Spouštěcí události (on:)

Pod klíčem on: lze definovat více akcí:

on:
  push:
    branches:
      - main
      - release/*
  pull_request:
    types: [opened, synchronize, reopened]
  schedule:
    - cron: '0 2 * * *'         # každý den ve 2:00 UTC
  • push: spustí se při git push.
  • pull_request: spustí se na pull request (otevření, aktualizace, znovuotevření).
  • schedule: periodické spouštění podle cron výrazu.

3. Definice jobu (jobs)

Pod jobs: můžete mít několik jobů, např. build, lint, deploy. Každý job běží izolovaně.

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run ESLint
        run: npm run lint

  build:
    runs-on: ubuntu-latest
    needs: lint                # spustí se až po úspěšném lintu
    steps:
      - uses: actions/checkout@v3
      - name: Build project
        run: npm run build
  • needs: – závislosti mezi joby (řetězení).
  • runs-on: – běhové prostředí (ubuntu, windows, macos).

4. Vlastní kroky (steps)

Každý krok může buď používat existující akci (uses:), nebo spustit vlastní příkaz (run:).

steps:
  - name: Checkout code
    uses: actions/checkout@v3

  - name: Setup Python
    uses: actions/setup-python@v4
    with:
      python-version: '3.11'
  • uses: – reference na akci (repozitář/ACTION@verze).
  • with: – volitelné parametry této akce.
  • run: – shellový příkaz či skript.

5. Ukázkový workflow ci.yaml

name: CI Pipeline

on:
  pull_request:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v3

Tip: Pro složitější projekty rozdělte testy na více jobů (např. unit, integration) a paralelizujte je pomocí matrix:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: [16, 18, 20]
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node }}
      - run: npm ci
      - run: npm test

6. Tipy a best practices

  • Kontrola indentace – YAML je citlivý na mezery. Vždy používejte 2 nebo 4 mezery (důsledně).
  • Sdílení proměnných – využijte env: pro nastavení proměnných prostředí.
  • Snadná debugovatelnost – přidejte krok run: env nebo run: printenv.
  • Opětovné použití kódu – využijte Reusable Workflows pro společné části.

Pokračování: Automatizace integračních testů