name: Build, Test, and Linting on: push: pull_request: workflow_dispatch: env: CARGO_TERM_COLOR: always RUSTFLAGS: "-Dwarnings" jobs: build_jar: name: Build JAR runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - name: Set up JDK 25 uses: actions/setup-java@v5 with: java-version: "25" distribution: "zulu" - name: Setup Gradle uses: gradle/actions/setup-gradle@v6 - name: Build JAR with Gradle run: ./gradlew jar working-directory: java - name: Upload JAR uses: actions/upload-artifact@v7 with: name: patchbukkit-jar path: java/patchbukkit/build/libs/patchbukkit.jar format: name: Check formatting runs-on: ubuntu-latest needs: [build_jar] steps: - uses: actions/checkout@v7 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: rustup component add rustfmt - uses: Swatinem/rust-cache@v2 - run: cargo fmt --check working-directory: rust machete: name: Detect unused dependencies runs-on: ubuntu-latest needs: [format] steps: - uses: actions/checkout@v7 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - uses: bnjbvr/cargo-machete@main clippy_debug: name: Run lints (debug) runs-on: ubuntu-latest needs: [machete] steps: - uses: actions/checkout@v7 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: rustup component add clippy - uses: Swatinem/rust-cache@v2 - name: Download JAR uses: actions/download-artifact@v8 with: name: patchbukkit-jar path: java/patchbukkit/build/libs/ - name: Set up JDK 25 uses: actions/setup-java@v5 with: java-version: "25" distribution: "zulu" - name: Sync Pumpkin dependencies run: cargo update -p pumpkin -p pumpkin-api-macros -p pumpkin-data -p pumpkin-protocol -p pumpkin-util working-directory: rust - name: Clippy (debug) run: cargo clippy --all-targets --all-features working-directory: rust clippy_release: name: Run lints (release) runs-on: ubuntu-latest needs: [machete] steps: - uses: actions/checkout@v7 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: rustup component add clippy - uses: Swatinem/rust-cache@v2 - name: Download JAR uses: actions/download-artifact@v8 with: name: patchbukkit-jar path: java/patchbukkit/build/libs/ - name: Set up JDK 25 uses: actions/setup-java@v5 with: java-version: "25" distribution: "zulu" - name: Sync Pumpkin dependencies run: cargo update -p pumpkin -p pumpkin-api-macros -p pumpkin-data -p pumpkin-protocol -p pumpkin-util working-directory: rust - name: Clippy (release) run: cargo clippy --release --all-targets --all-features working-directory: rust build_release: name: Build project in release runs-on: ${{ matrix.os }} needs: [clippy_debug, clippy_release] strategy: matrix: os: [ ubuntu-latest, ubuntu-26.04-arm, windows-latest, windows-11-arm, macos-latest, ] steps: - uses: actions/checkout@v7 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - uses: Swatinem/rust-cache@v2 - name: Download JAR uses: actions/download-artifact@v8 with: name: patchbukkit-jar path: java/patchbukkit/build/libs/ - name: Set up JDK 25 uses: actions/setup-java@v5 with: java-version: "25" distribution: "zulu" - name: Sync Pumpkin dependencies run: cargo update -p pumpkin -p pumpkin-api-macros -p pumpkin-data -p pumpkin-protocol -p pumpkin-util working-directory: rust - name: Build Release shell: bash run: | if [[ "${{ runner.arch }}" == "X64" ]]; then export RUSTFLAGS="$RUSTFLAGS -C target-cpu=x86-64-v3" fi cd rust && cargo build --verbose --release - name: Prepare artifacts shell: bash run: | mkdir -p dist case "${{ runner.os }}" in Linux) cp rust/target/release/*.so "dist/libpatchbukkit-${{ runner.arch }}-${{ runner.os }}.so" ;; macOS) cp rust/target/release/*.dylib "dist/libpatchbukkit-${{ runner.arch }}-${{ runner.os }}.dylib" ;; Windows) cp rust/target/release/*.dll "dist/patchbukkit-${{ runner.arch }}-${{ runner.os }}.dll" ;; esac - name: Export artifacts uses: actions/upload-artifact@v7 with: name: patchbukkit-${{ runner.arch }}-${{ runner.os }} compression-level: 9 path: dist/* draft_release: permissions: contents: write needs: [build_release] runs-on: ubuntu-latest if: github.event_name == 'push' && github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v7 - name: Download prebuilt artifacts uses: actions/download-artifact@v8 with: pattern: "patchbukkit-*" path: dist/ merge-multiple: true - name: Generate release notes run: | tree dist/ echo "From commit: $(git rev-parse --short HEAD)" > dist/RELEASE.md echo "Generated on: $(date -u +"%Y-%m-%d %H:%M") UTC" >> dist/RELEASE.md cat dist/RELEASE.md - name: Update the nightly tag run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git tag --force nightly && git push --force origin tag nightly - name: Remove JAR run: rm -f dist/*.jar - name: Draft a nightly github release uses: softprops/action-gh-release@v2 with: prerelease: true files: dist/* tag_name: nightly name: Nightly Build body_path: dist/RELEASE.md