From 67358d6ae6f75e3b920aa5c32a6892695b8959f5 Mon Sep 17 00:00:00 2001 From: Toni Verbeiren Date: Wed, 4 Feb 2026 11:13:05 +0100 Subject: [PATCH 1/4] Add GraalVM build target --- build.sbt | 36 ++++++++++++++++++++++++++++++ project/plugins.sbt | 1 + src/main/scala/io/viash/Main.scala | 5 ++--- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index f6d96f08a..bfcc7d4d4 100644 --- a/build.sbt +++ b/build.sbt @@ -78,5 +78,41 @@ generateWorkflowHelper := { streams.value.log.info(s"Generated WorkflowHelper.nf at ${wfHelper.toAbsolutePath}") } +// Generate BuildInfo.scala with name and version baked in at compile time. +// The JAR manifest approach doesn't work in GraalVM native binaries. +Compile / sourceGenerators += Def.task { + val file = (Compile / sourceManaged).value / "io" / "viash" / "BuildInfo.scala" + IO.write(file, + s"""package io.viash + | + |object BuildInfo { + | val name: String = "${name.value}" + | val version: String = "${version.value}" + |} + |""".stripMargin) + Seq(file) +}.taskValue + assembly := ((assembly) dependsOn generateWorkflowHelper).value Test / testOptions := ((Test / testOptions) dependsOn generateWorkflowHelper).value + +// GraalVM native-image configuration +enablePlugins(NativeImagePlugin) + +Compile / mainClass := Some("io.viash.Main") + +nativeImageJvm := "graalvm-java21" +nativeImageVersion := "21.0.2" +Global / excludeLintKeys ++= Set(nativeImageJvm, nativeImageVersion) + +nativeImageOptions ++= Seq( + "--no-fallback", + "-H:+ReportExceptionStackTraces", + // Scala 3 lazy vals use reflection for bitmap fields (scala/scala3#13985). + // Initializing at build time lets reflection resolve during the build. + "--initialize-at-build-time=scala,org.rogach.scallop", + // viash downloads remote resources and version binaries over HTTPS + "--enable-url-protocols=https", +) + +nativeImage := ((nativeImage) dependsOn generateWorkflowHelper).value diff --git a/project/plugins.sbt b/project/plugins.sbt index ebefee87c..d92e40878 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,3 +1,4 @@ addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.1") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.1.0") addSbtPlugin("de.heikoseeberger" % "sbt-header" % "5.9.0") +addSbtPlugin("org.scalameta" % "sbt-native-image" % "0.3.4") diff --git a/src/main/scala/io/viash/Main.scala b/src/main/scala/io/viash/Main.scala index 711405c16..a3bf03a55 100644 --- a/src/main/scala/io/viash/Main.scala +++ b/src/main/scala/io/viash/Main.scala @@ -43,9 +43,8 @@ import scala.io.Source import io.viash.helpers.autonetconfig.AutoNetConfig object Main extends Logging { - private val pkg = getClass.getPackage - val name: String = if (pkg.getImplementationTitle != null) pkg.getImplementationTitle else "viash" - val version: String = if (pkg.getImplementationVersion != null) pkg.getImplementationVersion else "test" + val name: String = BuildInfo.name + val version: String = BuildInfo.version /** * Viash main From 4dd6444236d9d7c6705a04844a147235c947c335 Mon Sep 17 00:00:00 2001 From: Toni Verbeiren Date: Mon, 9 Feb 2026 10:29:02 +0100 Subject: [PATCH 2/4] Update Github Actions WF --- .github/workflows/prep_release.yml | 141 ++++++++++++++++++++++++++--- 1 file changed, 130 insertions(+), 11 deletions(-) diff --git a/.github/workflows/prep_release.yml b/.github/workflows/prep_release.yml index af1377997..9df435de9 100644 --- a/.github/workflows/prep_release.yml +++ b/.github/workflows/prep_release.yml @@ -2,13 +2,17 @@ name: Prepare Viash Release on: workflow_dispatch: - + jobs: - build-and-release: + build-jar: runs-on: ubuntu-latest permissions: - contents: write + contents: read + + outputs: + viash_version: ${{ steps.get_version.outputs.viash_version }} + changelog_section: ${{ steps.get_version.outputs.changelog_section }} steps: - name: Checkout code @@ -43,26 +47,141 @@ jobs: echo "Detected Viash version: $viash_version" echo "Detected Viash minor version: $viash_minor_version" echo "viash_version=$viash_version" >> "$GITHUB_OUTPUT" - + # fetch relevant changelog section changelog_section=$(awk "/# Viash ${viash_version}.*/{flag=1;print;next}/^# /{flag=0}flag" CHANGELOGS/CHANGELOG_${viash_minor_version}.md) - + echo "changelog_section<> "$GITHUB_OUTPUT" echo "$changelog_section" >> "$GITHUB_OUTPUT" echo "GITHUB_EOF" >> "$GITHUB_OUTPUT" + - name: Extract fat JAR + run: | + cp target/viash.jar viash.jar + + - name: Upload JAR artifact + uses: actions/upload-artifact@v4 + with: + name: fat-jar + path: viash.jar + retention-days: 1 + + - name: Upload release assets + uses: actions/upload-artifact@v4 + with: + name: release-assets + path: | + bin/viash + bin/schema.json + bin/viash_install + retention-days: 1 + + build-native: + needs: build-jar + strategy: + fail-fast: false + matrix: + include: + - os: macos-13 + label: macos-x86_64 + - os: macos-14 + label: macos-aarch64 + - os: ubuntu-latest + label: linux-x86_64 + - os: ubuntu-24.04-arm + label: linux-aarch64 + + runs-on: ${{ matrix.os }} + + permissions: + contents: read + + steps: + - name: Download JAR + uses: actions/download-artifact@v4 + with: + name: fat-jar + + - name: Set up GraalVM + uses: graalvm/setup-graalvm@v1 + with: + java-version: '21' + distribution: 'graalvm' + + - name: Build native image + run: | + native-image -jar viash.jar \ + --no-fallback \ + -H:+ReportExceptionStackTraces \ + --initialize-at-build-time=scala,org.rogach.scallop \ + --enable-url-protocols=https \ + -o viash + + - name: Smoke test + run: | + ./viash --version + + - name: Upload native binary + uses: actions/upload-artifact@v4 + with: + name: viash-${{ matrix.label }} + path: viash + retention-days: 1 + + create-release: + needs: [build-jar, build-native] + runs-on: ubuntu-latest + + permissions: + contents: write + + steps: + - name: Download release assets + uses: actions/download-artifact@v4 + with: + name: release-assets + path: release-assets + + - name: Download native binaries + uses: actions/download-artifact@v4 + with: + pattern: viash-* + path: native-binaries + merge-multiple: false + + - name: Prepare release files + run: | + mkdir -p release + + # JAR-based executable (backward compatible) + cp release-assets/bin/viash release/viash + cp release-assets/bin/schema.json release/schema.json + cp release-assets/bin/viash_install release/viash_install + + # Native binaries with platform suffixes + cp native-binaries/viash-linux-x86_64/viash release/viash-linux-x86_64 + cp native-binaries/viash-linux-aarch64/viash release/viash-linux-aarch64 + cp native-binaries/viash-macos-x86_64/viash release/viash-macos-x86_64 + cp native-binaries/viash-macos-aarch64/viash release/viash-macos-aarch64 + + chmod +x release/viash-* + - name: Create release uses: softprops/action-gh-release@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: ${{ steps.get_version.outputs.viash_version }} + tag_name: ${{ needs.build-jar.outputs.viash_version }} target_commitish: ${{ github.sha }} - name: Viash ${{ steps.get_version.outputs.viash_version }} - body: ${{ steps.get_version.outputs.changelog_section }} + name: Viash ${{ needs.build-jar.outputs.viash_version }} + body: ${{ needs.build-jar.outputs.changelog_section }} draft: true fail_on_unmatched_files: true files: | - bin/viash - bin/schema.json - bin/viash_install + release/viash + release/schema.json + release/viash_install + release/viash-linux-x86_64 + release/viash-linux-aarch64 + release/viash-macos-x86_64 + release/viash-macos-aarch64 From 97860a5773ca5398ebb3f2cc7603f72bd2b94dd5 Mon Sep 17 00:00:00 2001 From: Toni Verbeiren Date: Mon, 2 Mar 2026 21:18:19 +0100 Subject: [PATCH 3/4] Revert version introspection logic --- src/main/scala/io/viash/Main.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/scala/io/viash/Main.scala b/src/main/scala/io/viash/Main.scala index a3bf03a55..711405c16 100644 --- a/src/main/scala/io/viash/Main.scala +++ b/src/main/scala/io/viash/Main.scala @@ -43,8 +43,9 @@ import scala.io.Source import io.viash.helpers.autonetconfig.AutoNetConfig object Main extends Logging { - val name: String = BuildInfo.name - val version: String = BuildInfo.version + private val pkg = getClass.getPackage + val name: String = if (pkg.getImplementationTitle != null) pkg.getImplementationTitle else "viash" + val version: String = if (pkg.getImplementationVersion != null) pkg.getImplementationVersion else "test" /** * Viash main From df02e0075e798bfccf800298d48dac06437f040d Mon Sep 17 00:00:00 2001 From: Hendrik Cannoodt Date: Wed, 4 Mar 2026 15:38:02 +0100 Subject: [PATCH 4/4] fix macos image definitions and copying of the release assets --- .github/workflows/prep_release.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/prep_release.yml b/.github/workflows/prep_release.yml index 9df435de9..94efb1936 100644 --- a/.github/workflows/prep_release.yml +++ b/.github/workflows/prep_release.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up JDK 17 uses: actions/setup-java@v5 @@ -82,9 +82,9 @@ jobs: fail-fast: false matrix: include: - - os: macos-13 + - os: macos-15-intel label: macos-x86_64 - - os: macos-14 + - os: macos-15 label: macos-aarch64 - os: ubuntu-latest label: linux-x86_64 @@ -141,6 +141,7 @@ jobs: with: name: release-assets path: release-assets + merge-multiple: true - name: Download native binaries uses: actions/download-artifact@v4 @@ -154,9 +155,9 @@ jobs: mkdir -p release # JAR-based executable (backward compatible) - cp release-assets/bin/viash release/viash - cp release-assets/bin/schema.json release/schema.json - cp release-assets/bin/viash_install release/viash_install + cp release-assets/viash release/viash + cp release-assets/schema.json release/schema.json + cp release-assets/viash_install release/viash_install # Native binaries with platform suffixes cp native-binaries/viash-linux-x86_64/viash release/viash-linux-x86_64