name: Version Bump on: pull_request: branches: [develop] types: [opened, synchronize, reopened, labeled, unlabeled, closed] permissions: contents: write jobs: # Register this job's name as a required status check on develop's branch # protection - that's what actually blocks the merge button. check-bump-label: if: github.event.action != 'closed' runs-on: ubuntu-latest steps: - name: Require a bump/major, bump/minor, bump/patch, or bump/skip label env: LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }} run: | echo "$LABELS" | grep -qE '"bump/(major|minor|patch|skip)"' || { echo "::error::PR into develop must carry one of bump/major, bump/minor, bump/patch, bump/skip" exit 1 } # Runs once, after the merge has already happened, to commit the actual # version bump onto develop. apply-version-bump: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: ref: develop fetch-depth: 0 - name: Determine bump level from PR labels id: level env: LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }} run: | for lvl in major minor patch skip; do if echo "$LABELS" | grep -q "\"bump/$lvl\""; then echo "level=$lvl" >> "$GITHUB_OUTPUT" exit 0 fi done echo "::error::merged PR into develop has no bump/major, bump/minor, bump/patch, or bump/skip label" exit 1 - name: Bump CMakeLists.txt and flake.nix if: steps.level.outputs.level != 'skip' env: LEVEL: ${{ steps.level.outputs.level }} run: | set -euo pipefail CURRENT=$(grep -oP '(?<=VERSION )[0-9]+(\.[0-9]+){1,2}' CMakeLists.txt | head -1) # Pad to 3 components so a pre-existing 2-component version (e.g. # "0.1") still splits into MAJOR/MINOR/PATCH correctly. IFS='.' read -r MAJOR MINOR PATCH <<< "${CURRENT}.0.0" case "$LEVEL" in major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;; minor) MINOR=$((MINOR + 1)); PATCH=0 ;; patch) PATCH=$((PATCH + 1)) ;; esac NEW="$MAJOR.$MINOR.$PATCH" sed -i "s/VERSION ${CURRENT}/VERSION ${NEW}/" CMakeLists.txt sed -i "s/version = \"${CURRENT}\"/version = \"${NEW}\"/" flake.nix echo "CURRENT_VERSION=${CURRENT}" >> "$GITHUB_ENV" echo "NEW_VERSION=${NEW}" >> "$GITHUB_ENV" - name: Commit and push if: steps.level.outputs.level != 'skip' run: | set -euo pipefail if [ "$CURRENT_VERSION" = "$NEW_VERSION" ]; then echo "::error::version did not change (${CURRENT_VERSION} -> ${NEW_VERSION})" exit 1 fi git config user.name "gitea-actions" git config user.email "actions@noreply.localhost" git add CMakeLists.txt flake.nix git commit -m "Bump version to ${NEW_VERSION}" git push origin HEAD:develop