60ba630824
User has github_token and github_username configured. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
121 lines
3.8 KiB
YAML
121 lines
3.8 KiB
YAML
# Release Pipeline - Build, test, version, package, release
|
|
when:
|
|
- event: push
|
|
branch: main
|
|
|
|
labels:
|
|
platform: linux/amd64
|
|
|
|
clone:
|
|
- name: clone
|
|
image: woodpeckerci/plugin-git
|
|
settings:
|
|
lfs: false
|
|
depth: 50
|
|
tags: true
|
|
|
|
steps:
|
|
- name: build-and-test
|
|
image: mcr.microsoft.com/dotnet/sdk:10.0
|
|
commands:
|
|
- dotnet restore
|
|
- dotnet build -c Release
|
|
- dotnet test -c Release --logger "console;verbosity=detailed"
|
|
|
|
# Determine next version based on conventional commits
|
|
- name: version
|
|
image: alpine/git
|
|
commands:
|
|
- |
|
|
set -e
|
|
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
|
|
echo "Latest tag: $LATEST_TAG"
|
|
VERSION=$(echo "$LATEST_TAG" | sed 's/^v//')
|
|
MAJOR=$(echo "$VERSION" | cut -d. -f1)
|
|
MINOR=$(echo "$VERSION" | cut -d. -f2)
|
|
PATCH=$(echo "$VERSION" | cut -d. -f3)
|
|
echo "Current: $MAJOR.$MINOR.$PATCH"
|
|
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
|
|
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"
|
|
case $BUMP in
|
|
major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;;
|
|
minor) MINOR=$((MINOR + 1)); PATCH=0 ;;
|
|
patch) PATCH=$((PATCH + 1)) ;;
|
|
esac
|
|
echo "New version: $MAJOR.$MINOR.$PATCH"
|
|
echo "$MAJOR.$MINOR.$PATCH" > .version
|
|
echo "v$MAJOR.$MINOR.$PATCH" > .tag
|
|
cat .version
|
|
cat .tag
|
|
depends_on: [build-and-test]
|
|
|
|
# Package NuGet
|
|
- name: package
|
|
image: mcr.microsoft.com/dotnet/sdk:10.0
|
|
commands:
|
|
- |
|
|
VERSION=$(cat .version)
|
|
echo "Packaging version $VERSION"
|
|
dotnet restore
|
|
dotnet build -c Release
|
|
dotnet pack PaperlessMCP/PaperlessMCP.csproj -c Release -o ./artifacts /p:Version=$VERSION /p:PackageVersion=$VERSION
|
|
ls -la ./artifacts/
|
|
depends_on: [version]
|
|
|
|
# Build and push Docker with Kaniko
|
|
- name: docker
|
|
image: gcr.io/kaniko-project/executor:debug
|
|
environment:
|
|
GHCR_USERNAME:
|
|
from_secret: github_username
|
|
GHCR_TOKEN:
|
|
from_secret: github_token
|
|
commands:
|
|
- |
|
|
VERSION=$(cat .version)
|
|
echo "Building Docker image version: $VERSION"
|
|
mkdir -p /kaniko/.docker
|
|
echo "{\"auths\":{\"ghcr.io\":{\"username\":\"$GHCR_USERNAME\",\"password\":\"$GHCR_TOKEN\"}}}" > /kaniko/.docker/config.json
|
|
/kaniko/executor --context="$CI_WORKSPACE/PaperlessMCP" --dockerfile="$CI_WORKSPACE/PaperlessMCP/Dockerfile" --destination="ghcr.io/barryw/paperlessmcp:v$VERSION" --destination="ghcr.io/barryw/paperlessmcp:latest" --build-arg="VERSION=$VERSION"
|
|
depends_on: [version]
|
|
|
|
# Create git tag and push
|
|
- name: git-tag
|
|
image: alpine/git
|
|
environment:
|
|
GITHUB_TOKEN:
|
|
from_secret: github_token
|
|
commands:
|
|
- |
|
|
TAG=$(cat .tag)
|
|
VERSION=$(cat .version)
|
|
echo "Creating tag $TAG for version $VERSION"
|
|
echo "Token length: ${#GITHUB_TOKEN}"
|
|
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"
|
|
git tag -a "$TAG" -m "Release $VERSION"
|
|
git push origin "$TAG"
|
|
depends_on: [package, docker]
|
|
|
|
# Create GitHub release
|
|
- name: release
|
|
image: woodpeckerci/plugin-github-release
|
|
settings:
|
|
api_key:
|
|
from_secret: github_token
|
|
files:
|
|
- artifacts/*.nupkg
|
|
prerelease: false
|
|
depends_on: [git-tag]
|