12k
All articles

5 Alternativen zu GitHub Actions für Frontend-Teams

Vergleichen Sie fünf GitHub-Actions-Alternativen für Frontend-Teams: CircleCI, Buildkite, Jenkins, Woodpecker CI und Dagger, mit Beispielen und Empfehlungen.

OpenReplay Team
OpenReplay Team
5 Alternativen zu GitHub Actions für Frontend-Teams

Die besten Alternativen zu GitHub Actions für Frontend-Teams sind CircleCI für vollständig gehostete CI, Buildkite für eine gehostete Control Plane mit gehosteten oder selbst gehosteten Agents, Jenkins und Woodpecker CI für vollständig selbst gehostete CI sowie Dagger für Pipelines as Code, die auf dem Laptop und in jedem beliebigen CI-System identisch laufen.

Der Auslöser ist meist eine Rechnung voller Runner-Minuten, ein Pull Request, der in einer Warteschlange festhängt, oder ein Workflow, der nur auf den Runnern von GitHub fehlschlägt und auf dem eigenen Rechner nie. Dieser Artikel setzt voraus, dass Sie das Workflow-Modell von GitHub Actions bereits kennen. Er vergleicht fünf Optionen anhand derselben drei Kriterien: Für wen eignet sich das jeweilige Tool, wo laufen die Jobs, und wie sieht ein Job mit Installation, Linting, Tests und Build für ein Node-Frontend aus?

Die wichtigsten Punkte

  • Wenn jeder CI-Job nur npm ci, npm run lint, npm test und npm run build aufruft, bedeutet ein Wechsel des CI-Tools, ein paar Zeilen YAML umzuschreiben – nicht die Logik der Pipeline.
  • Buildkite hostet die Orchestrierung, während die Jobs auf Agents laufen: von Buildkite gehostete Linux-Agents, von Buildkite gehostete macOS-Agents in kostenpflichtigen Tarifen oder Maschinen, die Ihr Team selbst betreibt.
  • CircleCI ist eine gehostete CI, die in .circleci/config.yml konfiguriert wird, und unterstützt selbst gehostete Runner in jedem Tarif, auch im Free-Tarif.
  • Jenkins und Woodpecker werden selbst gehostet. Statt pro Minute zahlen Sie dann für Server und Wartung.
  • Dagger ist kein CI-Dienst, sondern Pipeline-Code, der lokal und innerhalb jeder bereits genutzten CI läuft.

Warum suchen Frontend-Teams nach Alternativen zu GitHub Actions?

Frontend-Teams wenden sich meist aus einem von vier Gründen von GitHub Actions ab: Die Minuten auf gehosteten Runnern sind zu teuer, gehostete Runner hängen in der Warteschlange, Agents sollen auf eigener Hardware laufen, oder eine CI/CD-Pipeline lässt sich lokal nicht reproduzieren. Prüfen Sie den zweiten Grund vor einer Migration genau. Wenn wartende gehostete Runner Ihr einziges Problem sind, können selbst gehostete Runner für GitHub Actions das Problem lösen, ohne das Tool zu wechseln. GitLab CI/CD lohnt sich vor allem dann, wenn Sie auch Ihre Repositories umziehen würden; die Einrichtung wird in GitLab CI/CD pipelines beschrieben.

Damit der Vergleich fair bleibt, liegt die Build-Logik in der package.json, sodass jedes CI-Tool dieselben Skripte aufruft:

{
  "scripts": {
    "lint": "eslint .",
    "test": "vitest run",
    "build": "vite build"
  }
}

Ersetzen Sie diese durch die Befehle Ihres Frameworks. In jedem der folgenden Beispiele erledigt die CI-Konfiguration nur eine Aufgabe: Sie führt npm ci und anschließend diese drei Skripte aus.

Buildkite

