diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bd53c4a22..83196b8aa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -66,6 +66,10 @@ jobs: sudo apt-get update sudo apt-get install -y build-essential pkg-config libssl-dev + - name: Install musl toolchain for x86_64-musl tests + if: matrix.target == 'x86_64-unknown-linux-musl' + run: sudo apt-get install -y musl-tools + - name: Set up Rust uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable with: @@ -85,11 +89,20 @@ jobs: - uses: taiki-e/install-action@773334c0e05d7e699e4d78234494308223f3a2cf # nextest + - name: Test (x86_64-musl) + # nextest still shells through cargo test for this target, so + # build.rs C code needs an explicit musl compiler/linker. + if: matrix.target == 'x86_64-unknown-linux-musl' + env: + CC_x86_64_unknown_linux_musl: musl-gcc + CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER: musl-gcc + run: cargo nextest run --workspace --target ${{ matrix.target }} --release --status-level slow --profile ci + - name: Test # aarch64-musl test runs have not been validated on the compile # runner yet; shipping binary is exercised via Docker smoke tests. # Re-enable after verifying the workspace passes on this target. - if: matrix.target != 'aarch64-unknown-linux-musl' + if: matrix.target != 'aarch64-unknown-linux-musl' && matrix.target != 'x86_64-unknown-linux-musl' run: cargo nextest run --workspace --target ${{ matrix.target }} --release --status-level slow --profile ci - name: Build (musl via cargo-zigbuild) diff --git a/Cargo.lock b/Cargo.lock index 6f2dfec48..260a05a23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1473,7 +1473,7 @@ dependencies = [ [[package]] name = "fabro-agent" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "async-trait", @@ -1509,7 +1509,7 @@ dependencies = [ [[package]] name = "fabro-api" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "chrono", "openapiv3", @@ -1527,7 +1527,7 @@ dependencies = [ [[package]] name = "fabro-auth" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "async-trait", @@ -1548,7 +1548,7 @@ dependencies = [ [[package]] name = "fabro-checkpoint" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "chrono", "fabro-types", @@ -1562,7 +1562,7 @@ dependencies = [ [[package]] name = "fabro-cli" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "assert_cmd", @@ -1647,7 +1647,7 @@ dependencies = [ [[package]] name = "fabro-config" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "chrono", @@ -1668,7 +1668,7 @@ dependencies = [ [[package]] name = "fabro-core" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "async-trait", "fabro-types", @@ -1683,7 +1683,7 @@ dependencies = [ [[package]] name = "fabro-devcontainer" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "fabro-http", "fabro-util", @@ -1699,7 +1699,7 @@ dependencies = [ [[package]] name = "fabro-github" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "base64", "chrono", @@ -1715,7 +1715,7 @@ dependencies = [ [[package]] name = "fabro-graphviz" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "fabro-types", @@ -1728,7 +1728,7 @@ dependencies = [ [[package]] name = "fabro-hooks" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "async-trait", "fabro-agent", @@ -1751,7 +1751,7 @@ dependencies = [ [[package]] name = "fabro-http" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "http", "reqwest 0.13.2", @@ -1760,7 +1760,7 @@ dependencies = [ [[package]] name = "fabro-interview" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "async-trait", "dialoguer", @@ -1774,7 +1774,7 @@ dependencies = [ [[package]] name = "fabro-llm" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "async-trait", @@ -1803,7 +1803,7 @@ dependencies = [ [[package]] name = "fabro-macros" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "proc-macro2", "quote", @@ -1812,7 +1812,7 @@ dependencies = [ [[package]] name = "fabro-mcp" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "fabro-config", @@ -1828,7 +1828,7 @@ dependencies = [ [[package]] name = "fabro-model" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "insta", "serde", @@ -1837,7 +1837,7 @@ dependencies = [ [[package]] name = "fabro-oauth" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "axum", "base64", @@ -1855,7 +1855,7 @@ dependencies = [ [[package]] name = "fabro-proc" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "cc", "libc", @@ -1864,7 +1864,7 @@ dependencies = [ [[package]] name = "fabro-retro" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "chrono", @@ -1882,7 +1882,7 @@ dependencies = [ [[package]] name = "fabro-sandbox" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "async-trait", @@ -1913,7 +1913,7 @@ dependencies = [ [[package]] name = "fabro-server" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "axum", @@ -1979,7 +1979,7 @@ dependencies = [ [[package]] name = "fabro-slack" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "fabro-http", "fabro-interview", @@ -1998,14 +1998,14 @@ dependencies = [ [[package]] name = "fabro-spa" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "rust-embed", ] [[package]] name = "fabro-store" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "async-trait", "bytes", @@ -2027,7 +2027,7 @@ dependencies = [ [[package]] name = "fabro-telemetry" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "base64", @@ -2052,7 +2052,7 @@ dependencies = [ [[package]] name = "fabro-template" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "fabro-util", @@ -2064,7 +2064,7 @@ dependencies = [ [[package]] name = "fabro-test" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "assert_cmd", "axum", @@ -2085,7 +2085,7 @@ dependencies = [ [[package]] name = "fabro-tracker" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "async-trait", "fabro-github", @@ -2098,7 +2098,7 @@ dependencies = [ [[package]] name = "fabro-types" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "chrono", "clap", @@ -2118,7 +2118,7 @@ dependencies = [ [[package]] name = "fabro-util" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "aho-corasick", "anyhow", @@ -2139,7 +2139,7 @@ dependencies = [ [[package]] name = "fabro-validate" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "fabro-graphviz", "fabro-model", @@ -2149,7 +2149,7 @@ dependencies = [ [[package]] name = "fabro-vault" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "chrono", "serde", @@ -2160,7 +2160,7 @@ dependencies = [ [[package]] name = "fabro-workflow" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "assert_cmd", @@ -6750,7 +6750,7 @@ dependencies = [ [[package]] name = "twin-github" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "axum", "base64", @@ -6768,7 +6768,7 @@ dependencies = [ [[package]] name = "twin-openai" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 62d8cb2c8..58d237d59 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ resolver = "2" [workspace.package] edition = "2021" -version = "0.208.0-nightly.0" +version = "0.208.0-nightly.1" license = "MIT" [workspace.dependencies] diff --git a/lib/crates/fabro-config/src/storage.rs b/lib/crates/fabro-config/src/storage.rs index 0aad99eab..dc0a4f2a5 100644 --- a/lib/crates/fabro-config/src/storage.rs +++ b/lib/crates/fabro-config/src/storage.rs @@ -34,6 +34,11 @@ impl Storage { self.root.join("logs") } + #[must_use] + pub fn cache_dir(&self) -> PathBuf { + self.root.join("cache") + } + #[must_use] pub fn secrets_path(&self) -> PathBuf { self.root @@ -164,6 +169,10 @@ mod tests { storage.logs_dir(), std::path::Path::new("/tmp/fabro-data/logs") ); + assert_eq!( + storage.cache_dir(), + std::path::Path::new("/tmp/fabro-data/cache") + ); assert_eq!( storage.secrets_path(), std::path::Path::new("/tmp/fabro-data/vaults/default/secrets.json") diff --git a/lib/crates/fabro-server/src/ip_allowlist.rs b/lib/crates/fabro-server/src/ip_allowlist.rs index aaa7ce4d2..0d8f0956b 100644 --- a/lib/crates/fabro-server/src/ip_allowlist.rs +++ b/lib/crates/fabro-server/src/ip_allowlist.rs @@ -10,7 +10,6 @@ use axum::response::{IntoResponse, Response}; use fabro_types::settings::server::{ IpAllowEntry, ServerIpAllowlistOverrideSettings, ServerIpAllowlistSettings, }; -use fabro_util::Home; use ipnet::IpNet; use serde::{Deserialize, Serialize}; use tracing::warn; @@ -61,11 +60,11 @@ impl GitHubMetaResolver { } } - pub fn from_home() -> Result { + pub fn from_cache_dir(cache_dir: &Path) -> Result { Ok(Self::new( fabro_http::http_client().context("building GitHub meta HTTP client")?, GITHUB_META_URL.to_string(), - github_meta_cache_path(Home::from_env().root()), + github_meta_cache_path(cache_dir), )) } @@ -315,8 +314,8 @@ fn normalize_ip(ip: IpAddr) -> IpAddr { } } -pub fn github_meta_cache_path(home: &Path) -> PathBuf { - home.join("cache/github-meta-hooks.json") +pub fn github_meta_cache_path(cache_dir: &Path) -> PathBuf { + cache_dir.join("github-meta-hooks.json") } #[cfg(test)] @@ -408,6 +407,17 @@ mod tests { assert!(allowlist.contains(&"::ffff:10.1.2.3".parse().unwrap())); } + #[test] + fn github_meta_resolver_uses_storage_cache_dir() { + let cache_dir = tempfile::tempdir().unwrap(); + let resolver = GitHubMetaResolver::from_cache_dir(cache_dir.path()).unwrap(); + + assert_eq!( + resolver.cache_path, + cache_dir.path().join("github-meta-hooks.json") + ); + } + #[tokio::test] async fn resolve_ip_allowlist_config_expands_github_meta_hooks() { let mock_server = MockServer::start_async().await; diff --git a/lib/crates/fabro-server/src/serve.rs b/lib/crates/fabro-server/src/serve.rs index 363cb6e2e..5aa1effae 100644 --- a/lib/crates/fabro-server/src/serve.rs +++ b/lib/crates/fabro-server/src/serve.rs @@ -349,7 +349,7 @@ where (auth_mode, max_concurrent_runs) }; let web_enabled = router_web_enabled(&resolved_server_settings); - let github_meta_resolver = GitHubMetaResolver::from_home()?; + let github_meta_resolver = GitHubMetaResolver::from_cache_dir(&storage.cache_dir())?; let (object_store, slatedb_prefix, flush_interval, disk_cache) = build_slatedb_store(&resolved_server_settings)?;