Skip to content

feat: add binary release workflows and simplify README downloads section.#378

Merged
msajidmansoori12 merged 6 commits into
migtools:mainfrom
msajidmansoori12:multiplatform-ci-release
May 20, 2026
Merged

feat: add binary release workflows and simplify README downloads section.#378
msajidmansoori12 merged 6 commits into
migtools:mainfrom
msajidmansoori12:multiplatform-ci-release

Conversation

@msajidmansoori12

@msajidmansoori12 msajidmansoori12 commented May 14, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added automated CI to build crane binaries for Linux, macOS, and Windows across architectures, produce per-binary SHA-256 checksums, and publish a draft release with all binaries and aggregated checksums.
  • Documentation
    • Added a Download section with stable/main/nightly links and checksum verification commands; Install now directs users to the Download page for prebuilt binaries.

Review Change Stack

Creating a Draft Release with build-release-binaries.yml

This workflow automatically creates a draft GitHub release when triggered by a tag push.

Trigger behavior

  • push to main -> builds binaries and uploads workflow artifacts (no GitHub Release)
  • schedule -> builds binaries and uploads workflow artifacts (no GitHub Release)
  • workflow_dispatch -> builds binaries and uploads workflow artifacts (no GitHub Release)
  • push tag -> builds binaries, then creates a draft release with attached assets

Release draft process

  1. Ensure changes are merged and you are on the commit you want to release.
  2. Create and push a tag:
git tag v0.0.x
git push origin v0.0.x
  1. Wait for the Build Crane Binaries workflow run for that tag to complete.
  2. The workflow will:
    • build matrix binaries (linux/darwin/windows targets in workflow),
    • collect artifacts into release-assets/,
    • generate a combined checksums.txt,
    • create a draft GitHub release for the tag.
  3. Open the repository Releases page and review the draft before publishing.

Expected draft assets

  • crane_* binaries
  • checksums.txt (combined checksum manifest)

Notes

  • Draft release creation is tag-only (if: startsWith(github.ref, 'refs/tags/')).
  • The workflow uses softprops/action-gh-release with draft: true, so no release is published automatically.

Sample draft release

Signed-off-by: M Sajid Mansoori <mmansoor@redhat.com>
@msajidmansoori12 msajidmansoori12 self-assigned this May 14, 2026
@coderabbitai

coderabbitai Bot commented May 14, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@msajidmansoori12 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 19 minutes and 51 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 65bfbaad-00a7-43ec-a865-7fef8f31b31d

📥 Commits

Reviewing files that changed from the base of the PR and between 2e01943 and cf29627.

📒 Files selected for processing (2)
  • .github/workflows/build-release-binaries.yml
  • README.md
📝 Walkthrough

Walkthrough

Adds a GitHub Actions workflow that builds crane for five OS/arch targets with CGO disabled, uploads per-target artifacts and per-binary .sha256 files, and on tag refs aggregates checksums and publishes a draft release. README gains a Download section and updated install instructions.

Changes

Multi-Platform Binary Build and Release Workflow

Layer / File(s) Summary
Build job: compile and upload artifacts
.github/workflows/build-crane-binaries.yml
Builds crane with Go 1.25 and CGO_ENABLED=0 for linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64; outputs dist/crane_${GOOS}_${GOARCH}(.exe) and per-binary *.sha256; uploads each target as artifact crane-${goos}-${goarch}.
Release job: aggregate checksums and publish
.github/workflows/build-crane-binaries.yml
Tag-only job downloads all crane-* artifacts into release-assets, creates combined checksums.txt from non-*.sha256 binaries, removes individual .sha256 files, and publishes a draft GitHub release with binaries and the aggregated checksum file.
Docs: add Download section and update Install
README.md
Adds a Download section with stable/main/nightly artifact links and SHA-256 verification commands; updates Install to reference downloading the prebuilt binary from the new Download section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

Possibly related PRs

  • migtools/crane#220: Related CI work that builds and uploads crane artifacts with a different artifact scheme.

Suggested reviewers

  • istein1
  • aufi
  • midays

Poem

🐰 I hopped through YAML under moonlight bright,
Building crane binaries for every site,
Checksums clutched close, artifacts in a row,
Draft release awaiting the tagged-lit glow—hooray, let it flow! 🥕

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title accurately describes the main changes: adding binary release workflows and updating the README downloads section.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented May 14, 2026

Copy link
Copy Markdown

Test Coverage Report

Total: 39.8%

