Skip to content

Create Release on Version Bump #15

Create Release on Version Bump

Create Release on Version Bump #15

name: Create Release on Version Bump
on:
workflow_dispatch: # Manually trigger
inputs:
force:
description: "Force publish even if versions match"
required: false
default: "false"
push:
branches: [master]
jobs:
publish_release:
runs-on: ubuntu-latest
outputs:
new_version: ${{ steps.extract.outputs.new_version }}
last_tag: ${{ steps.extract.outputs.last_tag }}
prev_version: ${{ steps.extract.outputs.prev_version }}
changelog: ${{ steps.extract.outputs.changelog }}
steps:
- uses: actions/checkout@v4
with:
fetch-tags: true
- name: Extract versions
id: version
run: |
set -eo pipefail
# Extract version headings and their positions
mapfile -t versions < <(grep -En '^##[[:space:]]*\[?[0-9]+\.[0-9]+\.[0-9]+\]?' CHANGELOG.md | head -n 3)
line1=$(echo "${versions[0]}" | cut -d: -f1)
line2=$(echo "${versions[1]}" | cut -d: -f1)
line3=$(echo "${versions[2]}" | cut -d: -f1 || echo "\$")
new_version=$(echo "${versions[0]}" | sed -E 's/^.*##[[:space:]]*\[?([0-9]+\.[0-9]+\.[0-9]+)\]?.*/\1/')
prev_version=$(echo "${versions[1]}" | sed -E 's/^.*##[[:space:]]*\[?([0-9]+\.[0-9]+\.[0-9]+)\]?.*/\1/')
last_tag=$(git tag | sort -V | tail -n 1)
changelog=$(sed -n "$line1,$((line2 - 1))p" CHANGELOG.md | tail -n +2)
echo "new_version=$new_version" | tee --append "$GITHUB_OUTPUT"
echo "last_tag=$last_tag" | tee --append "$GITHUB_OUTPUT"
echo "prev_version=$prev_version" | tee --append "$GITHUB_OUTPUT"
echo "changelog<<EOF" | tee --append "$GITHUB_OUTPUT"
echo "$changelog" | tee --append "$GITHUB_OUTPUT"
echo "EOF" | tee --append "$GITHUB_OUTPUT"
- name: Verify version matches package.json and package-lock.json
run: |
changelog_version="${{ steps.version.outputs.new_version }}"
pkg_version=$(jq -r .version package.json)
lock_version=$(jq -r .version package-lock.json)
echo "CHANGELOG.md: $changelog_version"
echo "package.json: $pkg_version"
echo "package-lock.json: $lock_version"
if [[ "$pkg_version" != "$changelog_version" ]]; then
echo "❌ Version mismatch: package.json ($pkg_version) != CHANGELOG.md ($changelog_version)"
exit 1
fi
if [[ "$lock_version" != "$changelog_version" ]]; then
echo "❌ Version mismatch: package-lock.json ($lock_version) != CHANGELOG.md ($changelog_version)"
exit 1
fi
echo "✅ Versions match"
- name: Create tag and release
if: steps.version.outputs.new_version != steps.version.outputs.last_tag || github.event.inputs.force == 'true'
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ steps.version.outputs.new_version }}
name: Release v${{ steps.version.outputs.new_version }}
body: |
${{ env.changelog }}
**Full Changelog**: https://github.com/augustocdias/vscode-shell-command/compare/v${{ steps.version.outputs.prev_version }}...v${{ steps.version.outputs.new_version }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}