PatchBukkit/.github/workflows/rust.yml
2026-08-19 15:26:24 -07:00

199 lines
7.3 KiB
YAML

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