Per-package coverage

  • github.com/konveyor/crane — 0.0%
  • github.com/konveyor/crane/cmd/apply — 33.3%
  • github.com/konveyor/crane/cmd/convert — 0.0%
  • github.com/konveyor/crane/cmd/export — 93.1%
  • github.com/konveyor/crane/cmd/plugin-manager — 0.0%
  • github.com/konveyor/crane/cmd/plugin-manager/add — 0.0%
  • github.com/konveyor/crane/cmd/plugin-manager/list — 0.0%
  • github.com/konveyor/crane/cmd/plugin-manager/remove — 0.0%
  • github.com/konveyor/crane/cmd/runfn — 0.0%
  • github.com/konveyor/crane/cmd/skopeo-sync-gen — 0.0%
  • github.com/konveyor/crane/cmd/transfer-pvc — 9.2%
  • github.com/konveyor/crane/cmd/transform — 0.0%
  • github.com/konveyor/crane/cmd/transform/listplugins — 0.0%
  • github.com/konveyor/crane/cmd/transform/optionals — 0.0%
  • github.com/konveyor/crane/cmd/tunnel-api — 0.0%
  • github.com/konveyor/crane/cmd/validate — 36.1%
  • github.com/konveyor/crane/cmd/version — 0.0%
  • github.com/konveyor/crane/internal/apply — 26.1%
  • github.com/konveyor/crane/internal/file — 68.6%
  • github.com/konveyor/crane/internal/flags — 0.0%
  • github.com/konveyor/crane/internal/plugin — 32.9%
  • github.com/konveyor/crane/internal/transform — 78.1%
  • github.com/konveyor/crane/internal/validate — 58.2%
