Simplified the workflow by eliminating the creation and usage of a temporary branch for releasing. Changes are now directly committed and pushed to the release branch, streamlining the process and reducing complexity.
127 lines
4.7 KiB
YAML
127 lines
4.7 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: |
|
|
git checkout release
|
|
git reset
|
|
rm -f .gitignore
|
|
git add README.md package.json LICENSE dist/ src/ tsconfig.json
|
|
git commit -m "Prepare files for release ${{ env.VERSION }}"
|
|
git push origin release
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
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 }}
|