Add Windows, MacOS, and Linux build and release workflow (#11)#12
Merged
dereklopes merged 1 commit intomasterfrom Mar 18, 2026
Merged
Add Windows, MacOS, and Linux build and release workflow (#11)#12dereklopes merged 1 commit intomasterfrom
dereklopes merged 1 commit intomasterfrom
Conversation
* Migrate build to Maven + Java 21 with jpackage distribution - Add pom.xml: Java 21, OpenJFX 21.0.2, JUnit 5.10.2, javafx-maven-plugin - Add module-info.java (JPMS module 'Calculator') - Restructure sources into Maven standard layout (src/main/java, src/main/resources, src/test/java) - Add .github/workflows/build.yml: CI on ubuntu/windows/macos with jpackage app-image output - Update .gitignore to exclude Maven target/ directory Run the app: mvn javafx:run Run tests: mvn test Build dist: mvn package (then see GitHub Actions for jpackage step) https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Add macos-13 runner to CI matrix for Intel Mac support macos-latest now runs on ARM64 (Apple Silicon), so Intel Mac users need a separate macos-13 job to get a compatible x86-64 artifact. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Publish platform artifacts to GitHub Releases on version tags - Add tags: ["v*"] trigger so pushing e.g. v1.0.0 kicks off a release - Zip each jpackage output (zip on Linux/macOS, Compress-Archive on Windows) so each platform produces a single downloadable archive - Add a release job (needs: build) that downloads all four zips and publishes them to the GitHub release via softprops/action-gh-release https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Rename macos-13 artifact to macos-intel for clarity Uses matrix include to set artifact-name: macos-intel on the macos-13 runner; other runners fall back to the OS name as before. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Use clean platform names and version tag in artifact filenames Switches matrix to include-only so every platform gets an explicit short name (ubuntu, windows, macos, macos-intel). Appends github.ref_name to each zip so release assets read e.g. PelvicRotationCalculator-macos-intel-v1.0.0.zip. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Rename ubuntu artifact to linux The app-image bundles the JVM so it's not Ubuntu-specific; it runs on any modern Linux distro with glibc >= 2.35 (Debian 12+, Fedora 36+, Arch, etc.). https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Fix zip failure caused by slash in ref name github.ref_name for branch builds (e.g. claude/feature-branch) contains a '/' which the shell interprets as a directory separator, causing the zip/Compress-Archive command to fail with "no such file or directory". Add a sanitize step that replaces '/' with '-' before using the ref name in the zip filename. Tags like v1.0.0 are unaffected. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Fix jpackage on macOS Intel by selecting full Xcode toolchain On macOS 13 Intel runners, xcode-select often points to the CLT directory rather than the full Xcode app, which causes jpackage to fail when it invokes xcrun-backed tools to assemble the app bundle. Explicitly switch to /Applications/Xcode.app before jpackage. Also add --verbose to jpackage on all non-Windows platforms so any future failure produces actionable output in the Actions log. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Remove macos-13 (Intel) runner — no longer supported by GitHub Actions The macos-13 runner image has been retired; attempting to use it produces "The configuration 'macos-13-us-default' is not supported". GitHub no longer offers hosted Intel Mac runners. The macos-latest (Apple Silicon) build remains as the macOS artifact. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Use OpenJFX jmods instead of Maven jars for jpackage bundling The Maven JavaFX artifacts split Java classes and native libraries into separate jars (main artifact vs platform classifier). jpackage's internal jlink only processes the modular jar and misses the native libs, producing an app image that fails with "Failed to launch JVM". OpenJFX jmods bundle classes and native libraries together, which is exactly what jlink/jpackage needs. Download platform-specific jmods from Gluon for each matrix entry and use them on the module path. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Open Calculator package to javafx.graphics for reflective instantiation jpackage enforces strict module boundaries, so javafx.graphics needs access to construct CalculatorApplication via reflection at launch. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix artifact zip structure — upload directory instead of zip file upload-artifact already creates a zip for download, so uploading a zip file caused double-zipping. Now the build job uploads the dist directory directly and the release job handles creating zips for release assets. Also removes the ref-name sanitize step which is no longer needed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Switch macOS packaging from app-image to DMG to fix Gatekeeper block Zipping an app-image breaks the ad-hoc code signature, causing macOS to show "is damaged and can't be opened" with no bypass. A DMG preserves the signature, so users see the bypassable "developer cannot be verified" dialog instead (right-click > Open works). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Update instructions for opening on Mac * Remove old source files superseded by Maven directory layout These files under src/Calculator/ were replaced by the Maven standard layout (src/main/java/, src/main/resources/, src/test/java/) but never deleted. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
dereklopes
added a commit
that referenced
this pull request
Mar 19, 2026
* Combined FFD measurement fields and changed formatting * Add Windows, MacOS, and Linux build and release workflow (#11) (#12) * Migrate build to Maven + Java 21 with jpackage distribution - Add pom.xml: Java 21, OpenJFX 21.0.2, JUnit 5.10.2, javafx-maven-plugin - Add module-info.java (JPMS module 'Calculator') - Restructure sources into Maven standard layout (src/main/java, src/main/resources, src/test/java) - Add .github/workflows/build.yml: CI on ubuntu/windows/macos with jpackage app-image output - Update .gitignore to exclude Maven target/ directory Run the app: mvn javafx:run Run tests: mvn test Build dist: mvn package (then see GitHub Actions for jpackage step) https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Add macos-13 runner to CI matrix for Intel Mac support macos-latest now runs on ARM64 (Apple Silicon), so Intel Mac users need a separate macos-13 job to get a compatible x86-64 artifact. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Publish platform artifacts to GitHub Releases on version tags - Add tags: ["v*"] trigger so pushing e.g. v1.0.0 kicks off a release - Zip each jpackage output (zip on Linux/macOS, Compress-Archive on Windows) so each platform produces a single downloadable archive - Add a release job (needs: build) that downloads all four zips and publishes them to the GitHub release via softprops/action-gh-release https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Rename macos-13 artifact to macos-intel for clarity Uses matrix include to set artifact-name: macos-intel on the macos-13 runner; other runners fall back to the OS name as before. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Use clean platform names and version tag in artifact filenames Switches matrix to include-only so every platform gets an explicit short name (ubuntu, windows, macos, macos-intel). Appends github.ref_name to each zip so release assets read e.g. PelvicRotationCalculator-macos-intel-v1.0.0.zip. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Rename ubuntu artifact to linux The app-image bundles the JVM so it's not Ubuntu-specific; it runs on any modern Linux distro with glibc >= 2.35 (Debian 12+, Fedora 36+, Arch, etc.). https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Fix zip failure caused by slash in ref name github.ref_name for branch builds (e.g. claude/feature-branch) contains a '/' which the shell interprets as a directory separator, causing the zip/Compress-Archive command to fail with "no such file or directory". Add a sanitize step that replaces '/' with '-' before using the ref name in the zip filename. Tags like v1.0.0 are unaffected. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Fix jpackage on macOS Intel by selecting full Xcode toolchain On macOS 13 Intel runners, xcode-select often points to the CLT directory rather than the full Xcode app, which causes jpackage to fail when it invokes xcrun-backed tools to assemble the app bundle. Explicitly switch to /Applications/Xcode.app before jpackage. Also add --verbose to jpackage on all non-Windows platforms so any future failure produces actionable output in the Actions log. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Remove macos-13 (Intel) runner — no longer supported by GitHub Actions The macos-13 runner image has been retired; attempting to use it produces "The configuration 'macos-13-us-default' is not supported". GitHub no longer offers hosted Intel Mac runners. The macos-latest (Apple Silicon) build remains as the macOS artifact. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Use OpenJFX jmods instead of Maven jars for jpackage bundling The Maven JavaFX artifacts split Java classes and native libraries into separate jars (main artifact vs platform classifier). jpackage's internal jlink only processes the modular jar and misses the native libs, producing an app image that fails with "Failed to launch JVM". OpenJFX jmods bundle classes and native libraries together, which is exactly what jlink/jpackage needs. Download platform-specific jmods from Gluon for each matrix entry and use them on the module path. https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB * Open Calculator package to javafx.graphics for reflective instantiation jpackage enforces strict module boundaries, so javafx.graphics needs access to construct CalculatorApplication via reflection at launch. * Fix artifact zip structure — upload directory instead of zip file upload-artifact already creates a zip for download, so uploading a zip file caused double-zipping. Now the build job uploads the dist directory directly and the release job handles creating zips for release assets. Also removes the ref-name sanitize step which is no longer needed. * Switch macOS packaging from app-image to DMG to fix Gatekeeper block Zipping an app-image breaks the ad-hoc code signature, causing macOS to show "is damaged and can't be opened" with no bypass. A DMG preserves the signature, so users see the bypassable "developer cannot be verified" dialog instead (right-click > Open works). * Update instructions for opening on Mac * Remove old source files superseded by Maven directory layout These files under src/Calculator/ were replaced by the Maven standard layout (src/main/java/, src/main/resources/, src/test/java/) but never deleted. --------- Co-authored-by: Claude <noreply@anthropic.com> * Update README with v1.2 release download links and platform-specific install instructions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Derek Lopes <delopes@cisco.com> Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Run the app: mvn javafx:run
Run tests: mvn test
Build dist: mvn package (then see GitHub Actions for jpackage step)
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
macos-latest now runs on ARM64 (Apple Silicon), so Intel Mac users need a separate macos-13 job to get a compatible x86-64 artifact.
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
Uses matrix include to set artifact-name: macos-intel on the macos-13 runner; other runners fall back to the OS name as before.
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
Switches matrix to include-only so every platform gets an explicit short name (ubuntu, windows, macos, macos-intel). Appends github.ref_name to each zip so release assets read e.g. PelvicRotationCalculator-macos-intel-v1.0.0.zip.
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
The app-image bundles the JVM so it's not Ubuntu-specific; it runs on any modern Linux distro with glibc >= 2.35 (Debian 12+, Fedora 36+, Arch, etc.).
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
github.ref_name for branch builds (e.g. claude/feature-branch) contains a '/' which the shell interprets as a directory separator, causing the zip/Compress-Archive command to fail with "no such file or directory".
Add a sanitize step that replaces '/' with '-' before using the ref name in the zip filename. Tags like v1.0.0 are unaffected.
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
On macOS 13 Intel runners, xcode-select often points to the CLT directory rather than the full Xcode app, which causes jpackage to fail when it invokes xcrun-backed tools to assemble the app bundle. Explicitly switch to /Applications/Xcode.app before jpackage.
Also add --verbose to jpackage on all non-Windows platforms so any future failure produces actionable output in the Actions log.
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
The macos-13 runner image has been retired; attempting to use it produces "The configuration 'macos-13-us-default' is not supported". GitHub no longer offers hosted Intel Mac runners. The macos-latest (Apple Silicon) build remains as the macOS artifact.
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
The Maven JavaFX artifacts split Java classes and native libraries into separate jars (main artifact vs platform classifier). jpackage's internal jlink only processes the modular jar and misses the native libs, producing an app image that fails with "Failed to launch JVM".
OpenJFX jmods bundle classes and native libraries together, which is exactly what jlink/jpackage needs. Download platform-specific jmods from Gluon for each matrix entry and use them on the module path.
https://claude.ai/code/session_01DdbecMTtUNzx9BA5TdY9iB
jpackage enforces strict module boundaries, so javafx.graphics needs access to construct CalculatorApplication via reflection at launch.
upload-artifact already creates a zip for download, so uploading a zip file caused double-zipping. Now the build job uploads the dist directory directly and the release job handles creating zips for release assets.
Also removes the ref-name sanitize step which is no longer needed.
Zipping an app-image breaks the ad-hoc code signature, causing macOS to show "is damaged and can't be opened" with no bypass. A DMG preserves the signature, so users see the bypassable "developer cannot be verified" dialog instead (right-click > Open works).
Update instructions for opening on Mac
Remove old source files superseded by Maven directory layout
These files under src/Calculator/ were replaced by the Maven standard layout (src/main/java/, src/main/resources/, src/test/java/) but never deleted.