Was Sie erreichen werden
Sie werden eine Release-Pipeline bauen, die einen Git-Tag in ein deploytes Artefakt verwandelt — signiert, getestet, versioniert und veroffentlicht.
Der Vertrag
- Einen Tag pushen, der
v*.*.*entspricht. - CI baut, testet, signiert und veroffentlicht.
- Ein GitHub-Release wird erstellt.
- Das Deployment ist geloggt und verifizierbar.
Schritt 1: Tag-Konventionen
git tag -a v1.4.0 -m "Release 1.4.0"
git tag -s v1.4.0 -m "Release 1.4.0"
Schritt 2: den Workflow konfigurieren
# .github/workflows/release.yml
name: release
on:
push:
tags: ['v*.*.*']
permissions:
contents: write
packages: write
id-token: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- run: npm ci
- run: npm run lint
- run: npm test
- run: npm run build
- run: npm publish --provenance --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Schritt 3: Release-Notes auto-generieren
- name: Generate notes
id: notes
uses: orhun/git-cliff-action@v2
with:
config: cliff.toml
args: --latest --strip header
- name: Create release
uses: softprops/action-gh-release@v2
with:
body: ${{ steps.notes.outputs.content }}
generate_release_notes: true
Schritt 4: Build-Matrix fur Multi-Plattform-Releases
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- run: cargo build --release
- uses: actions/upload-artifact@v4
with:
name: bin-${{ matrix.os }}
path: target/release/myapp*
Schritt 5: signierte Artefakte
- uses: sigstore/cosign-installer@v3
- run: |
cosign sign-blob --yes \
--output-certificate cert.pem \
--output-signature sig.bin \
dist/myapp-1.4.0.tgz
Schritt 6: Docker-Image-Release
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v5
with:
push: true
tags: |
ghcr.io/${{ github.repository }}:${{ github.ref_name }}
ghcr.io/${{ github.repository }}:latest
Schritt 7: Deploy nach Publish
- name: Deploy to production
run: ./scripts/deploy.sh
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
Schritt 8: Benachrichtigung
- name: Slack notify
uses: slackapi/slack-github-action@v1
with:
payload: |
{
"text": "Released ${{ github.ref_name }} :rocket:"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
Schritt 9: Pre-Release-Kanale
jobs:
release:
steps:
- id: classify
run: |
if [[ "${{ github.ref_name }}" =~ -(alpha|beta|rc) ]]; then
echo "tag=next" >> $GITHUB_OUTPUT
else
echo "tag=latest" >> $GITHUB_OUTPUT
fi
- run: npm publish --tag ${{ steps.classify.outputs.tag }}
Schritt 10: mit release-please integrieren
Automatisierte Versionsanhebung mit dieser Pipeline kombinieren.
Schritt 11: SHA in Artefakten taggen
- name: Get short SHA
id: vars
run: echo "sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- run: docker build -t myapp:${{ github.ref_name }} -t myapp:${{ steps.vars.outputs.sha }} .
Schritt 12: Tag-Schutz
gh api -X POST repos/owner/repo/tags/protection \
-F pattern='v*.*.*'
Haufige Fallstricke
- Pipeline lauft bei jedem Push.
- Force-Push von Tags nach Release.
- Geheimnisse in CI-Logs.
- Build von main bei Tag-Push.