Buildkite eignet sich für Teams, die eine gehostete Orchestrierung wünschen, aber die Kontrolle über die Maschinen behalten müssen, auf denen ihre Jobs laufen. Buildkite unterstützt beide Modelle: selbst betriebene Agents und Agents, die Buildkite für Sie hostet. Von Buildkite gehostete Linux-Agents stehen in jedem Tarif zur Verfügung, auch im Free-Tarif, der auf die kleine Maschinengröße beschränkt ist. Von Buildkite gehostete macOS-Agents setzen einen Pro- oder Enterprise-Tarif voraus. Selbst gehostete Agents fragen Buildkite per Polling nach Aufgaben ab, sodass Sie keine eingehenden Ports öffnen müssen. Für den Einstieg bietet Buildkite ein kostenloses Konto an.

# .buildkite/pipeline.yml
steps:
  - label: "Install, lint, test, build"
    commands:
      - npm ci
      - npm run lint
      - npm test
      - npm run build
    plugins:
      - docker#v5.14.0:
          image: "node:<your-node-version>"

Das Docker-Plugin führt die Befehle innerhalb eines Node-Images aus, sodass auf dem Agent nur Docker installiert sein muss. Ist Node bereits auf dem Agent installiert, können Sie den plugins-Block weglassen.

Fazit: Buildkite passt am besten, wenn Sie die Rechenleistung selbst kontrollieren möchten, ohne einen CI-Server zu betreiben. Der Kompromiss: Sofern Sie keine gehosteten Agents nutzen, verwalten Sie die Agent-Flotte selbst.

CircleCI

CircleCI eignet sich für Teams, die einen vollständig gehosteten Dienst mit minimalem Infrastrukturaufwand wünschen. CircleCI setzt primär auf Hosting, bietet aber auch selbst gehostete Runner in allen Tarifen an, auch im Free-Tarif. Standardmäßig läuft Ihr Code auf der Infrastruktur von CircleCI. Laut der Einführung in die Konfiguration ist 2.1 die aktuellste Version.

# .circleci/config.yml
version: 2.1

jobs:
  build:
    docker:
      - image: cimg/node:<full.node.version>
    steps:
      - checkout
      - run: npm ci
      - run: npm run lint
      - run: npm test
      - run: npm run build

workflows:
  ci:
    jobs:
      - build

Pinnen Sie cimg/node auf die vollständige Node-Version Ihres Projekts. CircleCI unterstützt auch Dependency-Caching, das hier jedoch weggelassen wurde, um das Beispiel kurz zu halten. YAML-Fehler sind ein häufiger Grund, warum der erste Push zu CircleCI fehlschlägt. Es lohnt sich daher, die Datei mit dem YAML-Validator von OpenReplay zu prüfen, um Syntaxfehler vor dem Commit zu finden.

Fazit: CircleCI ist der direkteste Ersatz für GitHub Actions. Es ist sinnvoll, wenn Minuten und Warteschlangen das Problem sind, Sie aber trotzdem keine Server betreiben möchten.

Jenkins

Jenkins eignet sich für Teams mit strikten On-Premises-Anforderungen und jemandem, der Zeit für die Wartung hat. Jenkins wird ausschließlich selbst gehostet. Die Software ist kostenlos und Open Source, doch die Kosten verlagern sich von der minutengenauen Abrechnung hin zu Servern, Plugins und Upgrades, um die sich Ihr Team kümmern muss. Pipelines werden in einer Jenkinsfile in deklarativer Pipeline-Syntax definiert:

pipeline {
    agent any
    stages {
        stage('Install') { steps { sh 'npm ci' } }
        stage('Lint')    { steps { sh 'npm run lint' } }
        stage('Test')    { steps { sh 'npm test' } }
        stage('Build')   { steps { sh 'npm run build' } }
    }
}

agent any setzt voraus, dass Node auf jedem Agent installiert ist, der den Job übernimmt.

Fazit: Entscheiden Sie sich nur dann für Jenkins, wenn Self-Hosting eine zwingende Anforderung ist. Für die meisten Frontend-Teams kostet die Wartung mehr, als die eingesparten Minuten wert sind.

Woodpecker CI