Full function-level details
github.com/konveyor/crane/cmd/apply/apply.go:36:			Complete					100.0%
github.com/konveyor/crane/cmd/apply/apply.go:40:			Validate					100.0%
github.com/konveyor/crane/cmd/apply/apply.go:50:			Run						0.0%
github.com/konveyor/crane/cmd/apply/apply.go:54:			NewApplyCommand					0.0%
github.com/konveyor/crane/cmd/apply/apply.go:86:			addFlagsForOptions				0.0%
github.com/konveyor/crane/cmd/apply/apply.go:97:			run						0.0%
github.com/konveyor/crane/cmd/convert/convert.go:30:			NewConvertOptions				0.0%
github.com/konveyor/crane/cmd/convert/convert.go:63:			addFlagsForConvertOptions			0.0%
github.com/konveyor/crane/cmd/convert/convert.go:74:			Complete					0.0%
github.com/konveyor/crane/cmd/convert/convert.go:83:			Run						0.0%
github.com/konveyor/crane/cmd/convert/convert.go:87:			run						0.0%
github.com/konveyor/crane/cmd/convert/convert.go:112:			getClientFromContext				0.0%
github.com/konveyor/crane/cmd/convert/convert.go:134:			getRestConfigFromContext			0.0%
github.com/konveyor/crane/cmd/export/cluster.go:29:			NewClusterScopeHandler				100.0%
github.com/konveyor/crane/cmd/export/cluster.go:35:			isClusterScopedResource				100.0%
github.com/konveyor/crane/cmd/export/cluster.go:44:			filterRbacResources				100.0%
github.com/konveyor/crane/cmd/export/cluster.go:102:			NewClusterScopedRbacHandler			100.0%
github.com/konveyor/crane/cmd/export/cluster.go:113:			exportedSANamespaces				100.0%
github.com/konveyor/crane/cmd/export/cluster.go:126:			groupMatchesExportedSANamespaces		100.0%
github.com/konveyor/crane/cmd/export/cluster.go:143:			parseServiceAccountUserSubject			100.0%
github.com/konveyor/crane/cmd/export/cluster.go:154:			prepareForFiltering				100.0%
github.com/konveyor/crane/cmd/export/cluster.go:187:			filteredResourcesOfKind				100.0%
github.com/konveyor/crane/cmd/export/cluster.go:213:			accept						100.0%
github.com/konveyor/crane/cmd/export/cluster.go:223:			acceptClusterRoleBinding			100.0%
github.com/konveyor/crane/cmd/export/cluster.go:260:			acceptClusterRole				100.0%
github.com/konveyor/crane/cmd/export/cluster.go:284:			acceptSecurityContextConstraints		100.0%
github.com/konveyor/crane/cmd/export/cluster.go:336:			anyServiceAccountInNamespace			100.0%
github.com/konveyor/crane/cmd/export/crd.go:17:				normalizeGroupSet				85.7%
github.com/konveyor/crane/cmd/export/crd.go:29:				shouldSkipCRDGroup				100.0%
github.com/konveyor/crane/cmd/export/crd.go:50:				crdFailureAPIResourceName			100.0%
github.com/konveyor/crane/cmd/export/crd.go:56:				getOperatorManager				92.9%
github.com/konveyor/crane/cmd/export/crd.go:88:				collectRelatedCRDs				90.6%
github.com/konveyor/crane/cmd/export/discover.go:39:			hasClusterScopedManifests			100.0%
github.com/konveyor/crane/cmd/export/discover.go:57:			prepareClusterResourceDir			100.0%
github.com/konveyor/crane/cmd/export/discover.go:73:			prepareFailuresDir				100.0%
github.com/konveyor/crane/cmd/export/discover.go:85:			writeResources					85.7%
github.com/konveyor/crane/cmd/export/discover.go:133:			writeErrors					83.3%
github.com/konveyor/crane/cmd/export/discover.go:174:			getFilePath					100.0%
github.com/konveyor/crane/cmd/export/discover.go:185:			discoverPreferredResources			100.0%
github.com/konveyor/crane/cmd/export/discover.go:214:			resourceToExtract				100.0%
github.com/konveyor/crane/cmd/export/discover.go:283:			isAdmittedResource				100.0%
github.com/konveyor/crane/cmd/export/discover.go:292:			getObjects					100.0%
github.com/konveyor/crane/cmd/export/discover.go:326:			iterateItemsByGet				93.8%
github.com/konveyor/crane/cmd/export/discover.go:352:			iterateItemsInList				92.3%
github.com/konveyor/crane/cmd/export/export.go:52:			Complete					90.0%
github.com/konveyor/crane/cmd/export/export.go:91:			Validate					100.0%
github.com/konveyor/crane/cmd/export/export.go:106:			validateExportNamespace				87.5%
github.com/konveyor/crane/cmd/export/export.go:122:			Run						0.0%
github.com/konveyor/crane/cmd/export/export.go:225:			NewExportCommand				50.0%
github.com/konveyor/crane/cmd/plugin-manager/add/add.go:42:		Complete					0.0%
github.com/konveyor/crane/cmd/plugin-manager/add/add.go:47:		Validate					0.0%
github.com/konveyor/crane/cmd/plugin-manager/add/add.go:90:		Run						0.0%
github.com/konveyor/crane/cmd/plugin-manager/add/add.go:94:		NewAddCommand					0.0%
github.com/konveyor/crane/cmd/plugin-manager/add/add.go:126:		addFlagsForOptions				0.0%
github.com/konveyor/crane/cmd/plugin-manager/add/add.go:131:		run						0.0%
github.com/konveyor/crane/cmd/plugin-manager/add/add.go:195:		downloadBinary					0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:46:		Complete					0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:51:		Validate					0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:56:		Run						0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:60:		NewListCommand					0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:90:		addFlagsForOptions				0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:98:		run						0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:167:		printInstalledInformation			0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:177:		groupInformationForPlugins			0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:196:		printInformation				0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:208:		printParamsInformation				0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:222:		getOptionalFields				0.0%
github.com/konveyor/crane/cmd/plugin-manager/list/list.go:247:		printTable					0.0%
github.com/konveyor/crane/cmd/plugin-manager/plugin-manager.go:33:	Complete					0.0%
github.com/konveyor/crane/cmd/plugin-manager/plugin-manager.go:38:	Validate					0.0%
github.com/konveyor/crane/cmd/plugin-manager/plugin-manager.go:43:	Run						0.0%
github.com/konveyor/crane/cmd/plugin-manager/plugin-manager.go:47:	NewPluginManagerCommand				0.0%
github.com/konveyor/crane/cmd/plugin-manager/plugin-manager.go:78:	addFlagsForOptions				0.0%
github.com/konveyor/crane/cmd/plugin-manager/plugin-manager.go:86:	run						0.0%
github.com/konveyor/crane/cmd/plugin-manager/remove/remove.go:33:	Complete					0.0%
github.com/konveyor/crane/cmd/plugin-manager/remove/remove.go:38:	Validate					0.0%
github.com/konveyor/crane/cmd/plugin-manager/remove/remove.go:43:	Run						0.0%
github.com/konveyor/crane/cmd/plugin-manager/remove/remove.go:47:	NewRemoveCommand				0.0%
github.com/konveyor/crane/cmd/plugin-manager/remove/remove.go:77:	run						0.0%
github.com/konveyor/crane/cmd/runfn/runfn.go:33:			NewFnRunCommand					0.0%
github.com/konveyor/crane/cmd/runfn/runfn.go:49:			addFlagsForOptions				0.0%
github.com/konveyor/crane/cmd/runfn/runfn.go:59:			runE						0.0%
github.com/konveyor/crane/cmd/runfn/runfn.go:70:			preRunE						0.0%
github.com/konveyor/crane/cmd/runfn/runfn.go:112:			getFunctionImage				0.0%
github.com/konveyor/crane/cmd/runfn/runfn.go:124:			getContainerFunctions				0.0%
github.com/konveyor/crane/cmd/runfn/runfn.go:151:			getFunctionAnnotation				0.0%
github.com/konveyor/crane/cmd/runfn/runfn.go:170:			getFunctionConfig				0.0%
github.com/konveyor/crane/cmd/runfn/util.go:14:				WriteOutput					0.0%
github.com/konveyor/crane/cmd/runfn/util.go:31:				GetDestinationDir				0.0%
github.com/konveyor/crane/cmd/runfn/util.go:58:				ValidateFunctionImageURL			0.0%
github.com/konveyor/crane/cmd/runfn/util.go:80:				checkIfDirExists				0.0%
github.com/konveyor/crane/cmd/skopeo-sync-gen/skopeo-sync-gen.go:61:	Complete					0.0%
github.com/konveyor/crane/cmd/skopeo-sync-gen/skopeo-sync-gen.go:65:	Validate					0.0%
github.com/konveyor/crane/cmd/skopeo-sync-gen/skopeo-sync-gen.go:69:	NewSkopeoSyncGenCommand				0.0%
github.com/konveyor/crane/cmd/skopeo-sync-gen/skopeo-sync-gen.go:103:	shouldAddImageStream				0.0%
github.com/konveyor/crane/cmd/skopeo-sync-gen/skopeo-sync-gen.go:114:	Run						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:37:		NewRsyncLogStream				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:50:		Init						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:138:		writeProgressToFile				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:148:		Close						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:154:		Streams						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:190:		addDataSize					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:215:		String						100.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:219:		MarshalJSON					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:223:		AsString					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:271:		NewProgress					100.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:291:		Completed					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:296:		Status						38.5%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:321:		Merge						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:376:		newDataSize					72.7%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:399:		parseRsyncLogs					76.1%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:479:		waitForPodRunning				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/progress.go:513:		getFinalPodStatus				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:89:		Validate					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:117:		Validate					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:133:		NewTransferPVCCommand				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:169:		addFlagsToTransferPVCCommand			0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:189:		Complete					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:220:		Validate					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:246:		Run						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:250:		getClientFromContext				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:271:		getRestConfigFromContext			0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:278:		run						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:485:		getValidatedResourceName			0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:495:		getNodeNameForPVC				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:515:		getIDsForNamespace				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:541:		getRsyncClientPodSecurityContext		0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:553:		getRsyncServerPodSecurityContext		0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:565:		garbageCollect					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:602:		deleteResourcesIteratively			0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:628:		deleteResourcesForGVK				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:649:		followClientLogs				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:678:		waitForEndpoint					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:690:		createEndpoint					0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:735:		getRouteHostName				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:752:		buildDestinationPVC				0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:773:		ApplyTo						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:793:		ApplyTo						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:805:		ApplyTo						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:821:		String						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:825:		Set						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:835:		Type						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:841:		parseSourceDestinationMapping			100.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:863:		String						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:867:		Set						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:876:		Type						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:880:		String						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:884:		Set						0.0%
github.com/konveyor/crane/cmd/transfer-pvc/transfer-pvc.go:894:		Type						0.0%
github.com/konveyor/crane/cmd/transform/listplugins/listplugins.go:31:	Complete					0.0%
github.com/konveyor/crane/cmd/transform/listplugins/listplugins.go:36:	Validate					0.0%
github.com/konveyor/crane/cmd/transform/listplugins/listplugins.go:41:	Run						0.0%
github.com/konveyor/crane/cmd/transform/listplugins/listplugins.go:45:	NewListPluginsCommand				0.0%
github.com/konveyor/crane/cmd/transform/listplugins/listplugins.go:77:	run						0.0%
github.com/konveyor/crane/cmd/transform/optionals/optionals.go:31:	Complete					0.0%
github.com/konveyor/crane/cmd/transform/optionals/optionals.go:36:	Validate					0.0%
github.com/konveyor/crane/cmd/transform/optionals/optionals.go:41:	Run						0.0%
github.com/konveyor/crane/cmd/transform/optionals/optionals.go:45:	NewOptionalsCommand				0.0%
github.com/konveyor/crane/cmd/transform/optionals/optionals.go:77:	run						0.0%
github.com/konveyor/crane/cmd/transform/transform.go:46:		Complete					0.0%
github.com/konveyor/crane/cmd/transform/transform.go:50:		Validate					0.0%
github.com/konveyor/crane/cmd/transform/transform.go:55:		Run						0.0%
github.com/konveyor/crane/cmd/transform/transform.go:59:		NewTransformCommand				0.0%
github.com/konveyor/crane/cmd/transform/transform.go:93:		addFlagsForOptions				0.0%
github.com/konveyor/crane/cmd/transform/transform.go:111:		run						0.0%
github.com/konveyor/crane/cmd/transform/transform.go:230:		optionalFlagsToLower				0.0%
github.com/konveyor/crane/cmd/transform/transform.go:239:		runStageWithCleanup				0.0%
github.com/konveyor/crane/cmd/transform/transform.go:252:		ensurePreviousStagesRun				0.0%
github.com/konveyor/crane/cmd/transform/transform.go:269:		ensureStagesHaveOutput				0.0%
github.com/konveyor/crane/cmd/tunnel-api/tunnel-api.go:35:		NewTunnelAPIOptions				0.0%
github.com/konveyor/crane/cmd/tunnel-api/tunnel-api.go:65:		addFlagsForTunnelAPIOptions			0.0%
github.com/konveyor/crane/cmd/tunnel-api/tunnel-api.go:77:		Complete					0.0%
github.com/konveyor/crane/cmd/tunnel-api/tunnel-api.go:100:		Validate					0.0%
github.com/konveyor/crane/cmd/tunnel-api/tunnel-api.go:116:		Run						0.0%
github.com/konveyor/crane/cmd/tunnel-api/tunnel-api.go:120:		getClientFromContext				0.0%
github.com/konveyor/crane/cmd/tunnel-api/tunnel-api.go:129:		getRestConfigFromContext			0.0%
github.com/konveyor/crane/cmd/tunnel-api/tunnel-api.go:136:		run						0.0%
github.com/konveyor/crane/cmd/validate/validate.go:32:			Complete					0.0%
github.com/konveyor/crane/cmd/validate/validate.go:44:			Validate					100.0%
github.com/konveyor/crane/cmd/validate/validate.go:73:			Run						0.0%
github.com/konveyor/crane/cmd/validate/validate.go:149:			NewValidateCommand				44.4%
github.com/konveyor/crane/cmd/version/version.go:20:			Complete					0.0%
github.com/konveyor/crane/cmd/version/version.go:25:			Validate					0.0%
github.com/konveyor/crane/cmd/version/version.go:30:			Run						0.0%
github.com/konveyor/crane/cmd/version/version.go:34:			NewVersionCommand				0.0%
github.com/konveyor/crane/cmd/version/version.go:60:			run						0.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:20:			CreateTempDir					100.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:27:			ListFilesRecursively				91.7%
github.com/konveyor/crane/e2e-tests/utils/utils.go:50:			ListFilesRecursivelyAsList			80.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:74:			HasFilesRecursively				80.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:85:			ReadTestdataFile				88.9%
github.com/konveyor/crane/e2e-tests/utils/utils.go:109:			GoldenManifestsDir				90.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:128:			CompareDirectoryFileSets			78.9%
github.com/konveyor/crane/e2e-tests/utils/utils.go:163:			CompareDirectoryYAMLSemantics			82.4%
github.com/konveyor/crane/e2e-tests/utils/utils.go:197:			CompareDirectoryYAMLSemanticsExport		89.3%
github.com/konveyor/crane/e2e-tests/utils/utils.go:249:			buildNormalizedExportIndex			81.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:289:			canonicalizeDocs				87.5%
github.com/konveyor/crane/e2e-tests/utils/utils.go:303:			extractResourceIdentity				77.8%
github.com/konveyor/crane/e2e-tests/utils/utils.go:366:			parseYAMLDocuments				100.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:385:			compareYAMLFileBytes				100.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:405:			AssertNoKindsInOutput				0.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:461:			AssertKindsInOutput				0.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:513:			LooksLikeYAMLFile				100.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:527:			normalizeUnstableFields				100.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:564:			normalizePodServiceAccountVolumeNames		90.9%
github.com/konveyor/crane/e2e-tests/utils/utils.go:623:			normalizeWithPath				92.9%
github.com/konveyor/crane/e2e-tests/utils/utils.go:653:			shouldDropField					100.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:704:			AssertWhiteoutResourceFilesExist		0.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:745:			AssertWhiteoutCommentsInKustomization		0.0%
github.com/konveyor/crane/e2e-tests/utils/utils.go:800:			AssertKindsNotInActiveKustomizeResources	0.0%
github.com/konveyor/crane/internal/apply/kustomize.go:28:		ApplySingleStage				0.0%
github.com/konveyor/crane/internal/apply/kustomize.go:69:		ApplyMultiStage					0.0%
github.com/konveyor/crane/internal/apply/kustomize.go:115:		runKustomizeBuild				0.0%
github.com/konveyor/crane/internal/apply/kustomize.go:133:		ValidateKubectlAvailable			42.9%
github.com/konveyor/crane/internal/apply/kustomize.go:151:		splitMultiDocYAMLToFiles			87.8%
github.com/konveyor/crane/internal/file/file_helper.go:23:		ReadFiles					100.0%
github.com/konveyor/crane/internal/file/file_helper.go:33:		readFiles					84.0%
github.com/konveyor/crane/internal/file/file_helper.go:84:		GetWhiteOutFilePath				100.0%
github.com/konveyor/crane/internal/file/file_helper.go:88:		GetTransformPath				100.0%
github.com/konveyor/crane/internal/file/file_helper.go:92:		GetIgnoredPatchesPath				0.0%
github.com/konveyor/crane/internal/file/file_helper.go:96:		updateTransformDirPath				100.0%
github.com/konveyor/crane/internal/file/file_helper.go:100:		updateIgnoredPatchesDirPath			0.0%
github.com/konveyor/crane/internal/file/file_helper.go:107:		updatePath					100.0%
github.com/konveyor/crane/internal/file/file_helper.go:114:		GetOutputFilePath				100.0%
github.com/konveyor/crane/internal/file/file_helper.go:124:		GetStageDir					100.0%
github.com/konveyor/crane/internal/file/file_helper.go:130:		GetResourcesDir					100.0%
github.com/konveyor/crane/internal/file/file_helper.go:136:		GetPatchesDir					100.0%
github.com/konveyor/crane/internal/file/file_helper.go:142:		GetReportsDir					100.0%
github.com/konveyor/crane/internal/file/file_helper.go:148:		GetWhiteoutsDir					100.0%
github.com/konveyor/crane/internal/file/file_helper.go:154:		GetKustomizationPath				100.0%
github.com/konveyor/crane/internal/file/file_helper.go:160:		GetMetadataPath					100.0%
github.com/konveyor/crane/internal/file/file_helper.go:166:		GetResourceTypeFilePath				100.0%
github.com/konveyor/crane/internal/file/file_helper.go:172:		GetPatchFilePath				100.0%
github.com/konveyor/crane/internal/file/file_helper.go:178:		GetWhiteoutReportPath				100.0%
github.com/konveyor/crane/internal/file/file_helper.go:184:		GetIgnoredPatchReportPath			100.0%
github.com/konveyor/crane/internal/file/file_helper.go:190:		GetStageWorkDir					0.0%
github.com/konveyor/crane/internal/file/file_helper.go:196:		GetStageInputDir				0.0%
github.com/konveyor/crane/internal/file/file_helper.go:203:		GetStageTransformDir				0.0%
github.com/konveyor/crane/internal/file/file_helper.go:209:		GetStageOutputDir				0.0%
github.com/konveyor/crane/internal/file/file_helper.go:214:		GetKustomizeCommand				0.0%
github.com/konveyor/crane/internal/file/file_helper.go:234:		GetResourceFilename				0.0%
github.com/konveyor/crane/internal/flags/global_flags.go:14:		ApplyFlags					0.0%
github.com/konveyor/crane/internal/flags/global_flags.go:21:		GetLogger					0.0%
github.com/konveyor/crane/internal/flags/global_flags.go:29:		initConfig					0.0%
github.com/konveyor/crane/internal/plugin/plugin_helper.go:21:		GetPlugins					0.0%
github.com/konveyor/crane/internal/plugin/plugin_helper.go:38:		getBinaryPlugins				0.0%
github.com/konveyor/crane/internal/plugin/plugin_helper.go:63:		IsExecAny					0.0%
github.com/konveyor/crane/internal/plugin/plugin_helper.go:67:		GetFilteredPlugins				0.0%
github.com/konveyor/crane/internal/plugin/plugin_helper.go:106:		isPluginInList					0.0%
github.com/konveyor/crane/internal/plugin/plugin_manager_helper.go:24:	BuildManifestMap				0.0%
github.com/konveyor/crane/internal/plugin/plugin_manager_helper.go:68:	GetYamlFromUrl					75.0%
github.com/konveyor/crane/internal/plugin/plugin_manager_helper.go:82:	YamlToManifest					72.7%
github.com/konveyor/crane/internal/plugin/plugin_manager_helper.go:104:	FilterPluginForOsArch				100.0%
github.com/konveyor/crane/internal/plugin/plugin_manager_helper.go:122:	GetDefaultSource				0.0%
github.com/konveyor/crane/internal/plugin/plugin_manager_helper.go:131:	LocateBinaryInPluginDir				0.0%
github.com/konveyor/crane/internal/plugin/plugin_manager_helper.go:143:	IsUrl						100.0%
github.com/konveyor/crane/internal/plugin/plugin_manager_helper.go:149:	getData						80.0%
github.com/konveyor/crane/internal/transform/orchestrator.go:40:	RunMultiStage					75.0%
github.com/konveyor/crane/internal/transform/orchestrator.go:146:	executeStage					72.7%
github.com/konveyor/crane/internal/transform/orchestrator.go:198:	transformResources				68.4%
github.com/konveyor/crane/internal/transform/orchestrator.go:249:	formatResourceID				0.0%
github.com/konveyor/crane/internal/transform/orchestrator.go:256:	getPluginForStage				90.9%
github.com/konveyor/crane/internal/transform/orchestrator.go:283:	getAvailablePluginNames				0.0%
github.com/konveyor/crane/internal/transform/orchestrator.go:296:	applyStageTransforms				83.3%
github.com/konveyor/crane/internal/transform/orchestrator.go:357:	loadResourcesFromDirectory			85.7%
github.com/konveyor/crane/internal/transform/orchestrator.go:372:	writeResourcesToDirectory			69.2%
github.com/konveyor/crane/internal/transform/stages.go:22:		DiscoverStages					90.5%
github.com/konveyor/crane/internal/transform/stages.go:82:		FilterStages					100.0%
github.com/konveyor/crane/internal/transform/stages.go:100:		GetFirstStage					100.0%
github.com/konveyor/crane/internal/transform/stages.go:110:		GetLastStage					66.7%
github.com/konveyor/crane/internal/transform/stages.go:120:		GetPreviousStage				100.0%
github.com/konveyor/crane/internal/transform/stages.go:130:		GetNextStage					100.0%
github.com/konveyor/crane/internal/transform/stages.go:140:		ValidateStageName				100.0%
github.com/konveyor/crane/internal/transform/stages.go:149:		GenerateStageName				100.0%
github.com/konveyor/crane/internal/transform/test_helpers.go:11:	hasKustomizeCommand				66.7%
github.com/konveyor/crane/internal/transform/test_helpers.go:23:	contains					100.0%
github.com/konveyor/crane/internal/transform/test_helpers.go:32:	findInString					100.0%
github.com/konveyor/crane/internal/transform/writer.go:28:		NewKustomizeWriter				100.0%
github.com/konveyor/crane/internal/transform/writer.go:37:		WriteStage					68.4%
github.com/konveyor/crane/internal/transform/writer.go:218:		getResourceID					83.3%
github.com/konveyor/crane/internal/transform/writer.go:231:		filterValidRemoveOps				76.2%
github.com/konveyor/crane/internal/transform/writer.go:275:		pathExists					93.5%
github.com/konveyor/crane/internal/transform/writer.go:352:		generateKustomizationWithComments		93.8%
github.com/konveyor/crane/internal/transform/writer.go:383:		checkStageDirectory				23.1%
github.com/konveyor/crane/internal/validate/api_resources.go:23:	ParseAPIResourcesJSON				90.9%
github.com/konveyor/crane/internal/validate/matcher.go:25:		MatchResults					75.0%
github.com/konveyor/crane/internal/validate/matcher.go:36:		MatchResultsFromIndex				100.0%
github.com/konveyor/crane/internal/validate/matcher.go:72:		buildDiscoveryIndex				64.7%
github.com/konveyor/crane/internal/validate/matcher.go:102:		matchEntry					100.0%
github.com/konveyor/crane/internal/validate/matcher.go:131:		buildKindIndex					100.0%
github.com/konveyor/crane/internal/validate/matcher.go:143:		addSuggestion					92.3%
github.com/konveyor/crane/internal/validate/report.go:17:		FormatTable					91.3%
github.com/konveyor/crane/internal/validate/report.go:60:		FormatJSON					100.0%
github.com/konveyor/crane/internal/validate/report.go:67:		FormatYAML					0.0%
github.com/konveyor/crane/internal/validate/report.go:79:		WriteFailures					0.0%
github.com/konveyor/crane/internal/validate/report.go:115:		failureFileName					0.0%
github.com/konveyor/crane/internal/validate/report.go:129:		safeFilePart					0.0%
github.com/konveyor/crane/internal/validate/report.go:145:		parseAPIVersion					0.0%
github.com/konveyor/crane/internal/validate/scanner.go:34:		ScanManifests					75.4%
github.com/konveyor/crane/internal/validate/types.go:46:		HasIncompatible					100.0%
github.com/konveyor/crane/internal/validate/types.go:49:		IncompatibleResults				0.0%
github.com/konveyor/crane/main.go:22:					main						0.0%
total:									(statements)					39.8%

