Skip to content

Fix/version workflow #16

Fix/version workflow

Fix/version workflow #16

# Require version + CHANGELOG bump when merging to master/main/development (skip when only test/docs/config).
name: Check Version Bump
on:
pull_request:
branches: [master, main, development]
jobs:
version-bump:
name: Version & Changelog bump
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '22.x'
- name: Check version bump
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: |
set -e
if [ -n "$BASE_SHA" ] && git rev-parse --verify "$BASE_SHA" >/dev/null 2>&1; then
CHANGED=$(git diff --name-only "$BASE_SHA...HEAD" 2>/dev/null || true)
PROD=$(echo "$CHANGED" | grep -vE '^test/|^package\.json$|^CHANGELOG\.md$|^\.github/|^README|^\.|^docs/|^jest\.config|^\.eslintrc|^\.prettierrc' | sed '/^$/d')
if [ -z "$PROD" ]; then
echo "Only test/docs/config changed. Skipping."
exit 0
fi
# Skip when only comments changed in lib/ or other prod files (//, /*, *, */, #)
if git diff "$BASE_SHA...HEAD" 2>/dev/null | node -e "
const l=require('fs').readFileSync(0,'utf8').split('\n').filter(x=>x.startsWith('+')||x.startsWith('-'));
const c=s=>{const t=(s||'').slice(1).trim(); return!t||/^\/\//.test(t)||/^\/\*/.test(t)||/^\*\//.test(t)||/^\*/.test(t)||/^#/.test(t);};
process.exit(l.length>0&&l.every(c)?0:1);
" 2>/dev/null; then
echo "Only comments changed (lib/ or other). Skipping."
exit 0
fi
fi
PKG_VERSION=$(node -p "require('./package.json').version.replace(/^v/, '')")
[ -n "$PKG_VERSION" ] || { echo "::error::Could not read package.json version"; exit 1; }
git fetch --tags --force 2>/dev/null || true
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || true)
if [ -z "$LATEST_TAG" ]; then
echo "No tags yet. Skipping."
exit 0
fi
LATEST="${LATEST_TAG#v}"; LATEST="${LATEST%%-*}"
if [ "$(printf '%s\n' "$LATEST" "$PKG_VERSION" | sort -V | tail -1)" != "$PKG_VERSION" ] || [ "$PKG_VERSION" = "$LATEST" ]; then
echo "::error::Version bump required: package.json ($PKG_VERSION) must be greater than latest tag ($LATEST_TAG)."
exit 1
fi
CHANGELOG_VER=$(sed -nE 's/^## \[v?([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' CHANGELOG.md | head -1)
[ -n "$CHANGELOG_VER" ] || { echo "::error::No version line in CHANGELOG.md"; exit 1; }
[ "$CHANGELOG_VER" = "$PKG_VERSION" ] || { echo "::error::CHANGELOG top version ($CHANGELOG_VER) must match package.json ($PKG_VERSION)."; exit 1; }
echo "Version bump OK: $PKG_VERSION (latest tag: $LATEST_TAG)."