minigraf 0.24.0

Zero-config, single-file, embedded graph database with bi-temporal Datalog queries
Documentation
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