chore(release): prepare the package for a rosdistro release - #73
benaliabderrahmane wants to merge 3 commits into
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
The CI validation job has a critical changelog-path error and incomplete checks, and the release instructions omit pushing the release tag.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Prepares the package for Bloom/ROS distribution release by updating metadata, changelog format, release documentation, and CI coverage.
Changes:
- Adds package URLs and a Bloom-compatible changelog.
- Documents release procedures and distro scope.
- Adds Lyrical release support and metadata validation CI.
File summaries
| File | Description |
|---|---|
rmw_unix_socket_cpp/package.xml |
Adds repository, bugtracker, and website URLs. |
rmw_unix_socket_cpp/CHANGELOG.rst |
Provides the package-local Bloom-compatible changelog. |
RELEASING.md |
Documents Bloom release procedures. |
CHANGELOG.md |
Removes the superseded Markdown changelog. |
.github/workflows/release.yml |
Adds Lyrical to release builds. |
.github/workflows/ci.yml |
Adds release metadata validation. |
Review details
Suppressed comments (3)
.github/workflows/ci.yml:130
- This only verifies that the package version appears somewhere in the changelog history. If
package.xmlis left at an older version, that old entry still satisfies the assertion and a release can proceed with a newer changelog entry; compare the package version with the newest parsed version instead.
assert pkg.version in versions, f'package.xml {pkg.version} has no changelog entry'
.github/workflows/ci.yml:123
- The release requirement is for
repository,bugtracker, andwebsiteURLs, butassert pkg.urlspasses with any single URL. A future removal of one of the required links would still make this guard green; assert those URL types explicitly.
assert pkg.urls, 'package.xml has no <url> tags'
RELEASING.md:51
catkin_prepare_releasecreates the release commit and tag locally; it does not push them to the remote. Following this sequence therefore reachesbloom-releasewithout a remote tag, so the precedingrelease.ymlcheck cannot run; add an explicit push command using the actual remote/branch beforebloom-release, or remove “pushes” and document where that step occurs.
catkin_prepare_release # bumps package.xml, commits, tags, pushes
- Files reviewed: 6/6 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
Thanks — two of the four points were real and are fixed in 0a8e3b8. Two are not Accepted
Both were weakened by hand when the check was inlined into the workflow; the Not correct
def get_changelog_from_path(path, package_name=None):
changelog = Changelog(package_name)
if os.path.isdir(path):
path = os.path.join(path, CHANGELOG_FILENAME)
The real bug in that lineThe tag prefix was wrong, which the review did not flag: tag_name = args.tag_prefix + new_version # --tag-prefix defaults to ''So the documented command produced Guard now has negative testsThe tightened assertions were checked against mutated copies of the metadata to |
There was a problem hiding this comment.
🟡 Changes recommended
The new CI metadata validation currently fails due to incorrect changelog handling and version selection, and does not fully validate changelog content.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (2)
.github/workflows/ci.yml:129
- The second argument is the changelog filename, so passing
PKGmakescatkin_pkglook forrmw_unix_socket_cpp/rmw_unix_socket_cppinstead ofrmw_unix_socket_cpp/CHANGELOG.rst. This new job will fail before validating the changelog; use the default filename or passfilename='CHANGELOG.rst'.
changelog = get_changelog_from_path(PKG, PKG)
.github/workflows/ci.yml:138
- This only asserts that some parsed content remains; it does not enforce the no-subsections rule described above. A version with an intro paragraph plus
Added/Fixedsubsections would still pass becausecatkin_pkgsilently drops the subsection content, allowing an incomplete Debian changelog to ship. Please validate the raw RST structure (or otherwise reject subsection headings) in addition to checking non-empty parsed content.
for version, date, content in changelog.foreach_version():
assert date, f'{version} has no parseable date'
assert content, f'{version} body is empty (sub-sections are dropped)'
- Files reviewed: 6/6 changed files
- Comments generated: 1
- Review effort level: Lite
| changelog = get_changelog_from_path(PKG, PKG) | ||
| assert changelog is not None, f'no CHANGELOG.rst in {PKG}/' | ||
| versions = [v for v, _, _ in changelog.foreach_version()] | ||
| assert pkg.version == versions[-1], \ |
|
Second review: one valid, one repeat. Fixed in 750282c. Valid, and a real hole. The non-empty-body assertion did not enforce the Proven by mutation, asserting on which check fires rather than merely that The fifth case demotes headings only inside Repeat: |
There was a problem hiding this comment.
🟡 Changes recommended
Correct the release-tag template from v:{version} to v{version}.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
- Files reviewed: 6/6 changed files
- Comments generated: 1
- Review effort level: Lite
| | Upstream repository uri | `https://github.com/benaliabderrahmane/rmw_unix_socket_cpp.git` | | ||
| | Upstream devel branch | the branch for that distro (`main` until per-distro branches exist) | | ||
| | Version | `:{auto}` | | ||
| | Release tag | `v:{version}` | |
|
Third review: Bloom substitutes track templates with a class ConfigTemplate(string.Template):
delimiter = ':''release_tag': PromptEntry('Release Tag', default=':{version}', spec=config_spec['release_tag']),Running bloom's own class over both candidates:
Running tally across the three reviews: two findings were correct and are fixed tag_name = args.tag_prefix + new_version # --tag-prefix defaults to '' |
There was a problem hiding this comment.
🟡 Changes recommended
The new CI release-metadata check sets docutils warning_stream to an invalid value (False), which can cause unexpected workflow failures.
Get a fresh assessment by requesting another Copilot review.
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
.github/workflows/ci.yml:149
- In the docutils call,
warning_streamis set toFalse, but docutils expects a file-like object (with.write()). If docutils ever emits a system message despitereport_level, this can raiseAttributeErrorand fail the CI job for the wrong reason. Prefer omittingwarning_streamor using a real sink (e.g. io.StringIO()).
- Files reviewed: 6/6 changed files
- Comments generated: 1
- Review effort level: Lite
|
|
||
| | Prompt | Answer | | ||
| | --- | --- | | ||
| | Release repository url | `https://github.com/benaliabderrahmane/rmw_unix_socket_cpp-release.git` | |
bloom reads CHANGELOG.rst from next to package.xml and nowhere else, so the
root CHANGELOG.md was invisible to catkin_generate_changelog and the release
would have shipped an empty debian changelog. Move it into the package and
convert it to rst.
Two rst constraints shaped the conversion. REP-132 allows only paragraphs and
lists under a version heading and catkin_pkg drops sub-sections silently, so
the per-release Added/Changed/Fixed headings are bold paragraphs, not rst
sub-sections; written as sub-sections, 0.4.0 and 0.4.1 parsed to an empty body.
rst also has no nested inline markup, so ``code`` inside **bold** rendered the
backticks literally.
Also:
- package.xml gains repository/bugtracker/website <url> tags, which ROS Index
renders and rosdistro reviewers look for.
- release.yml builds lyrical, matching ci.yml and the set of distros we intend
to open bloom tracks for. Humble is excluded deliberately: serialization.cpp
uses fastcdr's CdrVersion::DDS_CDR, which is Fast CDR 2.x and absent from the
1.0.x Humble ships.
- RELEASING.md records the bloom track answers, notably the v:{version} release
tag our v-prefixed tags need and the per-release command sequence.
- A release-metadata CI job re-checks all of the above, because a changelog
that parses to an empty body fails silently rather than loudly.
No source files are touched; this is release metadata only.
The release-metadata job re-parses CHANGELOG.rst the way catkin_pkg does and fails on a dropped sub-section instead of shipping an empty debian changelog, and checks the version/tag pairing; release.yml uses the v tag prefix that catkin_prepare_release --tag-prefix v produces. Squashed from: - chore(release): tighten the metadata guard and fix the release tag prefix - chore(release): reject dropped changelog sub-sections structurally
…e the release repo
- "First release" ran bloom-release straight away. With Version :{auto} that
resolves to package.xml's 0.5.0, i.e. the existing v0.5.0 tag - which
predates CHANGELOG.rst and the <url> tags this PR adds. Tag first.
- bloom's "Release repository url" prompt wants the URL of an existing
repository; it cannot create one. Rolling-derived distros additionally
require it to live in the ros2-gbp organisation.
- The token needs the workflow scope as well as public_repo.
- catkin_prepare_release bumps the patch version by default; the 0.6.0 in
the examples needs --bump minor.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NUNQNo26cKRPrVXcaHZnje
26d2600 to
a8ad796
Compare
Makes the package releasable through
bloomintoros/rosdistro, so users canapt install ros-<distro>-rmw-unix-socket-cpp. Release metadata only — nosource files are touched.
What was blocking
CHANGELOG.rstin the wrong place and the wrong format.bloomandcatkin_pkgreadCHANGELOG.rstfrom next topackage.xmland nowhere else,so the root
CHANGELOG.mdwas invisible tocatkin_generate_changelogand therelease would have shipped an empty debian changelog. Moved to
rmw_unix_socket_cpp/CHANGELOG.rstand converted — one changelog, not two todrift apart. All 64 bullets and 17 category headings carried over.
Two rst constraints shaped the conversion, both found by parsing the result
rather than by eyeballing it:
heading.
catkin_pkgdrops sub-sections silently — written withAdded/
Fixedas rst sub-sections,0.4.0and0.4.1parsed to a completelyempty body and
0.5.0kept only its two intro paragraphs. They are boldparagraphs instead.
**``rmw_wait`` timeout contract**rendered the backticks literally in 7 bold spans. docutils emits no warning
for this.
No
<url>tags. Addedrepository,bugtrackerandwebsite. ROS Indexrenders them and rosdistro reviewers look for them.
Release tag format. Our tags are
v0.5.0;catkin_prepare_releasewrites0.5.0. The bloom track needsv:{version}in its release tag field or itlooks for a tag that does not exist. Recorded in
RELEASING.md— it is askedonce, on
--new-track, and is easy to get wrong.Distro scope.
jazzy,kilted,rolling,lyrical. Not Humble:serialization.cppuseseprosima::fastcdr::CdrVersion::DDS_CDR, which isFast CDR 2.x, and Humble ships 1.0.x where the enum does not exist.
Also here
RELEASING.md— the track answers, the first-release command, and thefour-command loop for every release after it.
release.ymlnow buildslyrical, matchingci.ymland the set of distroswe intend to open tracks for.
release-metadataCI job re-checks the above on every push.Beyond the strict ask
Two things go slightly past "fix the four items" — easy to drop if you disagree:
release-metadataCI job. Not speculative: the empty-body failureabove is invisible to a human reading the file and only surfaces at bloom
time, after you have already tagged. One job, no new files.
lyricalinrelease.yml.ci.ymlalready tested it; the releaseworkflow did not build it.
Deliberately skipped: the README
apt installnote. The package does not existin the apt repo yet, so documenting it now would be wrong until the rosdistro
PR merges — worth adding then.
Verification
catkin_pkg— the parser bloom itself uses — was run against the result:Every version parses with a date and a non-empty body,
package.xmlvalidatesand its version matches the newest changelog entry, docutils reports zero system
messages and zero literal backticks leaking into rendered text, and
xmllintaccepts
package.xml. The embedded CI check was executed locally exactly as therunner will feed it to
python3.Next step (not in this PR)
Then repeat per distro.
RELEASING.mdhas the rest.