rob thijssen 22e2e34724 docs: note tag.gpgsign requires -m flag on tag creation
Learned the hard way on the v1.0.0 release — this repo inherits
tag.gpgsign=true from global config, so `git tag v1.0.0` fails
with "no tag message?" rather than creating a lightweight tag.
Update the release recipe to use -m explicitly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 15:23:19 +03:00

rpm-changelog

Gitea composite action that generates an rpm %changelog entry from git history and prepends it to a spec file. Designed to run during release CI so the changelog never drifts out of sync with the code.

Why use this

Hand-maintained rpm %changelog sections drift. The day-of-week gets stale, the version lags behind tags, and the description stops matching what actually changed. This action:

  • Finds the previous release tag (default pattern v*).
  • Collects commits between that tag and HEAD via git log.
  • Filters out noise (bump-version bot commits, merge commits — both configurable).
  • Writes a fresh %changelog entry with today's date, the release author, and the new version.
  • Prepends it to the spec file's existing %changelog section.

Because the date is generated at build time, rpmbuild will never warn about bogus weekdays and the entry always reflects what changed since the last release.

Requirements

The consumer workflow must check out the repo with full git history:

- uses: actions/checkout@v4
  with:
    fetch-depth: 0

Without this, git describe can't see prior tags and the entry will default to "No user-visible changes" on every release.

Inputs

Input Required Default Description
spec yes Path to the rpm spec file to update.
version yes Version string for the new entry (without release suffix), e.g. 0.1.10.
release no 1 Release suffix to append after the version.
author no Gitea Actions <actions@git.lair.cafe> Name and email for the entry.
tag-pattern no v* Glob pattern for release tags, used to locate the previous release.
exclude-patterns no (see below) Newline-separated grep -E patterns to drop from the generated log.

Default exclude-patterns:

^- chore: bump version
^- Merge

Usage

jobs:
  srpm:
    runs-on: fedora
    if: startsWith(github.ref, 'refs/tags/v')
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Determine version
        id: version
        run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT"

      - name: Stamp version in spec
        run: sed -i "s/^Version:.*/Version:        ${{ steps.version.outputs.VERSION }}/" mypackage.spec

      - name: Update changelog
        uses: https://git.lair.cafe/actions/rpm-changelog@v1
        with:
          spec: mypackage.spec
          version: ${{ steps.version.outputs.VERSION }}

      - name: Build SRPM
        run: rpmbuild -bs mypackage.spec --define "_sourcedir $(pwd)"

Note the fully-qualified URL in uses: — the Gitea instance's DEFAULT_ACTIONS_URL points at github.com, so internal actions must be referenced by absolute URL.

Versioning

Pin to a major version tag (@v1) for automatic patch/minor updates. Pin to an exact tag (@v1.0.2) to freeze.

Behaviour notes

  • If no previous tag matching tag-pattern exists (first release), the entry body becomes - No user-visible changes.
  • If the filter removes every commit (e.g. release contained only bump-version chores), body is - No user-visible changes.
  • The spec file must already contain a %changelog line — the action will error out rather than mangle an unmarked file.
  • The date uses UTC (date -u) so runners in different timezones produce deterministic output.
Description
No description provided
Readme 46 KiB
Languages
Shell 100%