Posted by CI

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
.github/workflows/build-crane-binaries.yml (2)

10-11: 💤 Low value

Reconsider the daily cron schedule.

The daily scheduled build at 2 AM runs regardless of whether code has changed, potentially wasting CI minutes and resources. Consider removing this trigger unless there's a specific need to test against daily dependency updates or external changes.

♻️ Proposed fix to remove daily schedule
-  schedule:
-    - cron: "0 2 * * *"
🤖 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/build-crane-binaries.yml around lines 10 - 11, Remove the
unconditional daily cron trigger by deleting or commenting out the schedule
block (the schedule: key and the cron: "0 2 * * *" line) so the workflow only
runs on explicit triggers (e.g., push, pull_request) or add a conditional check;
update the workflow to rely on existing event triggers instead of the schedule
unless you need automated daily builds for dependency checks or external
changes.

59-59: 💤 Low value

Consider adding version information via ldflags.

The build command doesn't inject version information into the binary. Consider adding -ldflags to embed version, commit hash, or build date for better observability.

📦 Example with version ldflags
           binary="crane_${GOOS}_${GOARCH}${ext}"
-          go build -trimpath -o "dist/${binary}" .
+          VERSION="${GITHUB_REF_NAME:-dev}"
+          COMMIT="${GITHUB_SHA::7}"
+          BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
+          go build -trimpath \
+            -ldflags "-s -w -X main.Version=${VERSION} -X main.Commit=${COMMIT} -X main.BuildDate=${BUILD_DATE}" \
+            -o "dist/${binary}" .

