diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 070c946..0b032df 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -1,6 +1,6 @@ agents: - queue: "hetzner-linux-medium" - image: "evalops-platform-ci-v3" + queue: "hetzner-linux-heavy" + image: "evalops-platform-ci-v6" env: CI: "true" @@ -22,7 +22,7 @@ steps: limit: 1 command: | set -euo pipefail - cargo fmt --all -- --check + .buildkite/run-with-mise "rust@1.95.0" cargo fmt --all -- --check python3 scripts/test-repository-rules.py python3 scripts/test-deployment-images.py python3 scripts/test-release-readiness.py @@ -42,7 +42,7 @@ steps: limit: 1 agents: queue: "hetzner-linux-heavy" - image: "evalops-platform-ci-v3" + image: "evalops-platform-ci-v6" cache: name: "sandboxwich-tests-${BUILDKITE_PULL_REQUEST}" size: "50g" @@ -95,7 +95,7 @@ steps: exit 1 fi export SANDBOXWICH_TEST_POSTGRES_URL="postgres://postgres:postgres@127.0.0.1:$${host_port}/sandboxwich" - cargo test --workspace --locked + .buildkite/run-with-mise "rust@1.95.0" cargo test --workspace --locked - label: ":lint-roller: Clippy" key: "clippy" @@ -111,12 +111,12 @@ steps: limit: 1 agents: queue: "hetzner-linux-heavy" - image: "evalops-platform-ci-v3" + image: "evalops-platform-ci-v6" cache: name: "sandboxwich-clippy-${BUILDKITE_PULL_REQUEST}" size: "50g" paths: [".buildkite/cache"] - command: cargo clippy --workspace --all-targets --locked -- -D warnings + command: .buildkite/run-with-mise "rust@1.95.0" cargo clippy --workspace --all-targets --locked -- -D warnings - label: ":lock: Dependency audit" key: "audit" @@ -130,8 +130,7 @@ steps: limit: 1 command: | set -euo pipefail - cargo install cargo-audit --locked - cargo audit --ignore RUSTSEC-2023-0071 + .buildkite/run-with-mise "rust@1.95.0" bash -c 'cargo install cargo-audit --locked && cargo audit --ignore RUSTSEC-2023-0071' - label: ":construction: Minimum Rust 1.95" key: "msrv" @@ -147,4 +146,4 @@ steps: name: "sandboxwich-msrv-${BUILDKITE_PULL_REQUEST}" size: "30g" paths: [".buildkite/cache"] - command: cargo check --workspace --all-targets --locked + command: .buildkite/run-with-mise "rust@1.95.0" cargo check --workspace --all-targets --locked diff --git a/.buildkite/run-with-mise b/.buildkite/run-with-mise new file mode 100755 index 0000000..ad3c51d --- /dev/null +++ b/.buildkite/run-with-mise @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ $# -lt 2 ]]; then + echo "usage: $0 '' command [args...]" >&2 + exit 2 +fi + +tool_list="$1" +shift + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" +cd "${repo_root}" + +mise_version="2026.4.24" +mise_sha256="4ecf49b825741e1e3e8ff8c92ee242cf728da951d1b3592ef1c2f080201fa454" +cache_root="${BUILDKITE_BUILD_CHECKOUT_PATH:-${repo_root}}/.buildkite/cache" +runtime_root="${cache_root}/runtime" +mkdir -p "${runtime_root}/bin" "${runtime_root}/mise/data" "${runtime_root}/mise/cache" \ + "${runtime_root}/cargo/bin" "${runtime_root}/rustup" "${cache_root}/tmp" + +export MISE_DATA_DIR="${MISE_DATA_DIR:-${runtime_root}/mise/data}" +export MISE_CACHE_DIR="${MISE_CACHE_DIR:-${runtime_root}/mise/cache}" +export CARGO_HOME="${CARGO_HOME:-${runtime_root}/cargo}" +export RUSTUP_HOME="${RUSTUP_HOME:-${runtime_root}/rustup}" +export RUNNER_TEMP="${RUNNER_TEMP:-${cache_root}/tmp}" +export CARGO_TARGET_DIR="${CARGO_TARGET_DIR:-${cache_root}/cargo-target}" +export npm_config_cache="${npm_config_cache:-${cache_root}/npm}" +export RUSTUP_INIT_SKIP_PATH_CHECK=yes +export MISE_EXEC_AUTO_INSTALL=false +export PATH="${runtime_root}/bin:${CARGO_HOME}/bin:${PATH}" + +mise_bin="${EVALOPS_MISE_BIN:-}" +if [[ -z "${mise_bin}" ]] && command -v mise >/dev/null 2>&1; then + mise_bin="$(command -v mise)" +fi +if [[ -z "${mise_bin}" ]]; then + mise_bin="${runtime_root}/bin/mise" +fi + +if [[ ! -x "${mise_bin}" ]]; then + mise_download="${cache_root}/mise-v${mise_version}-linux-x64" + if ! curl -fsSLo "${mise_download}" --retry 5 --retry-all-errors --retry-delay 3 \ + --connect-timeout 15 \ + "https://github.com/jdx/mise/releases/download/v${mise_version}/mise-v${mise_version}-linux-x64"; then + curl -fsSLo "${mise_download}" --retry 5 --retry-all-errors --retry-delay 3 \ + --connect-timeout 15 \ + "https://mise.jdx.dev/v${mise_version}/mise-v${mise_version}-linux-x64" + fi + printf '%s %s\n' "${mise_sha256}" "${mise_download}" | sha256sum --check --status + install -m 0755 "${mise_download}" "${mise_bin}" +fi + +read -r -a tools <<< "${tool_list}" +for tool in "${tools[@]}"; do + "${mise_bin}" install "${tool}" +done + +if [[ " ${tool_list} " == *" rust@"* ]]; then + "${mise_bin}" exec "${tools[@]}" -- rustup component add rustfmt clippy +fi + +export EVALOPS_MISE_BIN="${mise_bin}" +"${mise_bin}" exec "${tools[@]}" -- "$@" diff --git a/scripts/test-repository-rules.py b/scripts/test-repository-rules.py index 6f3252a..49e301c 100644 --- a/scripts/test-repository-rules.py +++ b/scripts/test-repository-rules.py @@ -39,8 +39,14 @@ def test_buildkite_rust_tests_are_postgres_backed(self) -> None: self.assertIn(marker, pipeline) self.assertIn("docker rm -f", pipeline) - def test_buildkite_heavy_jobs_use_all_connected_capacity(self) -> None: + def test_buildkite_jobs_route_to_the_connected_v6_heavy_pool(self) -> None: pipeline = (ROOT / ".buildkite/pipeline.yml").read_text() + self.assertEqual(pipeline.count('queue: "hetzner-linux-heavy"'), 3) + self.assertEqual(pipeline.count('image: "evalops-platform-ci-v6"'), 3) + self.assertNotIn("hetzner-linux-medium", pipeline) + self.assertNotIn("evalops-platform-ci-v3", pipeline) + self.assertGreaterEqual(pipeline.count('.buildkite/run-with-mise "rust@1.95.0"'), 5) + self.assertTrue((ROOT / ".buildkite/run-with-mise").is_file()) self.assertEqual( pipeline.count('concurrency_group: "hetzner-linux-heavy-workloads"'), 2,