barycenter/.github/workflows/release.yml
Till Wegmueller 221406b1a2
ci: add automated release workflow with Docker image publishing
Add comprehensive release automation:

**GitHub Actions Release Workflow:**
- Triggers on version tags (v*.*.*)
- Builds multi-platform Docker images (amd64, arm64)
- Publishes to GitHub Container Registry (ghcr.io)
- Creates GitHub Releases with auto-generated changelogs
- Generates build provenance attestations for supply chain security
- Semantic versioning with tag variants (v1.0.0, 1.0, 1)

**cargo-release Configuration:**
- Automated version bumping in Cargo.toml
- Updates CHANGELOG.md with version and date
- Syncs Helm chart versions (Chart.yaml)
- Creates git tags and commits
- Pushes to remote automatically
- Enforces main branch releases

**Release Documentation:**
- RELEASE.md with complete release process guide
- CHANGELOG.md following Keep a Changelog format
- Updated README.md with deployment and release sections
- Instructions for patch, minor, and major releases
- Dry-run support for testing
- Hotfix and rollback procedures

**Usage:**
To create a release, simply run:
  cargo install cargo-release
  cargo release minor --execute

This will:
1. Bump version in all relevant files
2. Update changelog
3. Create git tag
4. Trigger Docker image build and publish
5. Create GitHub Release with notes

Docker images will be available at:
  ghcr.io/[owner]/barycenter:v1.0.0
  ghcr.io/[owner]/barycenter:1.0
  ghcr.io/[owner]/barycenter:1

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 15:49:52 +01:00

128 lines
3.8 KiB
YAML

name: Release
on:
push:
tags:
- 'v*.*.*'
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels)
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha,prefix={{branch}}-
labels: |
org.opencontainers.image.title=Barycenter
org.opencontainers.image.description=OpenID Connect Identity Provider with federation and auto-registration
org.opencontainers.image.vendor=${{ github.repository_owner }}
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
VERSION=${{ github.ref_name }}
REVISION=${{ github.sha }}
- name: Generate artifact attestation
uses: actions/attest-build-provenance@v1
with:
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
subject-digest: ${{ steps.build.outputs.digest }}
push-to-registry: true
create-github-release:
runs-on: ubuntu-latest
needs: build-and-push
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate changelog
id: changelog
run: |
# Get previous tag
PREVIOUS_TAG=$(git describe --abbrev=0 --tags $(git rev-list --tags --skip=1 --max-count=1) 2>/dev/null || echo "")
# Generate changelog
if [ -z "$PREVIOUS_TAG" ]; then
CHANGELOG=$(git log --pretty=format:"- %s (%h)" --no-merges)
else
CHANGELOG=$(git log ${PREVIOUS_TAG}..HEAD --pretty=format:"- %s (%h)" --no-merges)
fi
# Save to file for multiline output
echo "$CHANGELOG" > /tmp/changelog.txt
# Set output
echo "changelog<<EOF" >> $GITHUB_OUTPUT
cat /tmp/changelog.txt >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Create GitHub Release
uses: softprops/action-gh-release@v1
with:
body: |
## What's Changed
${{ steps.changelog.outputs.changelog }}
## Docker Images
Pull the Docker image:
```bash
docker pull ghcr.io/${{ github.repository }}:${{ github.ref_name }}
```
Available platforms:
- linux/amd64
- linux/arm64
## Installation
See [DEPLOYMENT.md](https://github.com/${{ github.repository }}/blob/${{ github.ref_name }}/DEPLOYMENT.md) for installation instructions.
draft: false
prerelease: ${{ contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') || contains(github.ref_name, 'rc') }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}