# Moderne Release-Strategien mit GitHub Aktionen

<!--category-- DevOps, CI/CD, GitHub Actions -->
<datetime class="hidden">2025-12-04T12:00</datetime>

**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](https://docs.github.com/en/actions) Arbeitsabläufe in diesem Repository

[TOC]

## 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 Teams**Starten 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.

**Unternehmen**Hä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 Bibliothek**Benö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

```yaml
on:
  push:
    tags:
      - 'release-*'  # Production
      - 'local-*'    # Dev environment
```

```yaml
- 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 funktioniert**Einfaches mentales Modell - explizite Bereitstellungen - einfache Rückwärtsrollback über timestamped Tags

```bash
# 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.

```yaml
# 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

```yaml
- 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](https://github.com/adamralph/minver) berechnet Versionen von Git-Tags

```xml
<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...

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

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

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

```yaml
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](https://containrrr.dev/watchtower/) Zieht automatisch neue Bilder

```yaml
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....

```yaml
- 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

```yaml
- 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:

```yaml
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](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations) Beweisen Sie Ihre Artefakte wurden in CI-, hergestellt, nicht manipuliert mit ... . Zunehmend von Unternehmen benötigt

```yaml
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-Niveau](https://slsa.dev/spec/v1.0/levels)Für den Level-Einsatz [wiederverwendbare Workflows](https://docs.github.com/en/actions/sharing-automations/reusing-workflows).

## Vorschauumgebungen

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

**Unternehmensansatz** Branchenbasierte Vorschauumgebungen auf Basis von :

```yaml
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

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

Oder verwenden [Drahtschutz](https://www.wireguard.com/) VPN für internen Team-Zugriff auf Ihre dev Maschine

## Praktische Tipps

**Bereinigung der Markierung**Die Git-Tags kleben für immer herum

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

**Benennungsübereinkommen**Sei konsequent, .

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

**Geheimnisse**Nicht in der Gebrauchsinformation aufbewahren [GitHub Geheimnisse](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions)Nicht im Code erforderlich Erforderliche Geheimnisse typischerweise

- `DOCKER_HUB_ACCESS_TOKEN`
- `NUGET_API_KEY` Verwendung von OIDC-)
- `NPM_TOKEN`

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

```xml
<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](https://argo-cd.readthedocs.io/) / [Flux](https://fluxcd.io/docs/) |
|-Docker--komponieren.-yml-Umgebungen Namespaces
Container-Neustart des Behälters - Rolling Deployment
Manuelles Rollback von |, GitOps Roll Back von MSC2

## Zusammenfassung

1. **Einfach starten**Tag-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 automatisieren**Tests müssen vor der Veröffentlichung bestehen
4. **Rollback aktivieren**Zeitgestempelte Tags oder GitOps-Geschichte
5. **Sichern Sie Ihre Pipeline**Beglaubigungen für Provenienz
6. **Passen Sie Ihren Kontext an**Unternehmensgründung Unternehmen Unternehmen Unternehmen

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

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