Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 114 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
^^^^^^^^^
Changelog
^^^^^^^^^

1.16.1 (2026-10-22)
-------------------
* fix(release): name what an override downgrades in the release summary (#31)

1.16.0 (2026-10-21)
-------------------
* feat(release): carry a package's source tarball to the archive (#27)
* feat(release)!: build the .deb for amd64 and arm64 on native runners (#26)

1.15.0 (2026-10-21)
-------------------
* feat(ci)!: evaluate also repos.list of every dependency (#29)
* fix(release): detect packages whose package.xml is at the repository root (#25)

1.14.0 (2026-10-19)
-------------------
* fix(ici): send CI_PAT as an auth header and disable git prompts (#24)
* feat(ici): install every requirements.txt in the repository (#23)

1.13.0 (2026-10-14)
-------------------
* No changes.

1.12.0 (2026-10-14)
-------------------
* fix: title check for new packages with previously empty version (#21)

1.11.0 (2026-10-14)
-------------------
* feat(orchestrator): add extra_distros input (#22)

1.10.0 (2026-10-12)
-------------------
* feat(ci): publish status badges to a badges branch (#20)

1.9.0 (2026-10-05)
------------------
* feat: publish a built package into a signed archive root (#19)

1.8.0 (2026-09-14)
------------------
* fix: make workflows composite actions and expand allowed title types (#18)

1.7.3 (2026-09-10)
------------------
* chore: add gh all workflows that require it (#16)

1.7.2 (2026-09-10)
------------------
* chore: add gh to runner scratch environment (#15)

1.7.1 (2026-09-09)
------------------
* fix: release regex coverage and runner inputs to workflows (#14)

1.7.0 (2026-09-09)
------------------
* feat(release): generate release pull requests, per package or per repo (#13)
* ci: update CI orchestrator workflow to use duatic_devtools (#12)
* ci: add reusable title check workflow (#11)

1.6.1 (2026-09-03)
------------------
* ci: pin the shared pre-commit config to devtools v1 (#10)

1.6.0 (2026-09-03)
------------------
* feat: add release helpers (#9)
* ci: add reusable release check workflow (#8)

1.5.1 (2026-08-26)
------------------
* fix: increase job timeout from 30 to 60 minutes (#7)

1.5.0 (2026-08-25)
------------------
* feat(ci): test with cyclonedds (#6)

1.4.1 (2026-08-05)
------------------
* fix: stop @claude review from cancelling itself (#5)

1.4.0 (2026-08-05)
------------------
* feat: add @claude review on PRs (#4)

1.3.2 (2026-07-22)
------------------
* feat(ci): run all orchestrator jobs on the configured runner

1.3.1 (2026-07-16)
------------------
* fix: update badges for skipped or cancelled runs

1.3.0 (2026-07-14)
------------------
* feat(ci): add opt-in gist-backed status badges (#3)

1.2.0 (2026-07-04)
------------------
* feat(ci): auto-detect requirements.txt and Aptfile in reusable_ici.yml
* feat(ci): add Release workflow (#2)

1.1.0 (2026-07-03)
------------------
* feat(ci): add orchestrator entry point, centralize matrix and policy

1.0.0 (2026-07-03)
------------------
* feat(ci): add reusable ROS industrial_ci and pre-commit workflows
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,8 @@ with `release:` is left alone.
Once that `CHANGELOG.rst` exists, the `release-check` and `title-check` actions check the repository
on it:
a new version section needs a `release:` title naming it, must come after the last tag, and a
`release:` title needs a new section.
`release:` title needs a new section. A section for a version already tagged is history, which any
pull request may add.

```yaml
# .github/workflows/release.yml
Expand Down
18 changes: 12 additions & 6 deletions release/check_release_pr.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@
A repository whose root holds CHANGELOG.rst and no package.xml is versioned by that changelog and
its v<version> tags instead, and any package.xml deeper in it is not released: a release adds one
version section there, ahead of the base's and of every tag, and a section added in any other pull
request is a release nobody titled as one.
request is a release nobody titled as one. A section for a version already tagged is history, not a
release, so the changelog of earlier releases can be added at any time.

Usage: check_release_pr.py --base origin/main [--head HEAD] [--title "release: ..."]
Exit 0 if consistent, 1 if not.
Expand Down Expand Up @@ -112,20 +113,25 @@ def changelog_versions(ref, path):
return {m.group(1) for m in SECTION.finditer(blob)}


def latest_repo_tag():
"""The highest version among the v<version> tags, or None."""
versions = [
def repo_tags():
"""The versions of the v<version> tags."""
return {
t[1:]
for t in git("tag", "--list", "v*").split()
if as_tuple(t[1:]) and len(as_tuple(t[1:])) == 3
]
}


def latest_repo_tag():
"""The highest version among the v<version> tags, or None."""
versions = repo_tags()
return max(versions, key=as_tuple) if versions else None


def check_changelog_repo(merge_base, head, title, is_release):
"""The release check for a repository released by its root CHANGELOG.rst. Returns the exit code."""
path = "CHANGELOG.rst"
added = changelog_versions(head, path) - changelog_versions(merge_base, path)
added = changelog_versions(head, path) - changelog_versions(merge_base, path) - repo_tags()
problems = []
new = None
if len(added) > 1:
Expand Down
20 changes: 20 additions & 0 deletions release/test_check_release_pr.sh
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,26 @@ check 1 "root package bumped, titled as a feature" "feat: something"

WORK="${WORK%/root_pkg}" # so the trap removes the outer repository too

echo "=== a repository released by its root changelog may add the history of its tags ==="
WORK="$WORK/changelog_repo" && mkdir "$WORK" && cd "$WORK"
git init -q -b main . && git config user.email t@duatic.invalid && git config user.name t
echo readme > README.md && git add -A && git commit -qm baseline
git tag v1.0.0 && git tag v1.1.0
section() { printf '%s\n%s\n* something\n\n' "$1" "$(printf '%*s' ${#1} '' | tr ' ' '-')"; }
history() { printf '^^^^^^^^^\nChangelog\n^^^^^^^^^\n\n'; for v in "$@"; do section "$v (2026-01-01)"; done; }
git checkout -qb h1
history 1.1.0 1.0.0 > CHANGELOG.rst && git add -A && git commit -qm "docs(changelog): add the earlier releases"
check 0 "sections for tagged versions, titled as docs" "docs(changelog): add the earlier releases"
git checkout -q main && git checkout -qb h2
history 1.2.0 1.1.0 1.0.0 > CHANGELOG.rst && git add -A && git commit -qm "release: 1.2.0"
check 0 "the earlier releases and a new one, titled as a release" "release: 1.2.0"
check 1 "the same, titled as docs" "docs(changelog): add the earlier releases"
git checkout -q main && git checkout -qb h3
history 1.0.1 1.0.0 > CHANGELOG.rst && git add -A && git commit -qm "release: 1.0.1"
check 1 "a section for an untagged version behind the tags" "release: 1.0.1"

WORK="${WORK%/changelog_repo}"

echo
echo " $pass passed, $fail failed"
[ "$fail" -eq 0 ]
Loading