Skip to content

Commit 8f40435

Browse files
enhance version bump workflow to improve detection of production changes
1 parent 50a56df commit 8f40435

File tree

1 file changed

+51
-26
lines changed

1 file changed

+51
-26
lines changed
Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
# Require version + CHANGELOG bump when merging to master/main/development (skip when only test/docs/config).
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).
23
name: Check Version Bump
34

45
on:
56
pull_request:
6-
branches: [master, main, development]
7+
branches:
8+
- master
9+
- main
10+
- development
711

812
jobs:
913
version-bump:
@@ -25,42 +29,63 @@ jobs:
2529
BASE_SHA: ${{ github.event.pull_request.base.sha }}
2630
run: |
2731
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"
2834
if [ -n "$BASE_SHA" ] && git rev-parse --verify "$BASE_SHA" >/dev/null 2>&1; then
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."
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."
3340
exit 0
3441
fi
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);
42+
# Skip when only comments changed (any file/folder): JS, HTML, shell, YAML, SQL, etc.
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) => {
47+
const t = (s||'').slice(1).replace(/^\s+|\s+$/g,'');
48+
if (!t) return true;
49+
return /^\/\//.test(t) || /^\/\*/.test(t) || /^\*\//.test(t) || /^\s*\*(\s|$)/.test(t) || /^#/.test(t)
50+
|| /^<!--/.test(t) || /^-->/.test(t) || /^\s*--(\s|$)/.test(t)
51+
|| /^\s*[\"\']\s*/.test(t) || /^;\s*/.test(t) || /^\s*%/.test(t)
52+
|| /^[\s*\-=]+$/.test(t);
53+
};
54+
process.exit(lines.length > 0 && !lines.some(l => !isComment(l)) ? 0 : 1);
55+
} catch(e) { process.exit(1); }
4056
" 2>/dev/null; then
41-
echo "Only comments changed (lib/ or other). Skipping."
57+
echo "Only comments changed in code. Skipping version bump check."
4258
exit 0
4359
fi
4460
fi
45-
4661
PKG_VERSION=$(node -p "require('./package.json').version.replace(/^v/, '')")
47-
[ -n "$PKG_VERSION" ] || { echo "::error::Could not read package.json version"; exit 1; }
48-
62+
if [ -z "$PKG_VERSION" ]; then
63+
echo "::error::Could not read version from package.json"
64+
exit 1
65+
fi
4966
git fetch --tags --force 2>/dev/null || true
5067
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || true)
5168
if [ -z "$LATEST_TAG" ]; then
52-
echo "No tags yet. Skipping."
69+
echo "No existing tags found. Skipping version-bump check (first release)."
5370
exit 0
5471
fi
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)."
72+
LATEST_VERSION="${LATEST_TAG#v}"
73+
LATEST_VERSION="${LATEST_VERSION%%-*}"
74+
if [ "$(printf '%s\n' "$LATEST_VERSION" "$PKG_VERSION" | sort -V | tail -1)" != "$PKG_VERSION" ]; then
75+
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."
5976
exit 1
6077
fi
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)."
78+
if [ "$PKG_VERSION" = "$LATEST_VERSION" ]; then
79+
echo "::error::Version bump required: package.json version ($PKG_VERSION) equals latest tag ($LATEST_TAG). Please bump the version in package.json."
80+
exit 1
81+
fi
82+
CHANGELOG_VERSION=$(sed -nE 's/^## \[v?([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' CHANGELOG.md | head -1)
83+
if [ -z "$CHANGELOG_VERSION" ]; then
84+
echo "::error::Could not find a version entry in CHANGELOG.md (expected line like '## [v1.0.0](...)')."
85+
exit 1
86+
fi
87+
if [ "$CHANGELOG_VERSION" != "$PKG_VERSION" ]; then
88+
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."
89+
exit 1
90+
fi
91+
echo "Version bump check passed: package.json and CHANGELOG.md are at $PKG_VERSION (latest tag: $LATEST_TAG)."

0 commit comments

Comments
 (0)