Refined workflow to ensure smoother updates to the release branch. Added steps to stash and apply local changes to prevent conflicts. Provided specific commands to checkout and update the release branch correctly. This approach maintains the branch's integrity and ensures all modifications are properly committed and pushed.
136 lines
5.0 KiB
YAML
136 lines
5.0 KiB
YAML
name: Create Release
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
paths:
|
|
- 'package.json'
|
|
workflow_dispatch: # Allows manual execution of the workflow.
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Set up Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '20.8.0'
|
|
|
|
- name: Install Dependencies
|
|
run: npm install
|
|
|
|
- name: Run Tests
|
|
run: npm run test:verbose
|
|
|
|
- name: Build the Project
|
|
run: npm run build:tsc
|
|
|
|
- name: Get the version
|
|
id: get_version
|
|
run: |
|
|
VERSION=$(npm run version:show | tail -n 1)
|
|
echo "VERSION=$VERSION" >> $GITHUB_ENV
|
|
shell: bash
|
|
|
|
- name: Get previous release tag
|
|
id: get_previous_release
|
|
run: |
|
|
echo "Fetching previous release tag..."
|
|
previous_tag=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
|
|
if [ -z "$previous_tag" ]; then
|
|
echo "No previous tag found, using initial commit."
|
|
previous_tag=$(git rev-list --max-parents=0 HEAD)
|
|
fi
|
|
echo "Previous tag: $previous_tag"
|
|
echo "PREVIOUS_TAG=$previous_tag" >> $GITHUB_ENV
|
|
shell: bash
|
|
|
|
- name: Check if version changed
|
|
id: check_version
|
|
run: |
|
|
# Check if the version already exists as a tag
|
|
if git rev-parse "refs/tags/${{ env.VERSION }}" >/dev/null 2>&1; then
|
|
echo "skip_release=true" >> $GITHUB_OUTPUT
|
|
echo "Version ${{ env.VERSION }} already exists as a tag. No release will be created."
|
|
exit 0
|
|
fi
|
|
|
|
# Compare current version with previous tag
|
|
if [ "${{ env.VERSION }}" == "${{ env.PREVIOUS_TAG }}" ]; then
|
|
echo "skip_release=true" >> $GITHUB_OUTPUT
|
|
echo "Version has not changed. No release will be created."
|
|
exit 0
|
|
fi
|
|
echo "skip_release=false" >> $GITHUB_OUTPUT
|
|
shell: bash
|
|
|
|
- name: Generate release notes
|
|
id: generate_notes
|
|
if: steps.check_version.outputs.skip_release == 'false'
|
|
run: |
|
|
echo "Generating release notes from ${{ env.PREVIOUS_TAG }} to HEAD..."
|
|
repo_url=$(git config --get remote.origin.url)
|
|
notes=$(git log ${{ env.PREVIOUS_TAG }}..HEAD --pretty=format:"- [\`%h\`]($repo_url/commit/%H): %s%n")
|
|
echo "Release notes:"
|
|
echo "$notes"
|
|
echo "### Changes in this release" > release_notes.md
|
|
echo "$notes" >> release_notes.md
|
|
shell: bash
|
|
|
|
- name: Set Git user
|
|
if: steps.check_version.outputs.skip_release == 'false'
|
|
run: |
|
|
git config --local user.name "GitHub Actions"
|
|
git config --local user.email "actions@github.com"
|
|
shell: bash
|
|
|
|
- name: Create temporary branch
|
|
id: create_temp_branch
|
|
if: steps.check_version.outputs.skip_release == 'false'
|
|
run: |
|
|
# Stash current changes (optional, only if you have unstaged changes you want to keep)
|
|
git stash
|
|
|
|
# Checkout the release branch
|
|
git checkout release
|
|
|
|
# Apply stashed changes (if you stashed earlier)
|
|
git stash pop || true
|
|
|
|
# Add new/modified files
|
|
git add README.md package.json LICENSE dist/ src/ tsconfig.json
|
|
|
|
# Commit the changes
|
|
git commit -m "Prepare files for release ${{ env.VERSION }}"
|
|
|
|
# Push the changes to the release branch
|
|
git push origin release
|
|
shell: bash
|
|
|
|
- name: Create and push tag
|
|
id: create_tag
|
|
if: steps.check_version.outputs.skip_release == 'false'
|
|
run: |
|
|
git tag ${{ env.VERSION }}
|
|
git push origin ${{ env.VERSION }}
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
shell: bash
|
|
|
|
- name: Release
|
|
if: steps.check_version.outputs.skip_release == 'false'
|
|
uses: softprops/action-gh-release@v2
|
|
with:
|
|
tag_name: ${{ env.VERSION }}
|
|
name: Release ${{ env.VERSION }}
|
|
body_path: release_notes.md
|
|
prerelease: true
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|