Community
12
HostiServer
2026-08-31 11:18

GitHub Actions vs GitLab CI vs Gitea Actions v roce 2026: co zvolit pro self-hosted CI/CD

⏱️ Doba čtení: ~13 minut | 📅 Aktualizováno: srpen 2026

GitHub Actions vs GitLab CI vs Gitea Actions v roce 2026: co zvolit pro self-hosted CI/CD

Ve třech předchozích částech jsme udělali stejnou práci třikrát. Scénář byl pokaždé stejný: push do main, sestavení, testy, nasazení na produkci přes SSH, ověření, že aplikace naběhla. Měnila se jen platforma.

Teď se vyplatí položit tato tři řešení vedle sebe. Ne proto, abychom určili vítěze, protože žádný neexistuje: všechny tři svou práci odvedou a kteroukoli z nich lze dotáhnout do funkčního stavu. Otázka je jiná — která z nich dá vašemu konkrétnímu týmu méně zbytečné práce, s jeho kódem, požadavky a časem, který je ochoten věnovat administraci.

1.1 Co přesně srovnáváme

Podmínky jsou pro všechny tři stejné: kód v soukromém repozitáři, sestavení a deploy probíhají na vašem VPS, produkce v uzavřené síti, přístup přes SSH se samostatným uživatelem bez práv root.

Klíčová věc, kterou tato série ukázala v praxi: self-hosted runner odpovídá na otázku, kde se kód provádí, a neodpovídá na otázku, kde se ukládá. Jde o dvě různá rozhodnutí a jejich zaměňování je zdrojem většiny chyb při výběru.

2. Konfigurační soubor a struktura

2.1 Kde žije konfigurace

