name: Release Accessibility Widget on: push: branches: - main permissions: contents: write jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 # Full history for changelog generation - name: Get current version from package.json id: get_version run: | version=$(grep -oP '"version":\s*"\K[0-9.]+' package.json) echo "Current version: $version" echo "current_version=$version" >> $GITHUB_OUTPUT echo "CURRENT_VERSION=$version" >> $GITHUB_ENV - name: Determine if release is needed id: should_release run: | commit_msg="${{ github.event.head_commit.message }}" echo "Commit message: $commit_msg" if [[ "$commit_msg" =~ release ]]; then echo "should_release=true" >> $GITHUB_OUTPUT echo "SHOULD_RELEASE=true" >> $GITHUB_ENV else echo "should_release=false" >> $GITHUB_OUTPUT echo "SHOULD_RELEASE=false" >> $GITHUB_ENV echo "ℹ️ Commit does not contain 'release' keyword - skipping release" fi - name: Calculate new version id: new_version if: steps.should_release.outputs.should_release == 'true' run: | current="${{ steps.get_version.outputs.current_version }}" IFS='.' read -ra parts <<< "$current" major="${parts[0]:-2}" minor="${parts[1]:-0}" patch="${parts[2]:-0}" # Increment patch version (2.0.0 -> 2.0.1 -> 2.0.2, etc.) patch=$((patch + 1)) new_version="$major.$minor.$patch" echo "New version will be: $new_version" echo "new_version=$new_version" >> $GITHUB_OUTPUT echo "NEW_VERSION=$new_version" >> $GITHUB_ENV - name: Check if version already exists id: check_tag if: steps.should_release.outputs.should_release == 'true' run: | new_version="${{ steps.new_version.outputs.new_version }}" if git rev-parse "v$new_version" >/dev/null 2>&1; then echo "Tag v$new_version already exists!" echo "tag_exists=true" >> $GITHUB_OUTPUT else echo "Tag v$new_version does not exist, proceeding..." echo "tag_exists=false" >> $GITHUB_OUTPUT fi - name: Update version in package.json if: steps.should_release.outputs.should_release == 'true' && steps.check_tag.outputs.tag_exists == 'false' run: | current="${{ steps.get_version.outputs.current_version }}" new="${{ steps.new_version.outputs.new_version }}" # Update package.json version sed -i "s/\"version\": \"$current\"/\"version\": \"$new\"/" package.json echo "Updated version from $current to $new in package.json" - name: Generate changelog id: changelog if: steps.should_release.outputs.should_release == 'true' && steps.check_tag.outputs.tag_exists == 'false' run: | # Get the latest tag or use initial commit if no tags exist latest_tag=$(git describe --tags --abbrev=0 2>/dev/null || git rev-list --max-parents=0 HEAD) echo "## What's Changed" > CHANGELOG.md echo "" >> CHANGELOG.md # Get commits since last tag git log $latest_tag..HEAD --pretty=format:"- %s (%h)" --no-merges >> CHANGELOG.md echo "" >> CHANGELOG.md echo "" >> CHANGELOG.md echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/$latest_tag...v${{ steps.new_version.outputs.new_version }}" >> CHANGELOG.md # Output for release body cat CHANGELOG.md # Save changelog for release { echo 'changelog<> $GITHUB_OUTPUT - name: Commit version bump if: steps.should_release.outputs.should_release == 'true' && steps.check_tag.outputs.tag_exists == 'false' run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" git add package.json git commit -m "chore: bump version to ${{ steps.new_version.outputs.new_version }}" git push - name: Create release package if: steps.should_release.outputs.should_release == 'true' && steps.check_tag.outputs.tag_exists == 'false' run: | mkdir -p accessibility-widgets cp widget.js accessibility-widgets/ cp README.md accessibility-widgets/ cp LICENSE accessibility-widgets/ cp package.json accessibility-widgets/ zip -r accessibility-widgets-v${{ steps.new_version.outputs.new_version }}.zip accessibility-widgets rm -rf accessibility-widgets # Verify zip was created ls -lh accessibility-widgets-v${{ steps.new_version.outputs.new_version }}.zip - name: Create GitHub Release if: steps.should_release.outputs.should_release == 'true' && steps.check_tag.outputs.tag_exists == 'false' uses: softprops/action-gh-release@v1 with: files: accessibility-widgets-v${{ steps.new_version.outputs.new_version }}.zip tag_name: "v${{ steps.new_version.outputs.new_version }}" name: "Accessibility Widgets v${{ steps.new_version.outputs.new_version }}" body: | # Changelog ${{ steps.changelog.outputs.changelog }} draft: false prerelease: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Summary if: steps.should_release.outputs.should_release == 'true' run: | if [ "${{ steps.check_tag.outputs.tag_exists }}" = "true" ]; then echo "⚠️ Release skipped - version v${{ steps.new_version.outputs.new_version }} already exists" else echo "✅ Successfully created release v${{ steps.new_version.outputs.new_version }}" echo "📦 Widget package attached to release" echo "🔄 Available via CDN and npm" fi - name: Skip Release Info if: steps.should_release.outputs.should_release == 'false' run: | echo "ℹ️ No release triggered. To create a release, include 'release' in your commit message." echo "Example: git commit -m 'feat: new feature release'"