Skip to content

Commit 50a56df

Browse files
Refine version bump workflow to improve version and CHANGELOG validation, ensuring consistency and accuracy in versioning checks.
1 parent 90d5fdd commit 50a56df

File tree

1 file changed

+26
-44
lines changed

1 file changed

+26
-44
lines changed
Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
# Ensures package.json and CHANGELOG.md are bumped when merging to release branch (master/main).
2-
# Runs only on PRs targeting master or main (e.g. development → master).
1+
# Require version + CHANGELOG bump when merging to master/main/development (skip when only test/docs/config).
32
name: Check Version Bump
43

54
on:
65
pull_request:
7-
branches:
8-
- master
9-
- main
10-
- development
6+
branches: [master, main, development]
117

128
jobs:
139
version-bump:
@@ -29,56 +25,42 @@ jobs:
2925
BASE_SHA: ${{ github.event.pull_request.base.sha }}
3026
run: |
3127
set -e
32-
# Use three-dot diff so we only see changes introduced by the PR branch (works with merge commit checkout)
33-
DIFF_REF="${BASE_SHA}...HEAD"
3428
if [ -n "$BASE_SHA" ] && git rev-parse --verify "$BASE_SHA" >/dev/null 2>&1; then
35-
CHANGED=$(git diff --name-only "$DIFF_REF" 2>/dev/null || true)
36-
PROD_CHANGES=$(echo "$CHANGED" | grep -v -e '^test/' -e '^package\.json$' -e '^CHANGELOG\.md$' -e '^\.github/' -e '^README' -e '^\.' -e '^docs/' -e '^jest\.config' -e '^\.eslintrc' -e '^\.prettierrc' || true)
37-
PROD_CHANGES=$(echo "$PROD_CHANGES" | sed '/^$/d')
38-
if [ -z "$PROD_CHANGES" ]; then
39-
echo "Only test/docs/config files changed. Skipping version bump check."
29+
CHANGED=$(git diff --name-only "$BASE_SHA...HEAD" 2>/dev/null || true)
30+
PROD=$(echo "$CHANGED" | grep -vE '^test/|^package\.json$|^CHANGELOG\.md$|^\.github/|^README|^\.|^docs/|^jest\.config|^\.eslintrc|^\.prettierrc' | sed '/^$/d')
31+
if [ -z "$PROD" ]; then
32+
echo "Only test/docs/config changed. Skipping."
4033
exit 0
4134
fi
42-
# Skip when only comments changed in production files (//, /*, *, */, #)
43-
if git diff "$DIFF_REF" 2>/dev/null | node -e "
44-
try {
45-
const lines = require('fs').readFileSync(0,'utf8').split('\n').filter(l=>l.startsWith('+')||l.startsWith('-'));
46-
const isComment = (s) => { const t=(s||'').slice(1).replace(/^\s+|\s+$/g,''); return !t || /^\/\//.test(t) || /^\/\*/.test(t) || /^\*\//.test(t) || /^\s*\*/.test(t) || /^#/.test(t); };
47-
process.exit(lines.length > 0 && !lines.some(l => !isComment(l)) ? 0 : 1);
48-
} catch(e) { process.exit(1); }
35+
# Skip when only comments changed in lib/ or other prod files (//, /*, *, */, #)
36+
if git diff "$BASE_SHA...HEAD" 2>/dev/null | node -e "
37+
const l=require('fs').readFileSync(0,'utf8').split('\n').filter(x=>x.startsWith('+')||x.startsWith('-'));
38+
const c=s=>{const t=(s||'').slice(1).trim(); return!t||/^\/\//.test(t)||/^\/\*/.test(t)||/^\*\//.test(t)||/^\*/.test(t)||/^#/.test(t);};
39+
process.exit(l.length>0&&l.every(c)?0:1);
4940
" 2>/dev/null; then
50-
echo "Only comments changed in code. Skipping version bump check."
41+
echo "Only comments changed (lib/ or other). Skipping."
5142
exit 0
5243
fi
5344
fi
45+
5446
PKG_VERSION=$(node -p "require('./package.json').version.replace(/^v/, '')")
55-
if [ -z "$PKG_VERSION" ]; then
56-
echo "::error::Could not read version from package.json"
57-
exit 1
58-
fi
47+
[ -n "$PKG_VERSION" ] || { echo "::error::Could not read package.json version"; exit 1; }
48+
5949
git fetch --tags --force 2>/dev/null || true
6050
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || true)
6151
if [ -z "$LATEST_TAG" ]; then
62-
echo "No existing tags found. Skipping version-bump check (first release)."
52+
echo "No tags yet. Skipping."
6353
exit 0
6454
fi
65-
LATEST_VERSION="${LATEST_TAG#v}"
66-
LATEST_VERSION="${LATEST_VERSION%%-*}"
67-
if [ "$(printf '%s\n' "$LATEST_VERSION" "$PKG_VERSION" | sort -V | tail -1)" != "$PKG_VERSION" ]; then
68-
echo "::error::Version bump required: package.json version ($PKG_VERSION) is not greater than latest tag ($LATEST_TAG). Please bump the version in package.json."
69-
exit 1
70-
fi
71-
if [ "$PKG_VERSION" = "$LATEST_VERSION" ]; then
72-
echo "::error::Version bump required: package.json version ($PKG_VERSION) equals latest tag ($LATEST_TAG). Please bump the version in package.json."
73-
exit 1
74-
fi
75-
CHANGELOG_VERSION=$(sed -nE 's/^## \[v?([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' CHANGELOG.md | head -1)
76-
if [ -z "$CHANGELOG_VERSION" ]; then
77-
echo "::error::Could not find a version entry in CHANGELOG.md (expected line like '## [v1.0.0](...)')."
78-
exit 1
79-
fi
80-
if [ "$CHANGELOG_VERSION" != "$PKG_VERSION" ]; then
81-
echo "::error::CHANGELOG version mismatch: CHANGELOG.md top version ($CHANGELOG_VERSION) does not match package.json version ($PKG_VERSION). Please add or update the CHANGELOG entry for $PKG_VERSION."
55+
LATEST="${LATEST_TAG#v}"; LATEST="${LATEST%%-*}"
56+
57+
if [ "$(printf '%s\n' "$LATEST" "$PKG_VERSION" | sort -V | tail -1)" != "$PKG_VERSION" ] || [ "$PKG_VERSION" = "$LATEST" ]; then
58+
echo "::error::Version bump required: package.json ($PKG_VERSION) must be greater than latest tag ($LATEST_TAG)."
8259
exit 1
8360
fi
84-
echo "Version bump check passed: package.json and CHANGELOG.md are at $PKG_VERSION (latest tag: $LATEST_TAG)."
61+
62+
CHANGELOG_VER=$(sed -nE 's/^## \[v?([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' CHANGELOG.md | head -1)
63+
[ -n "$CHANGELOG_VER" ] || { echo "::error::No version line in CHANGELOG.md"; exit 1; }
64+
[ "$CHANGELOG_VER" = "$PKG_VERSION" ] || { echo "::error::CHANGELOG top version ($CHANGELOG_VER) must match package.json ($PKG_VERSION)."; exit 1; }
65+
66+
echo "Version bump OK: $PKG_VERSION (latest tag: $LATEST_TAG)."

0 commit comments

Comments
 (0)