Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions .github/workflows/node-github-releases.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# .github/workflows/release.yml
name: Auto Release

on:
push:
branches:
- "main"
paths:
- 'package.json'
permissions:
contents: write

jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 2

- name: Check if version changed
id: version
run: |
# Get current version
CURRENT_VERSION=$(jq -r '.version' package.json)

# Get previous version
git show HEAD~1:package.json > /tmp/old-package.json 2>/dev/null || echo '{"version":"0.0.0"}' > /tmp/old-package.json
PREVIOUS_VERSION=$(jq -r '.version' /tmp/old-package.json)

echo "current=$CURRENT_VERSION" >> $GITHUB_OUTPUT
echo "previous=$PREVIOUS_VERSION" >> $GITHUB_OUTPUT

if [ "$CURRENT_VERSION" != "$PREVIOUS_VERSION" ]; then
echo "changed=true" >> $GITHUB_OUTPUT
else
echo "changed=false" >> $GITHUB_OUTPUT
fi

# Check if prerelease (contains hyphen)
if [[ "$CURRENT_VERSION" == *-* ]]; then
echo "prerelease=true" >> $GITHUB_OUTPUT
else
echo "prerelease=false" >> $GITHUB_OUTPUT
fi

- name: Validate version increment
if: steps.version.outputs.changed == 'true'
run: |
CURRENT="${{ steps.version.outputs.current }}"
PREVIOUS="${{ steps.version.outputs.previous }}"

# Function to compare semver versions
version_compare() {
# Strip prerelease suffix for base comparison
local v1_base="${1%%-*}"
local v2_base="${2%%-*}"
local v1_pre="${1#*-}"
local v2_pre="${2#*-}"

# If no prerelease, set to empty
[[ "$v1_base" == "$1" ]] && v1_pre=""
[[ "$v2_base" == "$2" ]] && v2_pre=""

# Compare major.minor.patch
IFS='.' read -ra V1 <<< "$v1_base"
IFS='.' read -ra V2 <<< "$v2_base"

for i in 0 1 2; do
local n1="${V1[$i]:-0}"
local n2="${V2[$i]:-0}"
if (( n1 > n2 )); then
echo "greater"
return
elif (( n1 < n2 )); then
echo "lesser"
return
fi
done

# Base versions equal, compare prerelease
# No prerelease > prerelease (1.0.0 > 1.0.0-beta)
if [[ -z "$v1_pre" && -n "$v2_pre" ]]; then
echo "greater"
elif [[ -n "$v1_pre" && -z "$v2_pre" ]]; then
echo "lesser"
elif [[ "$v1_pre" > "$v2_pre" ]]; then
echo "greater"
elif [[ "$v1_pre" < "$v2_pre" ]]; then
echo "lesser"
else
echo "equal"
fi
}

RESULT=$(version_compare "$CURRENT" "$PREVIOUS")

if [[ "$RESULT" == "lesser" ]]; then
echo "::error::Version downgrade detected: $PREVIOUS → $CURRENT"
echo "Version must be incremented, not decremented."
exit 1
fi

echo "✓ Version increment valid: $PREVIOUS → $CURRENT"

- name: Create Release
if: steps.version.outputs.changed == 'true'
uses: actions/github-script@v7
with:
script: |
const version = '${{ steps.version.outputs.current }}';
const isPrerelease = ${{ steps.version.outputs.prerelease }};
const tagName = `v${version}`;

const release = await github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: tagName,
name: tagName,
target_commitish: context.sha,
generate_release_notes: true,
prerelease: isPrerelease
});

console.log(`Created ${isPrerelease ? 'prerelease' : 'release'}: ${release.data.html_url}`);