name: Build on: pull_request: push: paths-ignore: - '*.md' - 'LICENSE*' workflow_dispatch: env: RUSTC_WRAPPER: sccache SCCACHE_GHA_ENABLED: "true" jobs: check: name: Check runs-on: ubuntu-latest strategy: matrix: toolchain: [ stable, 1.85.0, nightly ] fail-fast: false env: RUSTFLAGS: -D warnings steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.toolchain }} components: clippy - name: Setup sccache uses: mozilla-actions/sccache-action@v0.0.9 - name: Cargo check run: cargo check --all-targets - name: Cargo clippy run: cargo clippy --all-targets fmt: name: Format runs-on: ubuntu-latest env: RUSTFLAGS: -D warnings steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Rust toolchain # We use nightly options in rustfmt.toml uses: dtolnay/rust-toolchain@nightly with: components: rustfmt - name: Cargo fmt run: cargo fmt --all --check cbindgen: name: Check C header runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Setup sccache uses: mozilla-actions/sccache-action@v0.0.9 - name: Install cbindgen run: cargo install cbindgen - name: Generate header run: cbindgen --config nod-ffi/cbindgen.toml --crate nod-ffi --output /tmp/nod.h - name: Check header is up to date run: diff nod-ffi/include/nod.h /tmp/nod.h deny: name: Deny runs-on: ubuntu-latest env: RUSTC_WRAPPER: "" # sccache breaks cargo-deny strategy: matrix: checks: - advisories - bans licenses sources fail-fast: false # Prevent new advisories from failing CI continue-on-error: ${{ matrix.checks == 'advisories' }} steps: - uses: actions/checkout@v4 - uses: EmbarkStudios/cargo-deny-action@v2 with: command: check ${{ matrix.checks }} test: name: Test strategy: matrix: platform: [ ubuntu-latest, windows-latest, macos-latest ] fail-fast: false runs-on: ${{ matrix.platform }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Setup sccache uses: mozilla-actions/sccache-action@v0.0.9 - name: Cargo test run: cargo test --release build: name: Build nodtool env: BUILD_PROFILE: release-lto CARGO_BIN_NAME: nodtool CARGO_INCREMENTAL: 0 CARGO_TARGET_DIR: target strategy: matrix: include: - platform: ubuntu-latest target: x86_64-unknown-linux-musl name: linux-x86_64 build: zigbuild features: default - platform: ubuntu-latest target: i686-unknown-linux-musl name: linux-i686 build: zigbuild features: default - platform: ubuntu-latest target: aarch64-unknown-linux-musl name: linux-aarch64 build: zigbuild features: default - platform: windows-latest target: i686-pc-windows-msvc name: windows-x86 build: build features: default - platform: windows-latest target: x86_64-pc-windows-msvc name: windows-x86_64 build: build features: default - platform: windows-latest target: aarch64-pc-windows-msvc name: windows-arm64 build: build features: default - platform: macos-latest target: x86_64-apple-darwin name: macos-x86_64 build: build features: default - platform: macos-latest target: aarch64-apple-darwin name: macos-arm64 build: build features: default fail-fast: false runs-on: ${{ matrix.platform }} steps: - name: Checkout uses: actions/checkout@v4 - name: Install dependencies if: matrix.packages != '' run: | sudo apt-get -y update sudo apt-get -y install ${{ matrix.packages }} - name: Install cargo-zigbuild if: matrix.build == 'zigbuild' run: pip install ziglang==0.13.0 cargo-zigbuild==0.19.1 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - name: Setup sccache uses: mozilla-actions/sccache-action@v0.0.9 - name: Cargo build run: > cargo ${{ matrix.build }} --profile ${{ env.BUILD_PROFILE }} --target ${{ matrix.target }} --bin ${{ env.CARGO_BIN_NAME }} --features ${{ matrix.features }} - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ env.CARGO_BIN_NAME }}-${{ matrix.name }} path: | ${{ env.CARGO_TARGET_DIR }}/${{ matrix.target }}/${{ env.BUILD_PROFILE }}/${{ env.CARGO_BIN_NAME }} ${{ env.CARGO_TARGET_DIR }}/${{ matrix.target }}/${{ env.BUILD_PROFILE }}/${{ env.CARGO_BIN_NAME }}.exe if-no-files-found: error build-libs: name: Build libraries strategy: matrix: include: - platform: ubuntu-latest name: linux-x86_64 - platform: windows-latest name: windows-x86_64 - platform: macos-latest name: macos-arm64 fail-fast: false runs-on: ${{ matrix.platform }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Setup sccache uses: mozilla-actions/sccache-action@v0.0.9 - name: Setup MSVC environment uses: ilammy/msvc-dev-cmd@v1 if: startsWith(matrix.platform, 'windows-') - name: Configure run: cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release - name: Build run: cmake --build build --config Release - name: Install run: cmake --install build --prefix install --config Release - name: Package run: tar czf libnod-${{ matrix.name }}.tar.gz -C install . - name: Upload artifact uses: actions/upload-artifact@v4 with: name: libnod-${{ matrix.name }} path: libnod-${{ matrix.name }}.tar.gz archive: false if-no-files-found: error cargo-vendor: name: Vendor Cargo crates if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Setup sccache uses: mozilla-actions/sccache-action@v0.0.9 - name: Install cargo-vendor-filterer run: cargo install --locked cargo-vendor-filterer - name: Generate vendored crates archive shell: bash run: | set -eou pipefail mkdir .cargo cargo vendor-filterer > .cargo/config.toml find .cargo vendor -type f | tar -cavf vendored-crates.tar.zst -T - - name: Upload artifact uses: actions/upload-artifact@v4 with: name: vendored-crates.tar.zst path: vendored-crates.tar.zst archive: false if-no-files-found: error release: name: Release if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest needs: [ build, build-libs, cargo-vendor ] steps: - name: Checkout uses: actions/checkout@v4 - name: Check git tag against Cargo version shell: bash run: | set -eou pipefail tag='${{github.ref}}' tag="${tag#refs/tags/}" version=$(grep '^version' Cargo.toml | head -1 | awk -F' = ' '{print $2}' | tr -d '"') version="v$version" if [ "$tag" != "$version" ]; then echo "::error::Git tag doesn't match the Cargo version! ($tag != $version)" exit 1 fi - name: Download artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Rename artifacts working-directory: artifacts run: | set -euo pipefail mkdir ../out for dir in */; do for file in "$dir"*; do base=$(basename "$file") # .tar.gz files (lib packages) are already named correctly if [[ "$base" == *.tar.gz ]]; then mv "$file" "../out/$base" continue fi if [[ "$base" == *.tar.zst ]]; then name="${base%%.*}" mv "$file" "../out/${name}-${{github.ref_name}}.tar.zst" continue fi name="${base%.*}" ext="${base##*.}" if [ "$ext" = "$base" ]; then ext="" else ext=".$ext" fi arch="${dir%/}" # remove trailing slash arch="${arch##"$name-"}" # remove bin name dst="../out/${name}-${arch}${ext}" mv "$file" "$dst" done done ls -R ../out - name: Release uses: softprops/action-gh-release@v2 with: files: out/* draft: true generate_release_notes: true