# Release Pipeline - Build, test, version, package, release when: - event: push branch: main skip_clone: true steps: - name: clone image: alpine/git commands: - git clone --depth=50 --tags ${CI_REPO_CLONE_URL} . - git checkout ${CI_COMMIT_SHA} - name: restore image: mcr.microsoft.com/dotnet/sdk:10.0-preview commands: - dotnet restore depends_on: [clone] - name: build image: mcr.microsoft.com/dotnet/sdk:10.0-preview commands: - dotnet build --no-restore -c Release depends_on: [restore] - name: test image: mcr.microsoft.com/dotnet/sdk:10.0-preview commands: - dotnet test --no-build -c Release --logger "console;verbosity=detailed" depends_on: [build] # Determine next version based on conventional commits - name: 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 - name: package image: mcr.microsoft.com/dotnet/sdk:10.0-preview 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] # 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) - 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" - | 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]