From f69617e40af6f00fec8464f0428fe0b8e4a6d2fc Mon Sep 17 00:00:00 2001 From: jutty Date: Sat, 20 Jun 2026 03:44:01 -0300 Subject: [PATCH] CI: Build Windows binary in a separate job --- .clippy.toml | 1 + .forgejo/workflows/publish.yaml | 68 +++++++++++++++++++++++++++---- .forgejo/workflows/setup-tools.sh | 30 ++++++++------ .forgejo/workflows/verify.yaml | 17 ++++---- .justfile | 48 +++++++++++++++++----- Cargo.toml | 4 +- 6 files changed, 130 insertions(+), 38 deletions(-) diff --git a/.clippy.toml b/.clippy.toml index ee470c2..b3fd5ee 100644 --- a/.clippy.toml +++ b/.clippy.toml @@ -3,3 +3,4 @@ allow-expect-in-tests = true single-char-binding-names-threshold = 2 upper-case-acronyms-aggressive = true allow-indexing-slicing-in-tests = true +check-incompatible-msrv-in-tests = true diff --git a/.forgejo/workflows/publish.yaml b/.forgejo/workflows/publish.yaml index 8a2a961..66237f2 100644 --- a/.forgejo/workflows/publish.yaml +++ b/.forgejo/workflows/publish.yaml @@ -9,10 +9,21 @@ on: type: boolean required: false default: true + linux: + description: 'Build Linux binaries' + type: boolean + required: false + default: true + windows: + description: 'Build Windows binary' + type: boolean + required: false + default: true jobs: publish: runs-on: docker + if: ${{ inputs.linux }} timeout-minutes: 20 container: image: rust:slim @@ -25,18 +36,17 @@ jobs: with: fetch-tags: true - - name: Setup Rust toolchain + - name: Set up Rust toolchain run: | rustup component add llvm-tools rustup component add --toolchain nightly rustfmt clippy rustup target add x86_64-unknown-linux-gnu rustup target add x86_64-unknown-linux-musl - rustup target add x86_64-pc-windows-msvc - - name: Setup additional tooling + - name: Set up additional tooling run: .forgejo/workflows/setup-tools.sh - - name: Setup CI user + - name: Set up CI user run: | useradd -m ci && chown -R ci:ci . git config --global --add safe.directory "$PWD" @@ -50,9 +60,6 @@ jobs: - name: Build x64 Linux musl release binary run: just release-build-musl - - name: Build x64 Windows MSVC release binary - run: just release-build-msvc - - name: Calculate SHA-256 hashes run: just shasum @@ -78,6 +85,53 @@ jobs: --user jutty:${{ secrets.GJD_REGISTRY_TOKEN }} \ --upload-file target/x86_64-unknown-linux-gnu/release/en $url + publish-windows: + runs-on: docker + if: ${{ inputs.windows }} + timeout-minutes: 20 + container: + image: messense/cargo-xwin + env: + XWIN_CACHE_DIR: /tmp + steps: + - name: Install action dependencies + run: apt-get install --no-install-recommends --update -y nodejs curl git + + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-tags: true + + - name: Set up Rust toolchain + run: | + version=$(cat Cargo.toml | grep '^rust-version' | cut -d \" -f 2) + rustup set auto-self-update disable + rustup toolchain install "$version-x86_64-unknown-linux-gnu" + rustup default "$version-x86_64-unknown-linux-gnu" + rustup target add x86_64-pc-windows-msvc + + - name: Set up additional tooling + run: .forgejo/workflows/setup-tools.sh + + - name: Cache MSVC CRT and SDK + run: cargo-xwin cache xwin + + - name: Set up CI user + run: | + useradd -m ci && chown -R ci:ci . + git config --global --add safe.directory "$PWD" + + - name: Run Windows tests + run: just ci test-windows + + - name: Build x64 Windows MSVC release binary + run: | + rm -v /usr/bin/clang + just release-build-msvc + + - name: Calculate SHA-256 hashes + run: just shasum + - name: Publish x64 Windows MSVC binary to git.jutty.dev registry if: ${{ inputs.upload }} run: | diff --git a/.forgejo/workflows/setup-tools.sh b/.forgejo/workflows/setup-tools.sh index 55f0707..bfa549f 100755 --- a/.forgejo/workflows/setup-tools.sh +++ b/.forgejo/workflows/setup-tools.sh @@ -2,24 +2,30 @@ set -eu +TRIPLE="x86_64-unknown-linux-musl" +TRIPLE_GNU="x86_64-unknown-linux-gnu" + JUST_VERSION="1.51.0" JUST_SHA256SUM="c8f085ca3e885723c341d06243fc291b5abfdc8bbe3b2c076b117de490387b59" + CARGO_LLVM_COV_VERSION="0.6.21" CARGO_LLVM_COV_SHA256SUM="57f491aedf7cdb261538ceb49cbb1ee9d27df7ca205a5e1a009caaf5cb911afb" + CARGO_AUDIT_VERSION="0.22.1" CARGO_AUDIT_TAG="cargo-audit%2Fv$CARGO_AUDIT_VERSION" CARGO_AUDIT_SHA256SUM="1890badd5f15831a9af4b074399fcd21e6f7c0fe42c84e9254cdffc9f813765c" + TAPLO_VERSION="0.10.0" TAPLO_SHA256SUM="8fe196b894ccf9072f98d4e1013a180306e17d244830b03986ee5e8eabeb6156" + TYPOS_VERSION="1.47.2" TYPOS_SHA256SUM="7aef58932fc123b4cf4b40d86468e89a3297d80169051d7cfd13a235e05fc426" + CARGO_DENY_VERSION="0.19.8" CARGO_DENY_SHA256SUM="70e769ae3872e34d45132b17040859175e11401dc12dddb0303e0b8c7d088f3f" -CARGO_XWIN_VERSION="0.23.0" -CARGO_XWIN_SHA256SUM="74a216f64f10ea81c909f02d6b1a84cd0fda8de4c87ee52fe63ba76ab2392b75" -TRIPLE="x86_64-unknown-linux-gnu" -TRIPLE_MUSL="x86_64-unknown-linux-musl" +CARGO_MSRV_VERSION="0.19.3" +CARGO_MSRV_SHA256SUM="6f9a0011ca8ad959d304185b9090390fd1ad87e2d764007fbb0abe043afa9ff5" fetch() { repo="$1" @@ -53,15 +59,15 @@ fetch() { } fetch casey/just "$JUST_VERSION" \ - "just-$JUST_VERSION-$TRIPLE_MUSL.tar.gz" \ + "just-$JUST_VERSION-$TRIPLE.tar.gz" \ "$JUST_SHA256SUM" just fetch taiki-e/cargo-llvm-cov "v$CARGO_LLVM_COV_VERSION" \ - "cargo-llvm-cov-$TRIPLE.tar.gz" \ + "cargo-llvm-cov-$TRIPLE_GNU.tar.gz" \ "$CARGO_LLVM_COV_SHA256SUM" cargo-llvm-cov fetch rustsec/rustsec "$CARGO_AUDIT_TAG" \ - "cargo-audit-$TRIPLE-v$CARGO_AUDIT_VERSION.tgz" \ + "cargo-audit-$TRIPLE_GNU-v$CARGO_AUDIT_VERSION.tgz" \ "$CARGO_AUDIT_SHA256SUM" cargo-audit fetch tamasfe/taplo "$TAPLO_VERSION" \ @@ -69,13 +75,13 @@ fetch tamasfe/taplo "$TAPLO_VERSION" \ "$TAPLO_SHA256SUM" taplo-linux-x86_64 taplo fetch crate-ci/typos "v$TYPOS_VERSION" \ - "typos-v$TYPOS_VERSION-$TRIPLE_MUSL.tar.gz" \ + "typos-v$TYPOS_VERSION-$TRIPLE.tar.gz" \ "$TYPOS_SHA256SUM" typos fetch EmbarkStudios/cargo-deny "$CARGO_DENY_VERSION" \ - cargo-deny-$CARGO_DENY_VERSION-$TRIPLE_MUSL.tar.gz \ + "cargo-deny-$CARGO_DENY_VERSION-$TRIPLE.tar.gz" \ "$CARGO_DENY_SHA256SUM" cargo-deny -fetch rust-cross/cargo-xwin "v$CARGO_XWIN_VERSION" \ - cargo-xwin-v$CARGO_XWIN_VERSION.$TRIPLE_MUSL.tar.gz \ - "$CARGO_XWIN_SHA256SUM" cargo-xwin +fetch foresterre/cargo-msrv "v$CARGO_MSRV_VERSION" \ + "cargo-msrv-$TRIPLE_GNU-v$CARGO_MSRV_VERSION.tgz" \ + "$CARGO_MSRV_SHA256SUM" cargo-msrv diff --git a/.forgejo/workflows/verify.yaml b/.forgejo/workflows/verify.yaml index 82244d8..9ef88ae 100644 --- a/.forgejo/workflows/verify.yaml +++ b/.forgejo/workflows/verify.yaml @@ -4,9 +4,10 @@ on: - '*' paths: - src/** - - tests/** - - static/graph.toml + - static/graph* + - static/welcome.toml - .forgejo/** + - .justfile - Cargo.toml - Cargo.lock @@ -25,22 +26,22 @@ jobs: with: fetch-tags: true - - name: Setup Rust toolchain + - name: Set up Rust toolchain run: | rustup component add llvm-tools rustup component add --toolchain nightly rustfmt clippy rustup target add x86_64-unknown-linux-gnu rustup target add x86_64-unknown-linux-musl - - name: Setup additional tooling + - name: Set up additional tooling run: .forgejo/workflows/setup-tools.sh - - name: Setup CI user + - name: Set up CI user run: | useradd -m ci && chown -R ci:ci . git config --global --add safe.directory "$PWD" - - name: Text matching checks + - name: Text matches run: just ci todos-assess version-assess spell - name: Schema lint run: just ci schema-lint @@ -50,10 +51,12 @@ jobs: run: just ci format-assess - name: Lint run: just ci lint-assess + - name: MSRV + run: just ci msrv-assess - name: Cargo check run: just ci check - name: Test run: just ci test - - name: Assess test coverage + - name: Coverage run: just ci cover-assess diff --git a/.justfile b/.justfile index 6353791..eb5e4e4 100644 --- a/.justfile +++ b/.justfile @@ -72,6 +72,17 @@ assess-run-watch-quick: alias rq := assess-run-watch-quick +# Determine the Minimum Supported Rust Version +[group: 'develop'] +msrv-find: + @{{ make_msrv("find", musl_target) }} + @{{ make_msrv("find", glibc_target) }} + @{{ make_msrv("find", msvc_target) }} + +make_msrv(command, target) := f"printf '{{ target }}: '; " + \ + f"cargo msrv {{ command }} --target {{ target }} --output-format minimal " \ + + f"-- {{ maybe_xwin(target) }} build --ignore-rust-version" + [private] test-cover-quick: {{ cover_cmd }} --no-report -- --test 'serial_tests::' --test-threads 1 @@ -321,6 +332,8 @@ test-windows pattern="": -{{ xwin_test(pattern) }} --timings --doc -{{ xwin_test(pattern) }} --timings --lib -- --skip 'serial_tests::' +xwin_test(pattern) := f"cargo-xwin test {{ pattern }} --target {{ msvc_target }}" + # Run tests with unfiltered output [group: 'assess'] test-output pattern="": @@ -361,7 +374,7 @@ verify: fi {{ just_cmd }} \ todos-assess version-assess spell schema-lint deny \ - format-assess lint-assess check \ + format-assess lint-assess msrv-assess check \ test "" cover-assess alias v := verify @@ -387,6 +400,15 @@ version-assess remote="false": update alias va := version-assess +# Assess if the current Minimum Supported Rust Version is accurate +[group: 'assess'] +msrv-assess: + {{ make_msrv("verify", musl_target) }} + {{ make_msrv("verify", glibc_target) }} + if rustup toolchain list | grep -q {{ msvc_target }}; then \ + {{ make_msrv("verify", msvc_target) }}; \ + fi + # Find TODOs [group: 'assess'] todos-assess: @@ -448,6 +470,9 @@ release-build target=default_target: --timings --target {{ target }} --locked --release du -h target/{{ target }}/release/{{ with_suffix("en", target) }} +maybe_xwin(target) := if target == msvc_target { "cargo-xwin" } else { "cargo" } +with_suffix(file, target) := if target == msvc_target { f"{{ file }}.exe" } else { file } + alias rb := release-build # glibc release build @@ -473,10 +498,18 @@ alias rbw := release-build-msvc # Calculate SHA 256 hashes for release binaries [group: 'build'] +[script] shasum: - find target -type d -name 'release' \ - -exec find '{}' -maxdepth 1 -type f -name en -executable ';' \ - | xargs sha256sum + binaries=$(find target -type d -name 'release' \ + -exec find '{}' -maxdepth 1 -type f \ + -regex '.*/en\(\.exe\)?$' -executable ';' \ + ) + if [ -n "$binaries" ]; then + printf '%s\n' "$binaries" | xargs sha256sum + else + echo "Can't generate SHA-256 hashes: No release binaries found" + exit 1 + fi ## META [default, private] @@ -501,7 +534,7 @@ msvc_target := "x86_64-pc-windows-msvc" default_target := musl_target debug_vars := 'DEBUG=${DEBUG:-} DEBUG_FILTER=${DEBUG_FILTER:-} RUST_BACKTRACE=${RUST_BACKTRACE:-} RUSTFLAGS=${RUSTFLAGS:-}' -just_cmd := 'just --timestamp --explain --command-color green' +just_cmd := 'just --timestamp --command-color green' just_cmd_no_ts := 'just --explain --command-color green' watch_cmd := "watchexec -qc -r -e rs,toml,html,css --color always -- " cover_cmd := 'cargo llvm-cov --color always --ignore-filename-regex "main\.rs|log\.rs"' @@ -513,11 +546,6 @@ lockfile_version := ``` | grep version | cut -d '"' -f 2 ``` -## FUNCTIONS -with_suffix(file, target) := if target == msvc_target { f"{{ file }}.exe" } else { file } -maybe_xwin(target) := if target == msvc_target { "cargo-xwin" } else { "cargo" } -xwin_test(pattern) := f"cargo-xwin test {{ pattern }} --target {{ msvc_target }}" - ## OPTIONS set unstable set lazy diff --git a/Cargo.toml b/Cargo.toml index 833205b..a99994e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://en.jutty.dev" documentation = "https://en.jutty.dev/node/Documentation" edition = "2024" -rust-version= "1.94.0" +rust-version= "1.91.1" [features] serial-tests = [] @@ -96,7 +96,6 @@ float_cmp_const = "warn" fn_to_numeric_cast_any = "warn" format_collect = "warn" format_push_string = "warn" -from_iter_instead_of_collect = "warn" get_unwrap = "warn" if_not_else = "warn" if_then_some_else_none = "warn" @@ -105,6 +104,7 @@ ignored_unit_patterns = "warn" implicit_clone = "warn" implicit_hasher = "warn" imprecise_flops = "warn" +incompatible_msrv = "warn" inconsistent_struct_constructor = "warn" index_refutable_slice = "warn" indexing_slicing = "warn"