feat: initial rpm-changelog composite action
Generates an rpm %changelog entry from git history and prepends it to the target spec file. Runs in release CI so every tag push gets a fresh dated entry covering the commits since the previous matching tag. Avoids stale dates, forgotten bumps, and bogus-weekday warnings. Inputs: spec path, version, optional release suffix, author, tag-pattern, exclude-patterns. The last two make the defaults (v* tags, filter bump-version chores and merges) tweakable for projects with different conventions. Migrated from inline logic in helexa/cortex so any project can adopt the same pattern with a single uses: reference. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
103
README.md
Normal file
103
README.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# 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:
|
||||
|
||||
```yaml
|
||||
- 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
|
||||
|
||||
```yaml
|
||||
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.
|
||||
Reference in New Issue
Block a user