Woodpecker CI eignet sich für kleine Teams, die eine schlanke, selbst gehostete CI mit vertraut wirkendem YAML suchen. Woodpecker CI wird selbst gehostet, und jeder Step führt seine Befehle in dem Container aus, der im Step angegeben ist, wie in der Workflow-Syntax beschrieben. Workflows können in einem .woodpecker/-Verzeichnis abgelegt werden, mit einem Workflow pro Datei.

# .woodpecker/ci.yaml
steps:
  - name: install
    image: node:<your-node-version>
    commands:
      - npm ci
  - name: lint
    image: node:<your-node-version>
    commands:
      - npm run lint
  - name: test
    image: node:<your-node-version>
    commands:
      - npm test
  - name: build
    image: node:<your-node-version>
    commands:
      - npm run build

Die Aufteilung in vier Steps bedeutet nicht, dass viermal installiert wird. Steps laufen standardmäßig nacheinander, und der ausgecheckte Workspace wird in jeden Step gemountet, sodass der node_modules-Ordner aus install auch in build noch vorhanden ist. Sind woodpecker-cli und ein unterstütztes Backend installiert, können Sie einen Workflow lokal ausführen, und zwar mit woodpecker-cli exec, bevor Sie ihn pushen.

Fazit: Für Self-Hosting ist Woodpecker CI die einfachere Wahl als Jenkins. Der Nachteil: Server und Agents betreiben Sie selbst.

Dagger: Pipelines as Code statt CI-Dienst

Dagger ist kein gehosteter CI-Dienst und ersetzt auch keinen. Sie schreiben die Pipeline als Code mit einem Dagger-SDK, und derselbe Code läuft auf dem Laptop und in jedem CI-System, einschließlich GitHub Actions. Die SDK-Dokumentation deckt Go, Python, TypeScript, Java, PHP und Elixir ab, dazu Dang, die eigene Skriptsprache von Dagger. Hier derselbe Job in TypeScript, mit einem Modul, das mit dagger init --sdk=typescript --name=frontend-ci erstellt wurde:

import { dag, Directory, object, func } from "@dagger.io/dagger"

@object()
class FrontendCi {
  @func()
  async check(source: Directory, nodeVersion: string): Promise<string> {
    return await dag
      .container()
      .from(`node:${nodeVersion}`)
      .withMountedDirectory("/src", source)
      .withWorkdir("/src")
      .withExec(["npm", "ci"])
      .withExec(["npm", "run", "lint"])
      .withExec(["npm", "test"])
      .withExec(["npm", "run", "build"])
      .stdout()
  }
}

Lokal führen Sie das Ganze mit dagger call check --source=. --node-version=<your-node-version> aus. Ihr bestehender CI-Job führt dann genau diesen Befehl aus und sonst nichts. Wenn ein lokaler Lauf erfolgreich ist, führt der CI-Lauf exakt dieselben Container-Schritte aus. Der Preis dafür: ein weiteres SDK und eine weitere Engine, die das Team lernen muss.

Diese Befehle gelten für Dagger 0.x. Dagger 1.0, im Oktober 2026 als Beta angekündigt, benennt sie um: dagger module init erstellt ein Modul, und aus dagger call wird dagger api call. Der TypeScript-Code selbst bleibt unverändert.

Wie wählen Sie eine Alternative zu GitHub Actions aus?

Die richtige Alternative zu GitHub Actions hängt davon ab, wo Ihre Jobs laufen sollen:

  • Wenn Sie eine vollständig gehostete CI ohne Betriebsaufwand wünschen, nutzen Sie CircleCI. Die Konfiguration entspricht weitgehend dem, was Sie bereits haben.
  • Wenn Sie eine gehostete Orchestrierung auf eigenen oder vom Anbieter gehosteten Maschinen wünschen, nutzen Sie Buildkite, insbesondere wenn Sie macOS-Builds benötigen.
  • Wenn Self-Hosting Pflicht ist und Sie das Personal für die Wartung haben, nutzen Sie Jenkins.
  • Wenn Self-Hosting Pflicht ist und Sie etwas Schlankes suchen, nutzen Sie Woodpecker CI.
  • Wenn das eigentliche Problem „lokal funktioniert es, in der CI nicht“ lautet, ergänzen Sie Dagger und behalten eines der oben genannten Tools – oder GitHub Actions selbst – als Ausführungsumgebung.
  • Wenn das einzige Problem die Wartezeit ist, probieren Sie zuerst selbst gehostete Runner für GitHub Actions aus.

