Moderne Release-Strategien mit GitHub Aktionen (Deutsch (German))

Moderne Release-Strategien mit GitHub Aktionen

Thursday, 04 December 2025

//

6 minute read

Das Kernprinzip – :-Release schnell und schmerzlos –,-Releases und you-'-Relaunch öfters – .-Relois Dies ist für die agile Entwicklung von entscheidender Bedeutung.Verlässliche Bereitstellungen erstellen die schnelle Feedbackschleife, die Sie benötigen......Wenn das Bereitstellen beängstigend oder langsam ist..

Diese Anleitung deckt die Release-Strategien, die ich in der Produktion verwende, ab einfachen Tag-Tag-- based deployments to multi--®package monorepo publishing-MSC3® Alle Beispiele stammen von real GitHub-Maßnahmen Arbeitsabläufe in diesem Repository

Release-Strategien auf einen Blick

Bevor man in Details eintaucht, hier ', wie gemeinsame Strategien vergleichen

Strategie für die Komplexität von , die am besten für die Kompliziertheit von , die häufig in ,
Auf der Grundlage von Tag-- -Anwendungen – explizite Veröffentlichungen – niedrige Anzahl von Startups – solo devs – ausgereifte Teams
Branche auf der Grundlage von - Kontinuierliche Bereitstellung von , niedrigen , Startups, schnellen - und sich bewegenden Teams
GitFlow Regulierte Releases,'-Mehrfachversionen '-High-Compliance von Unternehmen,«--«-Schwere Version «-
Tramp-Flaggen auf Basis von - Hochentwickelte MSK-Teams Mittelständige MS K3 Große Tech-Startups Ältere
Monorepo-Mehrfachpackung Mehrsprachige Datenbanken - Gemeinsame Codedatenbanken - Mittlere Plattform-Teams - , OSS-Projekte -

Was funktioniert, wo

Startups Kleine TeamsStarten Sie mit dem Tag - auf Basis von -" auf Grundlage von .. Halten Sie es einfach.-" können Sie die Komplexität später hinzufügen.MSC5. Trunk-Entwicklung mit Feature Flags ist beliebt im Maßstab, aber Overkill für kleine Teams.

UnternehmenHäufig erfordert GitFlow oder ähnliches für Compliance-Prüfungen , , und Freigabemanagement , . Mehrere Umgebungen

Solo-Entwickler:-Tag---based ist ideal..-Push a tag-MSC3-Bereitstellung geschieht..-Keine Zeremonie, keine Overhead-.-

Plattform-Teams für die BibliothekBenötigen Sie Monorepo-Strategien mit unabhängiger Versionierung pro Paket Beschreiben Sie die semantische Versionierung ist für nachgeschaltete Verbraucher von entscheidender Bedeutung

Tag: -, basierende Bereitstellung

Die einfachste und zuverlässigste Strategie: Verschiedene Tag-Präfixe führen zu verschiedenen Umgebungen oder lösen verschiedene Aktionen aus.

Umweltzielsetzung

on:
  push:
    tags:
      - 'release-*'  # Production
      - 'local-*'    # Dev environment
