From 37d70c40c5655720eb0c1e044e461019c89d77a0 Mon Sep 17 00:00:00 2001 From: druppy Date: Sat, 24 Oct 2026 21:23:30 +0200 Subject: [PATCH] Add sandbox crate + workflow to test ephemeral podman runners --- .gitea/workflows/sandbox.yml | 39 +++++++ sandbox/Cargo.lock | 214 +++++++++++++++++++++++++++++++++++ sandbox/Cargo.toml | 12 ++ sandbox/src/lib.rs | 49 ++++++++ 4 files changed, 314 insertions(+) create mode 100644 .gitea/workflows/sandbox.yml create mode 100644 sandbox/Cargo.lock create mode 100644 sandbox/Cargo.toml create mode 100644 sandbox/src/lib.rs diff --git a/.gitea/workflows/sandbox.yml b/.gitea/workflows/sandbox.yml new file mode 100644 index 0000000..9163f45 --- /dev/null +++ b/.gitea/workflows/sandbox.yml @@ -0,0 +1,39 @@ +name: Sandbox - ephemeral runner + shared cache +on: + push: + branches: [ci/sandbox] + workflow_dispatch: + +jobs: + cargo: + runs-on: sandbox + defaults: + run: + working-directory: sandbox + steps: + - uses: actions/checkout@v4 + + - name: Where am I? + run: | + echo "runner : ${RUNNER_NAME}" + echo "os : $(grep PRETTY_NAME /etc/os-release | cut -d'"' -f2)" + echo "uid : $(id -u) cgroup: $(head -c 40 /proc/self/cgroup)" + command -v git >/dev/null && echo "git : $(git --version)" + + - name: Toolchain + run: | + command -v cargo >/dev/null || { apt-get update -qq && apt-get install -y -qq --no-install-recommends rustc cargo >/dev/null; } + cargo --version + + - name: Cache cargo deps and target + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + sandbox/target + key: cargo-${{ hashFiles('sandbox/Cargo.lock') }} + restore-keys: cargo- + + - name: Test + run: cargo test 2>&1 | tail -6 diff --git a/sandbox/Cargo.lock b/sandbox/Cargo.lock new file mode 100644 index 0000000..63278e1 --- /dev/null +++ b/sandbox/Cargo.lock @@ -0,0 +1,214 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "ci-sandbox" +version = "0.1.0" +dependencies = [ + "anyhow", + "rand", + "serde", + "serde_json", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "zerocopy" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/sandbox/Cargo.toml b/sandbox/Cargo.toml new file mode 100644 index 0000000..67eac81 --- /dev/null +++ b/sandbox/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "ci-sandbox" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" +anyhow = "1" +rand = "0.8" + +[dev-dependencies] diff --git a/sandbox/src/lib.rs b/sandbox/src/lib.rs new file mode 100644 index 0000000..f61e3ca --- /dev/null +++ b/sandbox/src/lib.rs @@ -0,0 +1,49 @@ +//! Tiny crate used to exercise CI caching: enough deps to make a warm +//! build obviously faster than a cold one. +use anyhow::{bail, Result}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Reading { + pub sensor: String, + pub celsius: f64, +} + +pub fn to_fahrenheit(celsius: f64) -> f64 { + celsius * 9.0 / 5.0 + 32.0 +} + +pub fn parse(json: &str) -> Result { + let r: Reading = serde_json::from_str(json)?; + if r.celsius < -273.15 { + bail!("{} C is below absolute zero", r.celsius); + } + Ok(r) +} + +pub fn jitter(amount: f64) -> f64 { + use rand::Rng; + rand::thread_rng().gen_range(-amount..=amount) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn converts_units() { + assert!((to_fahrenheit(0.0) - 32.0).abs() < 1e-9); + assert!((to_fahrenheit(100.0) - 212.0).abs() < 1e-9); + } + + #[test] + fn parses_reading() { + let r = parse(r#"{"sensor":"attic","celsius":21.5}"#).unwrap(); + assert_eq!(r.sensor, "attic"); + } + + #[test] + fn rejects_impossible_temperature() { + assert!(parse(r#"{"sensor":"x","celsius":-300.0}"#).is_err()); + } +}