Conversation
Migrate every CI/CD Maven/artifact publish path off JFrog Artifactory (repo.dotcms.com) and onto the S3-compatible BunnyCDN storage zone. - Add .github/scripts/publish-to-s3/publish.sh (maven + file modes): uploads from ~/.m2/repository, writes .sha1/.md5 checksums, and regenerates the maven-metadata.xml files Artifactory used to create. - Add the deploy-maven-s3 composite action; deployment and release phases now `mvn install` locally and publish from the local repository. - Publish starter zips through the same script. - Remove the deploy-jfrog action. - Point the poms at https://dotcms-repo.b-cdn.net/libs-release, drop the Artifactory distributionManagement and the dead libs-snapshot repositories. - Refuse to publish shared snapshots (not consumed at dotCMS). - Update in-repo consumers (dotCLI action, SDK scaffold, docker examples) and docs. Refs #37567
|
Claude finished @wezell's task in 3m 13s —— View job PR Review — BunnyCDN S3 publishingReviewed the latest state (through New IssuesNone that are new to the latest commits. The one substantive open item is the metadata concern raised in @sfreudenthaler's Existing
Resolved
One process note (not blocking, already acknowledged in-thread): CI on this PR builds every Note: I review code and provide feedback but cannot submit formal GitHub PR approvals. |
aws s3 ls prints file entries as '<date> <time> <size> <name>', so
awk '{print $2}' picked up the timestamp column and merged times into the
version list on every publish after the first, corrupting <latest>/<release>.
Also:
- publish .sha1/.md5 for maven-metadata.xml (Artifactory parity;
checksumPolicy=fail consumers)
- give dry-runs a placeholder bucket instead of producing s3:///... URLs
- drop continue-on-error from the CLI Deploy step so a failed S3 publish is
visible (snapshots no-op before credentials are required)
Refs #37567
|
Thanks @claude[bot] — the High finding was real and is fixed in 87c60bd. 🟠 High — 🟡 Medium — metadata checksums (fixed). 🟡 Medium — dry-run with no bucket (fixed). 🟡 Medium — link-issue check — the linked tracking issue now carries a |
… <latest> - Bunny keys now override any AWS_* credentials already in the environment (the release job configures AWS creds for the Javadoc upload), and inherited session tokens are unset so Bunny accepts the request. - Compute maven-metadata <latest>/<release> from unqualified versions only. GNU sort -V ranks 26.09.14-01-java25 after 26.09.14-01, but Maven's ComparableVersion ranks the qualifier first; without this a Java-variant release would become the <latest> the dotCLI action downloads. Refs #37567
dotCMS-Machine-User
left a comment
There was a problem hiding this comment.
✅ dotbot review: all reviewer models (meta/muse-spark-1.3, deepseek/deepseek-v4.1-flash) agree — patch is correct.
approved automatically by dotbot
tools/dotcms-cli/action resolves dotcms-cli-<v>-runner.jar from the S3 repository, but that key was only guaranteed by the JReleaser Artifactory upload. Publish it from the restored maven-repo with publish.sh file so the action's S3 URL is valid independently of the JReleaser migration (#37567). Refs #37567
|
Addressed the remaining CLI Medium and a housekeeping note:
Does CI exercise the new endpoint? (No — and that's worth knowing before cutover)I pulled the full The POM |
A workflow_dispatch with dry-run=true must not write to the public repo. Keep always() so a failure of the legacy JReleaser/Artifactory upload (#37567) cannot suppress the now-authoritative S3 publish; the size check still fails fast if the runner jar is absent.
dotCMS-Machine-User
left a comment
There was a problem hiding this comment.
✅ dotbot review: all reviewer models (meta/muse-spark-1.3, deepseek/deepseek-v4.1-flash) agree — patch is correct.
approved automatically by dotbot
|
@wezell was this tested at all in dotcms/core-workflows-test repo? |
@sfreudenthaler it was not but the build of a new dotcms jar was executed in this pipeline which relied on the new infrastructure - and full builds work locally (they give checksum warnings but I am fixing that out of the scope of this pr). |
sfreudenthaler
left a comment
There was a problem hiding this comment.
apparently there’s a bug hidden cuz we copied over some cruft (eg dotcms-cli-99.12.31-98).
https://dotcms-repo.b-cdn.net/libs-release/com/dotcms/dotcms-cli/maven-metadata.xml <latest>99.12.31-98</latest> <release>26.09.14-01</release>99.12.31-98/dotcms-cli-99.12.31-98-runner.jar → HTTP 200, 39,082,293 bytes. It's a real published test artifact (negative control on a bogus version returns 302, so the 200 is meaningful).
tools/dotcms-cli/action/.github/workflows/main.yml:24 reads string(//versioning/latest). So the public dotCLI action hands users a test build today. That's inherited from Artifactory's generated metadata, which got copied into the bucket.
The PR makes it permanent: publish.sh:211 filters on -[A-Za-z], and 99.12.31-98 has no letters, so it survives. Verified:
$ printf '24.05.10\n26.09.14-01\n99.12.31-98\n' | sort -u -V | grep -v -- '-[A-Za-z]' | tail -n199.12.31-98
Next CLI publish sets to 99.12.31-98 too — currently is still correct at 26.09.14-01, so this actively makes it worse. Delete the 99.12.31-98 tree from the bucket before cutover, and consider a sanity bound in update_artifact_metadata.
There also is some concern over
libs-release-localis still a hard dependency of the CLI release job
cicd_release-cli.yml:176-189 + tools/dotcms-cli/jreleaser.yml:84-85 (a file this PR doesn't touch): upload.artifactory is active: ALWAYS with a libs-release-local RELEASE path, and the step has no continue-on-error. The if: always() on the S3 step means the jar still publishes, but the job goes red the day Artifactory is switched off — which is the point of #37567. The native zips are fine (they also go to a GitHub Release via jreleaser.yml:26-30). Needs a tracking issue, and probably continue-on-error: true in the interim.
cicd_manual_publish-starter.yml uses 'publish.sh file', which only uploaded the zip, so every starter published after the migration would have repeated the missing-checksum hole. Write .sha1/.md5 beside the key, matching maven mode, with --no-checksums to opt out. Refs #37567
Reviewer nit: the old name reads as AWS S3. Make the Bunny target explicit in the action directory and display name. Refs #37567
…s to S3 EE_REPO_* is gone, so jreleaser:full-release would fail on the Artifactory upload. Remove upload.artifactory from jreleaser.yml (JReleaser now only creates the GitHub release) and publish the runner jar + native zips to the S3 repository via publish.sh file, at the same com/dotcms/dotcms-cli/<v>/ path. Refs #37567
We no longer upload via JReleaser (S3 handles it) and there is no Artifactory uploader, so run the release goal to create/update the GitHub release only. Refs #37567
The deployment-phase CLI Deploy step is fatal now, but 'maven --modules dotcms-cli' only warned and returned 0 when the directory was missing, so a release could report success while publishing nothing. If --modules was given and none match, error out; the no-modules case still warns and exits 0. Also fix a stale repo.dotcms.com reference in WORKFLOW_ARCHITECTURE.md. Refs #37567
dotCMS-Machine-User
left a comment
There was a problem hiding this comment.
✅ dotbot review: all reviewer models (meta/muse-spark-1.3, deepseek/deepseek-v4.1-flash) agree — patch is correct.
approved automatically by dotbot
update_artifact_metadata swallowed aws s3 ls errors, so a transient listing failure after a successful artifact publish would rebuild maven-metadata.xml from an empty version list and overwrite the existing file with a single version, silently dropping every prior <version> and resetting <latest>/<release>. Capture the ls status and leave the last-good metadata in place on failure. Also fix the remaining repo.dotcms.com reference in WORKFLOW_ARCHITECTURE.md. Refs #37567
|
Both fixed in
On the |
|
dotbot code review:
Incremental change hardens metadata regeneration against failed S3 listings and fixes a stale doc URL; no new defects introduced. Tip: comment with "/dotbot address comments" to attempt automated fixes for unresolved review threads. reviewed by dotbot · meta/muse-spark-1.3 · medium |
|
dotbot code review:
The incremental commit makes update_artifact_metadata fail-safe: if Tip: comment with "/dotbot address comments" to attempt automated fixes for unresolved review threads. reviewed by dotbot · deepseek/deepseek-v4.1-flash · medium |
dotCMS-Machine-User
left a comment
There was a problem hiding this comment.
✅ dotbot review: all reviewer models (meta/muse-spark-1.3, deepseek/deepseek-v4.1-flash) agree — patch is correct.
approved automatically by dotbot
sfreudenthaler
left a comment
There was a problem hiding this comment.
Let's see it in action and adjust as needed.
Excited for this
Summary
Replaces JFrog Artifactory (
repo.dotcms.com) with the S3-compatible BunnyCDN storage zone for all Maven/artifact publishing, so this PR can be exercised against the new repository before DNS/cutover.https://ny-s3.storage.bunnycdn.com(regionny)https://dotcms-repo.b-cdn.net/libs-release/...MAVEN_BUNNY_RW_USERNAME(storage-zone name = S3 access key id),MAVEN_BUNNY_RW_PASSWORDRefs #37567 (tracking issue — intentionally not
Closes, there is remaining work).How publishing works now
mvn installinstead ofmvn deploy)..github/scripts/publish-to-s3/publish.sh maven --version <v>walks~/.m2/repository/com/dotcms/*/<v>/, uploads each subtree tos3://$BUCKET/$PREFIX/com/dotcms/<artifactId>/<version>/(key prefixes are created implicitly), writes.sha1/.md5checksums, and regeneratesmaven-metadata.xml(Artifactory used to; the dotCLI action reads it).filemode uploads single artifacts (starter zips):.../com/dotcms/starter/<date>/starter-<date>.zip.Changes
.github/scripts/publish-to-s3/publish.sh(+ README),deploy-maven-s3composite action (+ README).cicd_comp_release-phase.yml(mvn deploy→mvn install+ S3 publish; removed Artifactory Maven settings),cicd_comp_deployment-phase.yml(deploy-jfrog→deploy-maven-s3, restricted todotcms-cli),cicd_manual_publish-starter.yml,legacy-release_maven-release-process.yml, and callers (cicd_3/4/6/7/8). SecretsEE_REPO_*→MAVEN_BUNNY_RW_*.deploy-jfrogaction.pom.xml/parent/pom.xmldownload repositories →https://dotcms-repo.b-cdn.net/libs-release; dropped ArtifactorydistributionManagementand the deadlibs-snapshotrepository/pluginRepository entries.publish.shrefuses-SNAPSHOTby default (not consumed at dotCMS, and it would makemaven-metadata.xml<latest>a snapshot).docker-compose.yml, docker examples, onboarding docs.Configuration
Org secrets:
MAVEN_BUNNY_RW_USERNAME,MAVEN_BUNNY_RW_PASSWORD.Optional repo variables (defaults in the script):
MAVEN_S3_BUCKET(defaults to the username),MAVEN_S3_PREFIX(libs-release),MAVEN_S3_ENDPOINT,MAVEN_S3_REGION,MAVEN_S3_PUBLIC_URL.Testing
awsCLI: upload targets/exclusions, checksum staging contents,maven-metadata.xmlgeneration with semantic version sort, dry-run,filemode +$GITHUB_OUTPUT, missing-module warnings, snapshot refusal, credential export, temp-dir cleanup.Notes / follow-ups
/libs-releasesbut every example URL uses/libs-release; default islibs-release(override withMAVEN_S3_PREFIX). Bucket defaults to the storage-zone name (Bunny convention).tools/dotcms-cli/jreleaser.yml,cicd_release-cli.yml) still uploads the CLI runner jar/native binaries to Artifactory — tracked in Decommission Artifactory and complete Maven artifact migration to BunnyCDN S3 #37567.