This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Moderne Release-Strategien mit GitHub Aktionen
Thursday, 04 December 2025
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.DDfür die Produktionlocal-feature-namefür devpackagev1.2.3für Bibliotheken
GeheimnisseNicht in der Gebrauchsinformation aufbewahren GitHub GeheimnisseNicht im Code erforderlich Erforderliche Geheimnisse typischerweise
DOCKER_HUB_ACCESS_TOKENNUGET_API_KEYVerwendung 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
- Einfach startenTag-Tag---basierte Bereitstellung deckt die meisten Bedürfnisse ab
- Komplexität hinzufügen, wenn nötig-, basierend auf ,, multi--, Umgebung, ,, Bescheinigungen
- Qualitätstore automatisierenTests müssen vor der Veröffentlichung bestehen
- Rollback aktivierenZeitgestempelte Tags oder GitOps-Geschichte
- Sichern Sie Ihre PipelineBeglaubigungen für Provenienz
- 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