wfxr.forgit/.github/workflows/release.yaml
carlfriedrich aec8b1f2b5
Meta: Do not tag release without public changes (#427)
This is mostly a refactoring of our GitHub actions. The tag workflow and
script have been removed completely, since the release action will
implicitly create the release tag if it does not exit, yet. This makes
sure that we do not create a tag when there will be no release.

We have only one workflow now, which contains two jobs: one for
generating the changelog and one for creating the release.

The changelog job will generate the changelog and upload it as an
artifact if there are public changes. The release version, which
previously was determined in the tag script, is now determined within
this job, so that we can pass it to the release job.

The release job will run only if the changelog job was successful, i.e.
if there are public changes. It will create a tag and a GitHub release
with the given version number.

The workflow will run on the first day of every month for our regular
automatic monthly releases.
It will also run on every tag push, so that we still can create a
release manually if necessary. The release action will implicitly use
the existing tag for the release then.

Fixes #413
Closes #414
2025-03-14 07:01:12 +01:00

79 lines
2.2 KiB
YAML

name: Release
on:
schedule:
# Run on every first day of the month
- cron: '0 0 1 * *'
push:
tags:
- '**'
jobs:
changelog:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate Changelog
id: changelog
run: .github/scripts/changelog.sh > CHANGELOG.md
# When the script returns with an error, it indicates that we don't have
# any public changes to be released. This is expected behavior, so we
# quit the workflow successfully in this case.
continue-on-error: true
- name: Upload Changelog
uses: actions/upload-artifact@v4
if: steps.changelog.outcome == 'success'
with:
name: changelog
path: CHANGELOG.md
- name: Set version
id: set_version
if: steps.changelog.outcome == 'success'
# Set version depending on whether this is a regular monthly release or
# a custom release triggered by a tag push.
run: |
if [ "${{ github.event_name }}" == "push" ]; then
VERSION=${{ github.ref_name }}
else
VERSION=$(date +'%y.%m.0')
fi
echo "VERSION=$VERSION"
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
outputs:
changeLogOutcome: ${{ steps.changelog.outcome }}
version: ${{ steps.set_version.outputs.VERSION }}
release:
runs-on: ubuntu-latest
needs: changelog
if: needs.changelog.outputs.changeLogOutcome == 'success'
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download Changelog
uses: actions/download-artifact@v4
with:
name: changelog
- name: Create Package
run: tar -czf forgit-${{ needs.changelog.outputs.version }}.tar.gz --exclude LICENSE --exclude README.md *
- name: Release
uses: softprops/action-gh-release@v2
with:
# The release action implicitly creates the tag if it does not exist.
tag_name: ${{ needs.changelog.outputs.version }}
body_path: CHANGELOG.md
files: forgit-${{ needs.changelog.outputs.version }}.tar.gz