- name: Build Docker image
  run: |
    TAG_NAME=${GITHUB_REF#refs/tags/}
    if [[ "$TAG_NAME" == local-* ]]; then
      docker build -t myapp:local .
    else
      docker build -t myapp:latest -t myapp:$(date +%s) .
    fi

Warum es funktioniertEinfaches mentales Modell - explizite Bereitstellungen - einfache Rückwärtsrollback über timestamped Tags

# Deploy to production
git tag release-v2024.12.01 && git push origin release-v2024.12.01

# Deploy to dev
git tag local-feature-test && git push origin local-feature-test

Mehrsprachige Versionierung des Pakets

Für Monorepos mit mehreren publizierbaren Paketen verwenden Sie Tag-Präfixe, um zu erkennen, welches Paket freizugeben ist.

# Different workflows, different tag patterns
# umami-net.yml
on:
  push:
    tags: ['umamiv*.*.*']  # e.g., umamiv1.0.5

# fetchextension.yml
on:
  push:
    tags: ['fetchextension-v*.*.*']  # e.g., fetchextension-v1.2.0

Extrahieren Sie die Version und verwenden Sie sie durchwegs

- name: Extract version
  run: echo "VERSION=${GITHUB_REF#refs/tags/umamiv}" >> $GITHUB_OUTPUT

- name: Build & Pack
  run: |
    dotnet build -c Release -p:Version=${{ steps.version.outputs.VERSION }}
    dotnet pack -c Release -p:PackageVersion=${{ steps.version.outputs.VERSION }}

Für die automatische Versionierung MinVer berechnet Versionen von Git-Tags

<PackageReference Include="MinVer" Version="6.0.0" PrivateAssets="all" />
<PropertyGroup>
  <MinVerTagPrefix>umamiv</MinVerTagPrefix>
</PropertyGroup>

Zweig: -, basierende Bereitstellung

Deploy automatisch, wenn Code landet auf bestimmten Filialen... häufig in Startups und schnellen Teams...

on:
  push:
    branches: [main]      # → Production
    # branches: [develop] # → Staging

**Vors.**Keine manuellen Schritte, die beim Zusammenführen eingesetzt werden NachteileVersehentliche Einsatzmöglichkeiten weniger explizite Geschichte

Ich verwende einen hybriden Ansatz, der auf Branch Push basiert.

on:
  push:
    tags: ['scheduler-*']
    branches: [main, local]

jobs:
  build:
    # Always build
  publish:
    if: startsWith(github.ref, 'refs/tags/')  # Only publish on tags

Auto-Updates mit dem Wachtturm

Für selbstgehostete Bereitstellungen Der Wachtturm Zieht automatisch neue Bilder

services:
  app:
    image: myapp:latest
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 300  # Check every 5 minutes

Bereitstellungsfluss:-Push-Tag - GitHub-Aktionen baut →-Pusch auf Registrierung →-Pulls-Container startet .-Puzzle-Restarts-:-Pulver-Minuten

Qualitätstore

Schnelle Bereitstellungen sind nutzlos, wenn Sie Fehler bereitstellen.... Jeder Workflow sollte gates beinhalten....

- name: Run tests
  run: dotnet test --configuration Release

- name: Build
  run: dotnet build --configuration Release

# Tests or build fail → workflow stops → no publish

Für Multi---Rahmenpakete Erstellen Sie alle Ziele

- run: dotnet build -c Release --framework net8.0
- run: dotnet build -c Release --framework net9.0

Passwordless Publishing mit OIDC

Moderner Ansatz Keine Geheimnisse zu rotieren , Kein Schlüssel zu undicht:

permissions:
  id-token: write
  contents: read

- uses: NuGet/login@v1
  with:
    user: 'myusername'

- run: dotnet nuget push *.nupkg --api-key ${{ steps.login.outputs.NUGET_API_KEY }}

GitHub tauscht sein OIDC-Token für einen kurzen, kurz gehaltenen NuGet API-Key aus.

Sicherheit der Lieferkette

Bescheinigungen für Artefakte Beweisen Sie Ihre Artefakte wurden in CI-, hergestellt, nicht manipuliert mit ... . Zunehmend von Unternehmen benötigt

permissions:
  id-token: write
  attestations: write

- uses: docker/build-push-action@v6
  id: push
  with:
    push: true
    tags: myapp:latest

- uses: actions/attest-build-provenance@v2
  with:
    subject-name: index.docker.io/myuser/myapp
    subject-digest: ${{ steps.push.outputs.digest }}
    push-to-registry: true

Verbraucher verifizieren mit gh attestation verify oci://index.docker.io/myuser/myapp:latest --owner myuser

Dies erreicht SLSA-NiveauFür den Level-Einsatz wiederverwendbare Workflows.

Vorschauumgebungen

Teams müssen die Änderungen vor dem Zusammenführen vorhersehen

Unternehmensansatz Branchenbasierte Vorschauumgebungen auf Basis von :

on:
  pull_request:
    types: [opened, synchronize]

- run: |
    BRANCH=$(echo ${{ github.head_ref }} | sed 's/[^a-zA-Z0-9]/-/g')
    docker build -t myapp:preview-$BRANCH .
    # Deploy to k8s namespace, cloud platform, etc.

Ansatz für Startups – /-solo Tunneln Sie Ihre lokale Maschine

# Cloudflare Tunnel (free)
cloudflared tunnel run --url http://localhost:5000 my-preview
# → https://my-preview.cfargotunnel.com

Oder verwenden Drahtschutz VPN für internen Team-Zugriff auf Ihre dev Maschine

Praktische Tipps

Bereinigung der MarkierungDie Git-Tags kleben für immer herum

git tag -d old-test-tag                      # Delete local
git push origin :refs/tags/old-test-tag      # Delete remote

BenennungsübereinkommenSei konsequent, .

  • release-YYYY.MM.DD für die Produktion
  • local-feature-name für dev
  • packagev1.2.3 für Bibliotheken

GeheimnisseNicht in der Gebrauchsinformation aufbewahren GitHub GeheimnisseNicht im Code erforderlich Erforderliche Geheimnisse typischerweise

  • DOCKER_HUB_ACCESS_TOKEN
  • NUGET_API_KEY Verwendung von OIDC-)
  • NPM_TOKEN

Entwicklung von MonorepoVerwenden Sie Projektreferenzen während der Entwicklung wechseln Sie zu Paketreferenzen für die Bereitstellungsverifizierung

<ProjectReference Include="..\MyLib\MyLib.csproj" />
<!-- <PackageReference Include="MyLib" Version="1.0.0" /> -->

Umzug nach Kubernetes

Dieselben Prinzipien verschiedene Werkzeuge

Docker-Kompose mit Cubernetes |----------------|------------| WETTBEWERB ArgoCD / Flux | |-Docker--komponieren.-yml-Umgebungen Namespaces Container-Neustart des Behälters - Rolling Deployment Manuelles Rollback von |, GitOps Roll Back von MSC2

Zusammenfassung

  1. Einfach startenTag-Tag---basierte Bereitstellung deckt die meisten Bedürfnisse ab
  2. Komplexität hinzufügen, wenn nötig-, basierend auf ,, multi--, Umgebung, ,, Bescheinigungen
  3. Qualitätstore automatisierenTests müssen vor der Veröffentlichung bestehen
  4. Rollback aktivierenZeitgestempelte Tags oder GitOps-Geschichte
  5. Sichern Sie Ihre PipelineBeglaubigungen für Provenienz
  6. Passen Sie Ihren Kontext anUnternehmensgründung Unternehmen Unternehmen Unternehmen

Die hier gezeigten Workflows laufen in diesem Repository. .github/workflows/ für vollständige Implementierungen

Erinnern Sie sichVerlässliche Bereitstellungen sind die Grundlage einer agilen Entwicklung. Investieren Sie frühzeitig in Ihre Release-Pipeline

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.