Create Release on Version Bump #15
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 }} |