2c1ed449da
- Implement conventional commits for semantic versioning - PRs: build, test, Docker verify - Merges to main: full release pipeline - Automatic version bump based on commit types - NuGet packaging - Multi-arch Docker build and push to GHCR - Git tag creation - GitHub release Add CONTRIBUTING.md with: - Trunk-based development workflow - Conventional commits guide - Local development instructions
188 lines
4.9 KiB
YAML
188 lines
4.9 KiB
YAML
variables:
|
|
- &dotnet_image "mcr.microsoft.com/dotnet/sdk:10.0-preview"
|
|
- &docker_image "woodpeckerci/plugin-docker-buildx"
|
|
|
|
# =============================================================================
|
|
# PULL REQUESTS - Build and test only
|
|
# =============================================================================
|
|
when:
|
|
- event: pull_request
|
|
|
|
steps:
|
|
pr-restore:
|
|
image: *dotnet_image
|
|
commands:
|
|
- dotnet restore
|
|
|
|
pr-build:
|
|
image: *dotnet_image
|
|
commands:
|
|
- dotnet build --no-restore -c Release
|
|
depends_on: [pr-restore]
|
|
|
|
pr-test:
|
|
image: *dotnet_image
|
|
commands:
|
|
- dotnet test --no-build -c Release --logger "console;verbosity=detailed"
|
|
depends_on: [pr-build]
|
|
|
|
pr-docker-verify:
|
|
image: *docker_image
|
|
settings:
|
|
repo: ghcr.io/barryw/paperlessmcp
|
|
dockerfile: PaperlessMCP/Dockerfile
|
|
context: PaperlessMCP
|
|
dry_run: true
|
|
depends_on: [pr-test]
|
|
|
|
---
|
|
# =============================================================================
|
|
# MAIN BRANCH - Build, test, version, release
|
|
# =============================================================================
|
|
when:
|
|
- event: push
|
|
branch: main
|
|
|
|
steps:
|
|
restore:
|
|
image: *dotnet_image
|
|
commands:
|
|
- dotnet restore
|
|
|
|
build:
|
|
image: *dotnet_image
|
|
commands:
|
|
- dotnet build --no-restore -c Release
|
|
depends_on: [restore]
|
|
|
|
test:
|
|
image: *dotnet_image
|
|
commands:
|
|
- dotnet test --no-build -c Release --logger "console;verbosity=detailed"
|
|
depends_on: [build]
|
|
|
|
# Determine next version based on conventional commits
|
|
version:
|
|
image: alpine/git
|
|
commands:
|
|
- apk add --no-cache bash
|
|
- |
|
|
# Get the latest tag or default to v0.0.0
|
|
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
|
|
echo "Latest tag: $LATEST_TAG"
|
|
|
|
# Parse current version
|
|
VERSION=${LATEST_TAG#v}
|
|
MAJOR=$(echo $VERSION | cut -d. -f1)
|
|
MINOR=$(echo $VERSION | cut -d. -f2)
|
|
PATCH=$(echo $VERSION | cut -d. -f3)
|
|
|
|
# Get commits since last tag
|
|
if [ "$LATEST_TAG" = "v0.0.0" ]; then
|
|
COMMITS=$(git log --pretty=format:"%s" HEAD)
|
|
else
|
|
COMMITS=$(git log --pretty=format:"%s" ${LATEST_TAG}..HEAD)
|
|
fi
|
|
|
|
# Determine bump type from conventional commits
|
|
BUMP="patch"
|
|
if echo "$COMMITS" | grep -qiE "^feat(\(.+\))?!:|BREAKING CHANGE:"; then
|
|
BUMP="major"
|
|
elif echo "$COMMITS" | grep -qiE "^feat(\(.+\))?:"; then
|
|
BUMP="minor"
|
|
fi
|
|
|
|
echo "Bump type: $BUMP"
|
|
|
|
# Calculate new version
|
|
case $BUMP in
|
|
major)
|
|
MAJOR=$((MAJOR + 1))
|
|
MINOR=0
|
|
PATCH=0
|
|
;;
|
|
minor)
|
|
MINOR=$((MINOR + 1))
|
|
PATCH=0
|
|
;;
|
|
patch)
|
|
PATCH=$((PATCH + 1))
|
|
;;
|
|
esac
|
|
|
|
NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}"
|
|
echo "New version: $NEW_VERSION"
|
|
|
|
# Save version for other steps
|
|
echo "$NEW_VERSION" > .version
|
|
echo "v${NEW_VERSION}" > .tag
|
|
depends_on: [test]
|
|
|
|
# Package NuGet
|
|
package:
|
|
image: *dotnet_image
|
|
commands:
|
|
- VERSION=$(cat .version)
|
|
- echo "Packaging version $VERSION"
|
|
- dotnet pack PaperlessMCP/PaperlessMCP.csproj --no-build -c Release -o ./artifacts /p:Version=$VERSION /p:PackageVersion=$VERSION
|
|
- ls -la ./artifacts/
|
|
depends_on: [version]
|
|
|
|
# Prepare Docker tags
|
|
docker-tags:
|
|
image: alpine
|
|
commands:
|
|
- VERSION=$(cat .version)
|
|
- echo "latest" > .docker-tags
|
|
- echo "v${VERSION}" >> .docker-tags
|
|
- cat .docker-tags
|
|
depends_on: [version]
|
|
|
|
# Build and push Docker
|
|
docker:
|
|
image: *docker_image
|
|
settings:
|
|
repo: ghcr.io/barryw/paperlessmcp
|
|
dockerfile: PaperlessMCP/Dockerfile
|
|
context: PaperlessMCP
|
|
platforms:
|
|
- linux/amd64
|
|
- linux/arm64
|
|
tags_file: .docker-tags
|
|
registry: ghcr.io
|
|
username:
|
|
from_secret: github_username
|
|
password:
|
|
from_secret: github_token
|
|
depends_on: [docker-tags]
|
|
|
|
# Create git tag and push
|
|
git-tag:
|
|
image: alpine/git
|
|
secrets: [github_token]
|
|
commands:
|
|
- TAG=$(cat .tag)
|
|
- VERSION=$(cat .version)
|
|
- echo "Creating tag $TAG"
|
|
- |
|
|
# Configure git for pushing
|
|
git config user.email "ci@woodpecker.local"
|
|
git config user.name "Woodpecker CI"
|
|
git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/barryw/PaperlessMCP.git
|
|
|
|
# Create and push tag
|
|
git tag -a "$TAG" -m "Release $VERSION"
|
|
git push origin "$TAG"
|
|
depends_on: [package, docker]
|
|
|
|
# Create GitHub release
|
|
release:
|
|
image: woodpeckerci/plugin-github-release
|
|
settings:
|
|
api_key:
|
|
from_secret: github_token
|
|
files:
|
|
- artifacts/*.nupkg
|
|
prerelease: false
|
|
depends_on: [git-tag]
|