name: Java Release
on:
workflow_call:
inputs:
tag:
required: true
type: string
workflow_dispatch:
inputs:
tag:
required: true
type: string
jobs:
build-natives:
name: Build native (${{ matrix.target }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
native-dir: linux/x86_64
lib-name: libminigraf_ffi.so
- os: ubuntu-24.04-arm
target: aarch64-unknown-linux-gnu
native-dir: linux/aarch64
lib-name: libminigraf_ffi.so
- os: macos-14
target: universal2
native-dir: macos/universal
lib-name: libminigraf_ffi.dylib
- os: windows-latest
target: x86_64-pc-windows-msvc
native-dir: windows/x86_64
lib-name: minigraf_ffi.dll
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target == 'universal2' && 'aarch64-apple-darwin x86_64-apple-darwin' || matrix.target }}
- name: Build native (universal2)
if: matrix.target == 'universal2'
run: |
cargo build --release -p minigraf-ffi --target aarch64-apple-darwin
cargo build --release -p minigraf-ffi --target x86_64-apple-darwin
lipo -create \
target/aarch64-apple-darwin/release/libminigraf_ffi.dylib \
target/x86_64-apple-darwin/release/libminigraf_ffi.dylib \
-output libminigraf_ffi.dylib
- name: Build native (other)
if: matrix.target != 'universal2'
run: cargo build --release -p minigraf-ffi --target ${{ matrix.target }}
- name: Upload native
uses: actions/upload-artifact@v4
with:
name: native-${{ matrix.native-dir == 'linux/x86_64' && 'linux-x64' || matrix.native-dir == 'linux/aarch64' && 'linux-arm64' || matrix.native-dir == 'macos/universal' && 'macos' || 'windows' }}
path: |
${{ matrix.target == 'universal2' && 'libminigraf_ffi.dylib' || format('target/{0}/release/{1}', matrix.target, matrix.lib-name) }}
assemble-and-publish:
name: Assemble fat JAR and publish to Maven Central
needs: build-natives
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Download all natives
uses: actions/download-artifact@v4
with:
pattern: native-*
path: natives-staging
merge-multiple: false
- name: Copy natives into resources
run: |
RESOURCES=minigraf-ffi/java/src/main/resources/natives
mkdir -p "$RESOURCES/linux/x86_64" "$RESOURCES/linux/aarch64" \
"$RESOURCES/macos/universal" "$RESOURCES/windows/x86_64"
cp natives-staging/native-linux-x64/libminigraf_ffi.so "$RESOURCES/linux/x86_64/"
cp natives-staging/native-linux-arm64/libminigraf_ffi.so "$RESOURCES/linux/aarch64/"
cp natives-staging/native-macos/libminigraf_ffi.dylib "$RESOURCES/macos/universal/"
cp natives-staging/native-windows/minigraf_ffi.dll "$RESOURCES/windows/x86_64/"
- name: Build Rust library for bindgen (Linux x86_64)
run: cargo build --release -p minigraf-ffi
- name: Generate Kotlin bindings
working-directory: minigraf-ffi/java
run: ./gradlew generateKotlinBindings
- name: Publish to Maven Central
working-directory: minigraf-ffi/java
env:
CENTRAL_TOKEN_USERNAME: ${{ secrets.CENTRAL_TOKEN_USERNAME }}
CENTRAL_TOKEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN_PASSWORD }}
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
GPG_SIGNING_PASSWORD: ${{ secrets.GPG_SIGNING_PASSWORD }}
run: ./gradlew publishAllPublicationsToCentralPortal