124 lines
4.6 KiB
YAML
124 lines
4.6 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=v$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 --orphan release/v${{ env.VERSION }}
|
|
# 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 }}"
|
|
# 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 }}
|