Note: This assumes your code has corresponding variables like var Version string in the main package.

🤖 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/build-crane-binaries.yml at line 59, The build step should
inject version metadata via go linker flags: modify the go build invocation that
currently runs go build -trimpath -o "dist/${binary}" . to add an -ldflags
argument that sets package-level variables (e.g. main.Version, main.Commit,
main.BuildDate) using GitHub Actions expressions (like github.ref, github.sha,
and a timestamp or run number). Ensure your main package defines the
corresponding variables (e.g. var Version, Commit, BuildDate string) so the -X
assignments (for example -X 'main.Version=...' -X 'main.Commit=...' -X
'main.BuildDate=...') embed the values into the binary at build time.
🤖 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/build-crane-binaries.yml:
- Around line 89-97: The workflow step "Create combined checksums manifest" uses
Bash-specific [[ ]] in the for-loop test; change the step to explicitly run the
script with bash or replace the conditional with POSIX-compliant syntax. Locate
the step named "Create combined checksums manifest" and either add an explicit
bash shebang at the top of the run block so the for loop and [[ ]] are executed
by bash, or replace the `[[ "$binary" != *.sha256 ]]` test with a POSIX-safe
alternative (e.g., using case or single-bracket tests and pattern matching)
while keeping the existing `sha256sum` append to checksums.txt unchanged.
- Around line 99-106: The release step using softprops/action-gh-release
currently uploads release-assets/crane_* which also matches individual .sha256
files; modify the "Create draft GitHub release" step (uses:
softprops/action-gh-release@v2) to exclude individual checksum files by changing
the files input to either use a negation pattern to omit *.sha256 (e.g., exclude
release-assets/*.sha256) or explicitly list only the binary patterns (e.g.,
release-assets/crane_*_linux_amd64, release-assets/crane_*_darwin_arm64, etc.),
or alternatively add a prior step to remove or move *.sha256 files before this
action so only the combined release-assets/checksums.txt and binaries are
uploaded.

---

Nitpick comments:
In @.github/workflows/build-crane-binaries.yml:
- Around line 10-11: Remove the unconditional daily cron trigger by deleting or
commenting out the schedule block (the schedule: key and the cron: "0 2 * * *"
line) so the workflow only runs on explicit triggers (e.g., push, pull_request)
or add a conditional check; update the workflow to rely on existing event
triggers instead of the schedule unless you need automated daily builds for
dependency checks or external changes.
- Line 59: The build step should inject version metadata via go linker flags:
modify the go build invocation that currently runs go build -trimpath -o
"dist/${binary}" . to add an -ldflags argument that sets package-level variables
(e.g. main.Version, main.Commit, main.BuildDate) using GitHub Actions
expressions (like github.ref, github.sha, and a timestamp or run number). Ensure
your main package defines the corresponding variables (e.g. var Version, Commit,
BuildDate string) so the -X assignments (for example -X 'main.Version=...' -X
'main.Commit=...' -X 'main.BuildDate=...') embed the values into the binary at
build time.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 45b22f43-1b9e-406c-aa8b-691a9353a108

📥 Commits

Reviewing files that changed from the base of the PR and between a3d960f and c678397.

📒 Files selected for processing (1)
  • .github/workflows/build-crane-binaries.yml

Comment thread .github/workflows/build-release-binaries.yml
Comment thread .github/workflows/build-release-binaries.yml
Signed-off-by: M Sajid Mansoori <mmansoor@redhat.com>
@msajidmansoori12 msajidmansoori12 force-pushed the multiplatform-ci-release branch from 478c315 to 5e38a62 Compare May 18, 2026 06:22
…zip files already

Signed-off-by: M Sajid Mansoori <mmansoor@redhat.com>
@msajidmansoori12 msajidmansoori12 force-pushed the multiplatform-ci-release branch 2 times, most recently from 2e01943 to 4d3dccf Compare May 18, 2026 07:46
Signed-off-by: M Sajid Mansoori <mmansoor@redhat.com>
@msajidmansoori12 msajidmansoori12 force-pushed the multiplatform-ci-release branch from 4d3dccf to 21296cd Compare May 18, 2026 07:48
Signed-off-by: M Sajid Mansoori <mmansoor@redhat.com>
@msajidmansoori12 msajidmansoori12 force-pushed the multiplatform-ci-release branch from fd06bb2 to 3acbab3 Compare May 18, 2026 08:07
@msajidmansoori12 msajidmansoori12 changed the title First draft for building crane binaries feat: add binary release workflows and simplify README downloads section. May 18, 2026
Signed-off-by: M Sajid Mansoori <mmansoor@redhat.com>

@aufi aufi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave a brief look, looks good, let's see it working. LGTM.

@msajidmansoori12 msajidmansoori12 merged commit 713faa4 into migtools:main May 20, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Automate multi-platform binary builds for crane

2 participants