Platforma Cesta Počet souborů
GitHub Actions .github/workflows/*.yml Libovolné množství
GitLab CI .gitlab-ci.yml Jeden, zbytek přes include
Gitea Actions .gitea/workflows/*.yml Libovolné množství

Rozdíl není kosmetický. Na GitHubu a Gitea leží kontroly pro pull request, noční skenování a release podle tagu v samostatných souborech, které se upravují nezávisle. Na GitLabu je jeden vstupní bod a dělení se provádí přes include, což má jiný efekt: konfiguraci lze snadno centralizovat v samostatném repozitáři šablon a připojovat k desítkám projektů.

2.2 Hierarchie

GitHub Actions a Gitea Actions mají stejnou stavbu: onjobssteps. Stages jako samostatná entita neexistují, pořadí se určuje přes needs.

GitLab CI je postaven jinak: stages → úlohy → script. Stages se deklarují explicitně a provádějí se sekvenčně, a uvnitř úlohy nejsou kroky — je tam seznam příkazů.

# GitHub / Gitea
jobs:
build:
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run build

# GitLab
stages: [build, test, deploy]

build:
stage: build
script:
- npm ci
- npm run build

Praktický důsledek je vidět na velkém pipeline. Stages GitLabu se čtou shora dolů jako pořadí provádění, což je pohodlné, když konfiguraci prohlíží člověk zvenčí: auditor, nový inženýr, zákazník. Model GitHubu je flexibilnější, ale abyste viděli pořadí, musíte projít řetězec needs mezi úlohami.

2.3 Prostředí úlohy

Na GitLabu se image uvádí na úrovni úlohy klíčem image, a to je základní způsob práce: úloha běží v kontejneru.

Na GitHubu a Gitea je kontejner volitelný. Ve výchozím stavu se kroky provádějí přímo na runneru, a pro spuštění v kontejneru slouží klíč container na úrovni úlohy. Potřebné verze jazyků se častěji instalují akcemi jako setup-node, setup-python a podobnými.

# GitLab: kontejner ve výchozím stavu
test:
image: node:20
script: [npm test]

# GitHub / Gitea: verze přes akci
jobs:
test:
steps:
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm test

2.4 Podmíněné spuštění

Tady se logika liší a při migraci si toto místo žádá pozornost.

Na GitHubu a Gitea se klíč if nastavuje na úlohu nebo krok a vyhodnocuje výraz:

deploy:
if: github.ref == 'refs/heads/main'

Na GitLabu se seznam rules kontroluje shora dolů, uplatní se první shodující se pravidlo a to určuje víc než jen to, zda se úloha spustí:

deploy:
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
allow_failure: false
- when: never

Rozdíl v možnostech: rules řeší najednou tři otázky — zda se úloha dostane do pipeline, zda bude ruční, zda blokuje výsledek. Na GitHubu a Gitea se totéž skládá z několika mechanismů: if, workflow_dispatch, environment s potvrzením.

3. Secrets a proměnné

3.1 Syntaxe

GitHub a Gitea přistupují k secrets stejně, přes kontext:

run: ./deploy.sh
env:
KEY: ${{ secrets.SSH_PRIVATE_KEY }}

GitLab dosazuje secret jako běžnou proměnnou prostředí, bez samostatného jmenného prostoru:

script:
- ./deploy.sh
variables:
KEY: $SSH_PRIVATE_KEY

Za tím stojí rozdíl v modelu. Na GitHubu a Gitea je secret samostatná entita s vlastním úložištěm. Na GitLabu je to proměnná s ochrannými příznaky, a právě příznaky určují, nakolik je chráněná. Odtud hlavní pravidlo čtvrté části: Masked bez Protected nechrání před ničím vážným.

3.2 Úrovně uložení

Úroveň GitHub Actions GitLab CI Gitea Actions
Repozitář Ano Ano Ano
Organizace nebo skupina Ano Ano, s dědičností podskupinami Ano
Celá instalace Jen Enterprise Ano, u self-managed Ano
Environment (staging / production) Ano, s potvrzením revizora Ano, přes scope Není

Jeden řádek tady rozhoduje víc než zbytek. Environments v Gitea neexistují, takže oddělení přístupů mezi staging a produkcí je třeba dělat ručně: různými jmény secrets, samostatnými repozitáři nebo samostatnými runnery s různými štítky. Pro tým dvou lidí je to drobnost, pro proces, kde deploy na produkci vyžaduje potvrzení odpovědné osoby, jde o vážné omezení.

ℹ️ K úrovním v Gitea: ve starších návodech se objevuje tvrzení, že secrets tam existují jen na úrovni repozitáře. To je zastaralé: secrets se ukládají na úrovni uživatele, organizace nebo repozitáře, a při shodě jmen má prioritu nižší úroveň. Co skutečně chybí, jsou environments.

4. Runner a executor

Mechanika provádění je u všech tří stejná, a to je hlavní věc, kterou si z této série odnést. Agent se sám obrací na platformu, vezme si úlohu z fronty, provede ji a vrátí logy. Platforma nikam úlohy „netlačí", takže agent nepotřebuje otevřené vstupní porty ani veřejnou adresu.

Parametr GitHub Actions GitLab CI Gitea Actions
Agent actions/runner gitlab-runner act_runner
Provádění na hostu Výchozí Executor shell Štítek s :host
Provádění v kontejneru Klíč container Executor docker Štítek s docker://
Kubernetes Přes Actions Runner Controller Executor kubernetes Není
Paralelní úlohy na agentovi Jedna, potřeba víc agentů Víc, klíč concurrent Víc, klíč capacity
Zapouzdření jako služba Skript svc.sh Balíček to udělá sám Unit se píše ručně

Srovnání architektury runnerů: GitHub Actions, GitLab CI a Gitea Actions vedle sebe

Řádek o paralelismu má praktickou váhu při plánování serveru. Jeden agent GitHubu bere jednu úlohu, takže pro čtyři paralelní sestavení se registrují čtyři agenti. GitLab a Gitea dělají totéž jedním procesem a jedním parametrem v konfiguraci.

Řádek o Kubernetes je důležitý, pokud sestavení už žijí v clusteru. Na GitLabu je to vestavěný executor, na GitHubu samostatný kontrolér, na Gitea se musíte spokojit s kontejnery na VPS.

5. Jeden deploy, tři konfigurace

Úkol je stejný: nahrát sestavené soubory na server přes rsync a restartovat službu. Zobrazeny jsou jen bloky deploye, sestavení a testy vypadají u všech tří stejně.

5.1 GitHub Actions

deploy:
needs: build
runs-on: [self-hosted, linux, deploy]
environment: production
steps:
- uses: actions/download-artifact@v4
with: { name: dist, path: dist/ }

- name: Připravit SSH
run: |
install -m 700 -d ~/.ssh
install -m 600 /dev/null ~/.ssh/deploy_key
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
echo "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts

- name: Nahrát a restartovat
run: |
rsync -az --delete -e "ssh -i ~/.ssh/deploy_key" \
dist/ deploy@${{ secrets.DEPLOY_HOST }}:/var/www/app/
ssh -i ~/.ssh/deploy_key deploy@${{ secrets.DEPLOY_HOST }} \
"sudo systemctl restart app.service"

- name: Uklidit klíč
if: always()
run: rm -f ~/.ssh/deploy_key

5.2 GitLab CI

deploy-production:
stage: deploy
tags: [self-hosted, shell]
environment:
name: production
url: https://app.example.com
dependencies: [build]
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
allow_failure: false
before_script:
- chmod 600 "$SSH_PRIVATE_KEY" # proměnná typu File
after_script:
- shred -u "$SSH_PRIVATE_KEY" 2>/dev/null || rm -f "$SSH_PRIVATE_KEY"
script:
- |
rsync -az --delete \
-e "ssh -i $SSH_PRIVATE_KEY -o UserKnownHostsFile=$SSH_KNOWN_HOSTS" \
dist/ deploy@$DEPLOY_HOST:/var/www/app/
- |
ssh -i "$SSH_PRIVATE_KEY" -o UserKnownHostsFile="$SSH_KNOWN_HOSTS" \
deploy@$DEPLOY_HOST "sudo systemctl restart app.service"

5.3 Gitea Actions

deploy:
needs: build
runs-on: deploy # štítek host režimu
steps:
- uses: actions/download-artifact@v3 # v4 potřebuje GitHub API
with: { name: dist, path: dist/ }

- name: Připravit SSH
run: |
install -m 700 -d ~/.ssh
install -m 600 /dev/null ~/.ssh/deploy_key
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
echo "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts

- name: Nahrát a restartovat
run: |
rsync -az --delete -e "ssh -i ~/.ssh/deploy_key" \
dist/ deploy@${{ secrets.DEPLOY_HOST }}:/var/www/app/
ssh -i ~/.ssh/deploy_key deploy@${{ secrets.DEPLOY_HOST }} \
"sudo systemctl restart app.service"

- name: Uklidit klíč
if: always()
run: rm -f ~/.ssh/deploy_key

5.4 Co z toho je vidět

  • GitHub a Gitea se téměř shodují. Rozdíly se scvrkávají na štítek v runs-on, verze akcí a absenci environment.
  • GitLab si bere víc práce s klíčem na sebe. Proměnná typu File vytvoří dočasný soubor sama, takže kroky s echo nejsou potřeba.
  • Ruční krok se realizuje jinak všude. Na GitLabu je to when: manual v pravidle, na GitHubu environment s revizorem, na Gitea samostatný workflow s workflow_dispatch.
  • Hotové akce lákají všude. Krok s appleboy/ssh-action je kratší než ruční rsync, ale v Gitea se táhne z GitHubu, a na trvalém runneru vidí kterákoli cizí akce vaše secrets. Pro jeden rsync a jeden ssh se ta závislost nevyplatí.
  • Úklid klíče je povinný všude. Prostředí na self-hosted runneru je trvalé a zapomenutý klíč zůstává dostupný další úloze, ať přijde z jakékoli větve.

6. Srovnávací tabulka

Kritérium GitHub Actions GitLab CI Gitea Actions
Konfigurační soubor .github/workflows/*.yml .gitlab-ci.yml .gitea/workflows/*.yml
Struktura jobs → steps stages → jobs → script jobs → steps
Syntaxe secretu ${{ secrets.NAME }} $NAME ${{ secrets.NAME }}
Secrets skupiny nebo organizace Ano Ano Ano
Environment s potvrzením Ano Ano Ne
Kubernetes executor Přes ARC Ano Ne
Ekosystém hotových kroků Tisíce akcí v Marketplace CI Components a šablony Částečná kompatibilita s akcemi GitHubu
Reporty testů v rozhraní Přes akce třetích stran Vestavěno, vidět v merge requestu Omezeně
Historie deployů a rollback Přes Environments Vestavěno, tlačítko Rollback Není
Zdroje na server platformy Nejsou potřeba Od 4 GB RAM pro self-managed Od 1 GB RAM
Kde se ukládá kód github.com gitlab.com nebo váš server Jen váš server

O bezplatných minutách záměrně bez čísel: tarify se mění častěji, než se aktualizují články. Celkový obrázek je stabilní — GitHub dává neomezené minuty veřejným repozitářům a omezenou kvótu soukromým, GitLab dává kvótu na bezplatném tarifu, Gitea nepočítá nic, protože všechno běží u vás. Aktuální čísla ověřte na stránkách s tarify. Hlavní je tady něco jiného: minuty na vlastním runneru se nepočítají u žádné z platforem, takže kvóta přestává být argumentem, jakmile máte vlastního agenta.

7. Pro koho se co hodí

7.1 GitHub Actions

  • Projekt už je na GitHubu. Nejsilnější argument, který převáží ostatní: přesouvat repozitář kvůli CI se skoro nikdy nevyplatí.
  • Open source. Veřejné repozitáře dostávají cloudová sestavení bez limitu minut a vlastní agent nepotřebují, a dokonce se nedoporučuje.
  • Potřebujete hotové kroky. Marketplace řeší typické úkoly jedním řádkem: sestavení image, publikace balíčků, reporty pokrytí.
  • Tým bez zkušeností s CI. Nejnižší vstupní práh: soubor se upravuje přímo v prohlížeči, chyby jsou vidět hned.

Proti: na self-hosted agentovi se opatrnost s cizími akcemi stává povinností a část toho, co je v GitLabu vestavěné (reporty, historie deployů), se musí skládat z akcí třetích stran.

7.2 GitLab CI

  • Tým už je na GitLabu. Stejný argument jako výše, zrcadlově.
  • Složité pipeline. Stages, graf závislostí, dceřiné pipeline a matice dávají víc kontroly u konfigurací s desítkami úloh.
  • Hodně projektů se stejným nastavením. Proměnné na úrovni skupiny a include z centralizovaného repozitáře šablon znatelně šetří práci.
  • Potřebujete audit a transparentnost. Explicitní pořadí stages čte člověk zvenčí bez rozplétání závislostí a historie deployů ukazuje, který commit je aktuálně na produkci.
  • Kubernetes hned teď. Vestavěný executor bez samostatného kontroléru.

Proti: vlastní instalace GitLabu je znatelně těžší služba než Gitea. Pokud potřebujete spíš uzavřený okruh než složité pipeline, tato varianta je náročnější na zdroje.

7.3 Gitea Actions

  • Kód nesmí opustit vaši infrastrukturu. Smluvní závazky, izolovaná síť, plná kontrola nad daty.
  • Malý tým a jeden server. Git platforma a runner žijí na stejném VPS, potřeba je méně zdrojů než u GitLabu.
  • Zkušenost s GitHub Actions už máte. Syntaxe se přenáší téměř celá, není potřeba se přeučovat.
  • Rozpočet. Žádná platba za uživatele, jen cena serveru.

Proti: nejsou environments s potvrzením, není historie deployů, není Kubernetes a ekosystém akcí je omezený. Navíc veškerá administrace je vaše: zálohy, aktualizace, HTTPS, zrcadlo akcí pro uzavřený okruh.

Rozhodovací schéma pro výběr self-hosted CI/CD platformy: GitHub Actions, GitLab CI nebo Gitea Actions podle požadavků týmu

⚠️ Nejčastější chyba při výběru: přesunout repozitář na jinou platformu kvůli možnostem CI. Náklady na migraci (historie, issues, přístupová práva, zvyky týmu, integrace) téměř vždy převýší přínos. Nejprve se podívejte, zda váš problém neřeší vlastní runner na aktuální platformě. Ve většině případů ano.

8. Závěr

Série začala otázkou, co je vůbec CI/CD, a končí výběrem ze tří funkčních nástrojů. Co si z ní odnést celkově:

  • Dvě různé otázky. Self-hosted runner rozhoduje o tom, kde se kód provádí. Kde se ukládá, je samostatné rozhodnutí, a jejich zaměňování je zdrojem většiny chyb při výběru platformy.
  • Pokud kód může ležet v cloudu — zvolte platformu, na které už tým pracuje, a přidejte vlastního agenta. Je to nejlevnější cesta ke kontrole nad zdroji a přístupem do uzavřené sítě.
  • Pokud kód musí zůstat u vás — Gitea pro malý tým, self-managed GitLab tam, kde potřebujete složité pipeline a plnou sadu vestavěných možností.
  • Mechanika je všude stejná. Agent se dotazuje fronty, provede úlohu, vrátí logy. Jakmile zvládnete jednu platformu, přečtete konfigurace ostatních bez slovníku.
  • Trvalé prostředí vyžaduje disciplínu. Úklid klíčů, timeouty, omezení paralelismu a opatrnost s akcemi třetích stran. To je cena za rychlost a kontrolu.

Praktický plán pro toho, kdo začíná od nuly: rozjeďte nejjednodušší dvoukrokový pipeline na aktuální platformě, dotáhněte ho do zeleného stavu, a teprve pak přidejte vlastního runnera. Deploy připojte jako poslední, až budou sestavení a testy stabilní. Tento postup dá funkční výsledek za pár dní místo pár týdnů strávených nastavováním všeho najednou.

📚 Navigace v sérii:
Čtete část 6 ze 6 „GitHub Actions vs GitLab CI vs Gitea Actions v roce 2026: co zvolit pro self-hosted CI/CD".
Předchozí: ← Část 5. Gitea Actions: Git platforma a pipeline na jednom serveru
Série je dokončena. Začít od začátku: Část 1. Co je CI/CD: od ručního nasazení k automatizovaným pipeline

🚀 Server pro váš CI/CD, ať zvolíte jakoukoli platformu

GitHub Actions, GitLab CI nebo Gitea — agent ve všech třech případech naráží na CPU, disk a síť. Hostiserver pro to dává předvídatelné zdroje a privátní síť, ze které lze bezpečně dosáhnout na produkci.

🖥️ Dedikované servery

  • Od $90/měsíc, plná kontrola nad hardwarem pro náročná sestavení a paralelní úlohy
  • NVMe úložiště: rychlá cache závislostí a Docker vrstev mezi běhy
  • Bez limitu minut sestavení: platíte za server, ne za kvótu platformy
  • Privátní síť mezi runnerem a produkčními servery
  • Podpora 24/7: inženýři pomohou s nastavením runnerů a deployi

💻 Cloud (VPS) hosting

  • Od $19.95/měsíc, KVM izolace, vyhrazené vCPU a RAM
  • Ideální pro prvního runnera: rozjet, připojit k repozitáři, vyzkoušet na reálném projektu
  • Snadné škálování: samostatné stroje pro sestavení a pro deploy, jakmile jeden přestane stačit

💬 Nejste si jistí, kterou variantu potřebujete?
💬 Napište nám a se vším pomůžeme!

Časté dotazy

Vyplatí se měnit platformu kvůli možnostem CI?

Skoro nikdy. Migrace s sebou vezme historii commitů, issues, přístupová práva, nastavené integrace a zvyky týmu, a přínos se obvykle scvrkne na pár pohodlností. Nejprve ověřte, zda váš problém neřeší vlastní runner na aktuální platformě: zdroje, přístup do uzavřené sítě a zrušení limitu minut jsou dostupné u všech tří. Skutečné důvody k přesunu jsou požadavek uchovávat kód u sebe a odchod od platformy z licenčních nebo cenových důvodů.

Jak náročné je přenést pipeline mezi těmito platformami?

Mezi GitHub Actions a Gitea Actions jde skoro o kopírování: upravuje se runs-on, verze akcí, které volají GitHub API, a sada nástrojů v image. Mezi GitHubem a GitLabem je práce víc: úlohy se stávají úlohami, runs-on se mění na tags, kroky s run se přesouvají do script a každý krok s uses se nahrazuje příkazy nebo image kontejneru. Přepisuje se i logika spouštění: if se mění na rules. Pro typický pipeline jde o pár hodin práce.

Co dělat, když je potřeba potvrzení před deployem na produkci a platforma je Gitea?

Environments s revizory v Gitea nejsou, takže se ruční krok staví jinak. Nejjednodušší varianta je samostatný workflow s triggerem workflow_dispatch, který se spouští tlačítkem a bere hotový artefakt. Druhá varianta je deploy podle tagu: nasazení se spustí až tehdy, když někdo vytvoří release tag, a právo na to je omezené pravidly ochrany větví a tagů. Třetí je samostatný runner se štítkem pro produkci, dostupný jen konkrétnímu repozitáři.

Lze udržovat kód na více místech najednou?

Ano, a je to funkční schéma pro uzavřený okruh s veřejnou částí. Gitea umí zrcadlit repozitáře oběma směry: tahat z externího zdroje nebo tam posílat změny. Typické použití je hlavní práce ve vlastní Gitea a zrcadlo na GitHubu pro veřejnou část. Počítejte s tím, že pipeline je třeba udržovat jen na jedné straně, jinak jedna změna spustí dvě sestavení a deploy se může stát dvakrát.

Kolik runnerů tým potřebuje?

Orientujte se podle počtu současných sestavení ve špičce, ne podle počtu lidí. Pro tým pěti inženýrů obvykle stačí dvě paralelní úlohy: jedna pro kontroly na pull requestu, druhá pro výchozí větev. Na GitLabu a Gitea je to jeden agent s odpovídajícím parametrem v konfiguraci, na GitHubu jsou to dva samostatní agenti. Deploy je lepší dát na samostatný runner s jiným štítkem: potřebuje přístup ke klíčům a míchat ho se sestaveními se nevyplatí.

Je bezpečné používat akce třetích stran na vlastním runneru?

Opatrněji než v cloudu. Akce třetí strany je cizí kód, který běží ve vašem prostředí a vidí secrets úlohy, a server na rozdíl od jednorázového cloudového stroje žije dál. Funkční pravidla: přišpendlete akce na plný commit hash místo pohyblivého tagu, omezte seznam povolených akcí v nastavení a pro jednoduché kroky jako rsync přes SSH pište příkazy sami. Pro Gitea přibývá ještě jedno: akce se ve výchozím stavu táhnou z github.com, což pro skutečně uzavřený okruh vyžaduje zrcadlo.

Co zvolit, když požadavky ještě nejsou jasné?

Zůstaňte na platformě, kde už kód leží, a začněte nejjednodušším pipeline: sestavení a testy při každém push. To stačí k získání hlavního přínosu CI a stačí to k pochopení vlastních požadavků na zbytek. Vlastní runner se přidává jako další krok, jakmile bude jasné, co chybí: zdroje, přístup do sítě nebo minuty. Otázka o uchovávání kódu se řeší samostatně a obvykle ji nerozhodují inženýři, ale podmínky smlouvy.

Contents

Sdílejte tento článek

MANAGED VPS STARTING AT

$19 95 / mo

NEW INTEL XEON BASED SERVERS

$80 / mo

CDN STARTING AT

$0 / mo

 

Tento web používá cookies. Používáním tohoto webu souhlasíte s politikou ochrany osobních údajů.