Das Docker-Backend von Woodpecker und Dagger benötigen beide eine Container-Runtime. Falls Docker Desktop für Ihre Rechner nicht infrage kommt: Dagger läuft auch mit Podman und nerdctl, und Woodpecker kann auf Kubernetes oder mit seinem Local-Backend direkt auf dem Host laufen.

Unabhängig vom gewählten Tool sollten Sie zunächst die gesamte Build-Logik in npm-Skripte verlagern. Testen Sie den Ersatz dann auf einem einzelnen Branch parallel zu GitHub Actions und vergleichen Sie die Ergebnisse eine Woche lang, bevor Sie endgültig umsteigen.

Häufig gestellte Fragen

Berechnet GitHub für selbst gehostete Runner in GitHub Actions Gebühren pro Minute?

Nein. GitHub berechnet für die Nutzung selbst gehosteter Runner keine minutenbasierten Gebühren; die Kosten bestehen also aus den Maschinen, auf denen sie laufen. Im Dezember 2025 kündigte GitHub ab dem 1. März 2026 eine Plattformgebühr von 0,002 US-Dollar pro Minute für selbst gehostete Runner an, verschob diese dann jedoch, um den Ansatz neu zu bewerten. Prüfen Sie die Abrechnungsdokumentation von GitHub Actions, bevor Sie einen Kostenvergleich auf einer der beiden Angaben aufbauen.

Kann ich einen CircleCI-Job lokal ausführen, bevor ich ihn pushe?

Ja, jeweils einen Job. Die CircleCI-CLI führt mit circleci local execute einen einzelnen Job in Docker auf Ihrem Rechner aus. Workflows laufen nicht lokal, und der Machine Executor wird nicht unterstützt. Bei einer Konfiguration der Version 2.1 exportieren Sie zunächst mit circleci config process die verarbeitete Konfiguration und übergeben diese Datei dann mit dem Flag -c und dem Jobnamen an circleci local execute.

Funktioniert Woodpecker CI mit Repositories, die auf GitHub gehostet werden?

Ja. Woodpecker unterstützt GitHub, einschließlich GitHub Enterprise, sowie GitLab, Gitea, Forgejo und Bitbucket Cloud. Sie registrieren eine OAuth-Anwendung auf der Forge und übergeben deren Client-ID und Secret über Umgebungsvariablen wie WOODPECKER_GITHUB_CLIENT und WOODPECKER_GITHUB_SECRET an den Woodpecker-Server. Die Repositories bleiben auf GitHub, Woodpecker meldet den Pipeline-Status dorthin zurück, und nur Server und Agents laufen auf Ihrer Infrastruktur.

Wie führe ich eine Dagger-Funktion aus einem bestehenden GitHub-Actions-Workflow aus?

Fügen Sie nach actions/checkout einen Step hinzu, der die offizielle Action dagger/dagger-for-github verwendet. Die Action installiert die Dagger-CLI, startet eine Dagger Engine auf dem Runner und ruft Ihre Funktion auf. Setzen Sie verb auf call und übergeben Sie dieselben Argumente wie lokal, etwa check mit Ihrem Quellverzeichnis und Ihrer Node-Version. Die Pipeline-Logik bleibt im Modul, sodass ein späterer Abschied von GitHub Actions nur diesen dünnen Wrapper betrifft.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — self-hosted, with full data ownership.

Star on GitHub

We use cookies to improve your experience. By using our site, you accept cookies.