Prepare the 0.1.0 release and API compatibility gate - #43
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughThe PR prepares the 0.1.0 release by defining API compatibility enforcement, aligning Maven modules to the release version, adding Central bundle tooling and signed publication automation, and updating release documentation, notes, and consumer smoke tests. ChangesAPI Compatibility and Release Governance
Release Artifact Alignment and Publishing Infrastructure
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant ReleaseOperator
participant PublishJob
participant LocalBundle
participant MavenCentral
participant FinalizeJob
participant GitHubRelease
ReleaseOperator->>PublishJob: dispatch workflow with version=0.1.0
PublishJob->>PublishJob: validate inputs, changelog, Revapi allowlist
PublishJob->>PublishJob: verify signing capability (create/verify/delete tag)
PublishJob->>LocalBundle: build and verify Central bundle
PublishJob->>LocalBundle: run isolated consumer smoke test
PublishJob->>MavenCentral: check for existing artifacts (HEAD *.pom)
PublishJob->>MavenCentral: deploy with autoPublish=true, waitUntil=published
PublishJob->>MavenCentral: poll for published POMs (retry loop)
PublishJob->>LocalBundle: final consumer test against Maven Central
FinalizeJob->>GitHubRelease: create or verify signed annotated tag
FinalizeJob->>GitHubRelease: create or verify GitHub Release with notes
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
.github/workflows/release.yml (1)
135-156: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winAdd a timeout to the Central-resolution
curlprobe.
curl --fail --silent --show-error --headhas no--max-time/--connect-timeout; a hung connection could stall well past the intended ~10-minute retry budget instead of failing fast into the next attempt.⏱️ Proposed fix
- if ! curl --fail --silent --show-error --head "${pom_url}" >/dev/null; then + if ! curl --fail --silent --show-error --max-time 15 --head "${pom_url}" >/dev/null; then🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/release.yml around lines 135 - 156, Add a per-request timeout to the Maven Central probe in the release workflow’s “Wait for Maven Central resolution” loop by configuring curl with an appropriate --max-time and/or --connect-timeout. Keep the existing retry and failure behavior unchanged so hung requests fail quickly and allow the approximately 10-minute retry budget to proceed.scripts/build-central-bundle.sh (1)
76-79: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winZip is not truncated before writing.
zip -rmerges into an existing archive rather than replacing it. If${output}already exists from a stale/prior invocation, the bundle can end up with leftover entries. Add arm -f "${output}"before the zip step for a clean, reproducible bundle.🧹 Proposed fix
+rm -f "${output}" ( cd "${staging}" zip -q -r "${output}" dev )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/build-central-bundle.sh` around lines 76 - 79, Remove any existing output archive before creating the bundle: in the staging/zip block, add rm -f "${output}" immediately before the zip invocation so scripts/build-central-bundle.sh always produces a clean archive without stale entries.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/release.yml:
- Around line 130-134: Update the “Publish to Maven Central” workflow step to
probe Maven Central for the current version before running the auto-publishing
deploy, reusing the existing curl-based resolution check from the later wait
loop. If the artifacts are already resolvable, skip deploy and continue to the
wait/finalize stage; otherwise preserve the existing deploy command.
---
Nitpick comments:
In @.github/workflows/release.yml:
- Around line 135-156: Add a per-request timeout to the Maven Central probe in
the release workflow’s “Wait for Maven Central resolution” loop by configuring
curl with an appropriate --max-time and/or --connect-timeout. Keep the existing
retry and failure behavior unchanged so hung requests fail quickly and allow the
approximately 10-minute retry budget to proceed.
In `@scripts/build-central-bundle.sh`:
- Around line 76-79: Remove any existing output archive before creating the
bundle: in the staging/zip block, add rm -f "${output}" immediately before the
zip invocation so scripts/build-central-bundle.sh always produces a clean
archive without stale entries.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 1f20ab7c-5ef4-4c94-b3cc-2d173b06d17d
📒 Files selected for processing (70)
.github/release-notes/0.1.0.md.github/workflows/release.ymlCHANGELOG.mdCONTRIBUTING.mdREADME.mdconfig/release-smoke/pom.xmlconfig/release-smoke/src/test/java/dev/juherr/datex4j/release/PublishedConsumerTest.javaconfig/release/public-artifacts.txtconfig/revapi/accepted-differences.jsonconfig/revapi/revapi.jsondatex4j-bom/pom.xmldatex4j-builders/pom.xmldatex4j-consumer-tests/pom.xmldatex4j-core/pom.xmldatex4j-domain-evcharging/pom.xmldatex4j-domain-parking/pom.xmldatex4j-domain-srti/pom.xmldatex4j-domain-traffic/pom.xmldatex4j-domain-uvar/pom.xmldatex4j-integration-tests/pom.xmldatex4j-json/pom.xmldatex4j-json/src/main/java/dev/juherr/datex4j/json/internal/DatexEnumJson.javadatex4j-json/src/main/java/dev/juherr/datex4j/json/internal/DatexPrefixes.javadatex4j-json/src/main/java/dev/juherr/datex4j/json/internal/GAttributes.javadatex4j-json/src/main/java/dev/juherr/datex4j/json/internal/MultilingualStringJson.javadatex4j-json/src/main/java/dev/juherr/datex4j/json/internal/SubstitutionJson.javadatex4j-location/pom.xmldatex4j-model-spi/pom.xmldatex4j-model-v2_0/pom.xmldatex4j-model-v2_0/src/main/java/dev/juherr/datex4j/model/v2_0/spi/package-info.javadatex4j-model-v2_1/pom.xmldatex4j-model-v2_1/src/main/java/dev/juherr/datex4j/model/v2_1/spi/package-info.javadatex4j-model-v2_2/pom.xmldatex4j-model-v2_2/src/main/java/dev/juherr/datex4j/model/v2_2/spi/package-info.javadatex4j-model-v2_3/pom.xmldatex4j-model-v2_3/src/main/java/dev/juherr/datex4j/model/v2_3/spi/package-info.javadatex4j-model-v3_0/pom.xmldatex4j-model-v3_0/src/main/java/dev/juherr/datex4j/model/v3_0/spi/package-info.javadatex4j-model-v3_1/pom.xmldatex4j-model-v3_1/src/main/java/dev/juherr/datex4j/model/v3_1/spi/package-info.javadatex4j-model-v3_2/pom.xmldatex4j-model-v3_2/src/main/java/dev/juherr/datex4j/model/v3_2/spi/package-info.javadatex4j-model-v3_3/pom.xmldatex4j-model-v3_3/src/main/java/dev/juherr/datex4j/model/v3_3/spi/package-info.javadatex4j-model-v3_4/pom.xmldatex4j-model-v3_4/src/main/java/dev/juherr/datex4j/model/v3_4/spi/package-info.javadatex4j-model-v3_5/pom.xmldatex4j-model-v3_5/src/main/java/dev/juherr/datex4j/model/v3_5/spi/package-info.javadatex4j-model-v3_6/pom.xmldatex4j-model-v3_6/src/main/java/dev/juherr/datex4j/model/v3_6/spi/package-info.javadatex4j-model-v3_7/pom.xmldatex4j-model-v3_7/src/main/java/dev/juherr/datex4j/model/v3_7/spi/package-info.javadatex4j-model/pom.xmldatex4j-model/src/main/java/dev/juherr/datex4j/model/AggregateMarker.javadatex4j-model/src/main/java/dev/juherr/datex4j/model/package-info.javadatex4j-ocpi/pom.xmldatex4j-ocpi/src/main/java/dev/juherr/datex4j/ocpi/mapping/internal/package-info.javadatex4j-ocpi/src/main/java/dev/juherr/datex4j/ocpi/support/package-info.javadatex4j-validation/pom.xmldatex4j-xml/pom.xmldatex4j-xml/src/main/java/dev/juherr/datex4j/xml/SecureXmlSource.javadocs/README.mddocs/api-compatibility.mdexamples/pom.xmlpom.xmlscripts/build-central-bundle.shscripts/git-gpg-wrapper.shscripts/verify-central-bundle.shscripts/verify-revapi-allowlist.shscripts/verify.sh
Prepare the 0.1.0 release and API compatibility gate
Summary
0.1.0releaseRelease behavior
The manually dispatched workflow only runs from
mainand uses the protectedmaven-centralenvironment. It validates the requested version, changelog, signing key, release bundle, artifact
inventory, and an isolated Maven consumer before publishing with
autoPublish=true. After MavenCentral reports the deployment as published and all public GAVs resolve, a separate job creates or
verifies the signed tag and GitHub Release.
The workflow is intentionally safe to resume: an existing tag or release is accepted only when it
matches the published commit.
API compatibility
Revapi compares every module with the latest final release and tolerates the missing baseline only
before
0.1.0exists. Internal packages, generated provider implementations, OCPI support code, andSecureXmlSourceare excluded from the compatibility commitment. Compatibility exceptions requirean exact difference, a
Migration:justification, and the same migration inCHANGELOG.md.Validation
./scripts/verify.sh./mvnw revapi:validate-configuration./mvnw -Prelease -Dgpg.skip=true -DskipTests packageJavadocs, signatures, and MD5/SHA-1/SHA-256/SHA-512 checksums
actionlint,zizmor,mdbook-lint, and offline Lychee checksexplicitly justified exception is accepted
Follow-up
This PR tracks #12 and #14 but must not close them yet. After merge, run the release workflow from
main, verify Maven Central, the signed tag, and the GitHub Release, then open the separate0.2.0-SNAPSHOTpost-release PR with an emptyUnreleasedsection.Summary by CodeRabbit
New Features
Documentation
Release Process