@@ -387,6 +387,10 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
with:
|
||||
clean: false
|
||||
- name: steps::cache_nix_dependencies_namespace
|
||||
uses: namespacelabs/nscloud-cache-action@v1
|
||||
with:
|
||||
cache: nix
|
||||
- name: nix_build::build_nix::install_nix
|
||||
uses: cachix/install-nix-action@02a151ada4993995686f9ed4f1be7cfbb229e56f
|
||||
with:
|
||||
@@ -417,10 +421,20 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
with:
|
||||
clean: false
|
||||
- name: steps::cache_nix_store_macos
|
||||
uses: namespacelabs/nscloud-cache-action@v1
|
||||
with:
|
||||
path: ~/nix-cache
|
||||
- name: nix_build::build_nix::install_nix
|
||||
uses: cachix/install-nix-action@02a151ada4993995686f9ed4f1be7cfbb229e56f
|
||||
with:
|
||||
github_access_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: nix_build::build_nix::configure_local_nix_cache
|
||||
run: |
|
||||
mkdir -p ~/nix-cache
|
||||
echo "extra-substituters = file://$HOME/nix-cache?priority=10" | sudo tee -a /etc/nix/nix.conf
|
||||
echo "require-sigs = false" | sudo tee -a /etc/nix/nix.conf
|
||||
sudo launchctl kickstart -k system/org.nixos.nix-daemon
|
||||
- name: nix_build::build_nix::cachix_action
|
||||
uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad
|
||||
with:
|
||||
@@ -429,6 +443,15 @@ jobs:
|
||||
cachixArgs: -v
|
||||
- name: nix_build::build_nix::build
|
||||
run: nix build .#default -L --accept-flake-config
|
||||
- name: nix_build::build_nix::export_to_local_nix_cache
|
||||
if: always()
|
||||
run: |
|
||||
if [ -L result ]; then
|
||||
echo "Copying build closure to local binary cache..."
|
||||
nix copy --to "file://$HOME/nix-cache" ./result || echo "Warning: nix copy to local cache failed"
|
||||
else
|
||||
echo "No build result found, skipping cache export."
|
||||
fi
|
||||
timeout-minutes: 60
|
||||
continue-on-error: true
|
||||
update_nightly_tag:
|
||||
|
||||
@@ -478,6 +478,10 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
with:
|
||||
clean: false
|
||||
- name: steps::cache_nix_dependencies_namespace
|
||||
uses: namespacelabs/nscloud-cache-action@v1
|
||||
with:
|
||||
cache: nix
|
||||
- name: nix_build::build_nix::install_nix
|
||||
uses: cachix/install-nix-action@02a151ada4993995686f9ed4f1be7cfbb229e56f
|
||||
with:
|
||||
@@ -508,10 +512,20 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
with:
|
||||
clean: false
|
||||
- name: steps::cache_nix_store_macos
|
||||
uses: namespacelabs/nscloud-cache-action@v1
|
||||
with:
|
||||
path: ~/nix-cache
|
||||
- name: nix_build::build_nix::install_nix
|
||||
uses: cachix/install-nix-action@02a151ada4993995686f9ed4f1be7cfbb229e56f
|
||||
with:
|
||||
github_access_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: nix_build::build_nix::configure_local_nix_cache
|
||||
run: |
|
||||
mkdir -p ~/nix-cache
|
||||
echo "extra-substituters = file://$HOME/nix-cache?priority=10" | sudo tee -a /etc/nix/nix.conf
|
||||
echo "require-sigs = false" | sudo tee -a /etc/nix/nix.conf
|
||||
sudo launchctl kickstart -k system/org.nixos.nix-daemon
|
||||
- name: nix_build::build_nix::cachix_action
|
||||
uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad
|
||||
with:
|
||||
@@ -521,6 +535,15 @@ jobs:
|
||||
pushFilter: -zed-editor-[0-9.]*-nightly
|
||||
- name: nix_build::build_nix::build
|
||||
run: nix build .#debug -L --accept-flake-config
|
||||
- name: nix_build::build_nix::export_to_local_nix_cache
|
||||
if: always()
|
||||
run: |
|
||||
if [ -L result ]; then
|
||||
echo "Copying build closure to local binary cache..."
|
||||
nix copy --to "file://$HOME/nix-cache" ./result || echo "Warning: nix copy to local cache failed"
|
||||
else
|
||||
echo "No build result found, skipping cache export."
|
||||
fi
|
||||
timeout-minutes: 60
|
||||
continue-on-error: true
|
||||
check_postgres_and_protobuf_migrations:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
description = "High-performance, multiplayer code editor from the creators of Atom and Tree-sitter";
|
||||
description = "Zed is a minimal code editor crafted for speed and collaboration with humans and AI.";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
|
||||
@@ -44,6 +44,32 @@ pub(crate) fn build_nix(
|
||||
))
|
||||
}
|
||||
|
||||
// After install-nix, register ~/nix-cache as a local binary cache
|
||||
// substituter so nix pulls from it on demand during builds (no bulk
|
||||
// import). Also restart the daemon so it picks up the new config.
|
||||
pub fn configure_local_nix_cache() -> Step<Run> {
|
||||
named::bash(indoc::indoc! {r#"
|
||||
mkdir -p ~/nix-cache
|
||||
echo "extra-substituters = file://$HOME/nix-cache?priority=10" | sudo tee -a /etc/nix/nix.conf
|
||||
echo "require-sigs = false" | sudo tee -a /etc/nix/nix.conf
|
||||
sudo launchctl kickstart -k system/org.nixos.nix-daemon
|
||||
"#})
|
||||
}
|
||||
|
||||
// Incrementally copy only new store paths from the build result's
|
||||
// closure into the local binary cache for the next run.
|
||||
pub fn export_to_local_nix_cache() -> Step<Run> {
|
||||
named::bash(indoc::indoc! {r#"
|
||||
if [ -L result ]; then
|
||||
echo "Copying build closure to local binary cache..."
|
||||
nix copy --to "file://$HOME/nix-cache" ./result || echo "Warning: nix copy to local cache failed"
|
||||
else
|
||||
echo "No build result found, skipping cache export."
|
||||
fi
|
||||
"#})
|
||||
.if_condition(Expression::new("always()"))
|
||||
}
|
||||
|
||||
let runner = match platform {
|
||||
Platform::Windows => unimplemented!(),
|
||||
Platform::Linux => runners::LINUX_X86_BUNDLER,
|
||||
@@ -67,10 +93,30 @@ pub(crate) fn build_nix(
|
||||
job = job.needs(deps.iter().map(|d| d.name.clone()).collect::<Vec<String>>());
|
||||
}
|
||||
|
||||
job = job
|
||||
.add_step(install_nix())
|
||||
.add_step(cachix_action(cachix_filter))
|
||||
.add_step(build(&flake_output));
|
||||
// On Linux, `cache: nix` uses bind-mounts so the /nix store is available
|
||||
// before install-nix-action runs — no extra steps needed.
|
||||
//
|
||||
// On macOS, `/nix` lives on a read-only root filesystem and the nscloud
|
||||
// cache action cannot mount or symlink there. Instead we cache a
|
||||
// user-writable directory (~/nix-cache) as a local binary cache and
|
||||
// register it as a nix substituter. Nix then pulls paths from it on
|
||||
// demand during builds (zero-copy at startup), and after building we
|
||||
// incrementally copy new paths into the cache for the next run.
|
||||
job = match platform {
|
||||
Platform::Linux => job
|
||||
.add_step(steps::cache_nix_dependencies_namespace())
|
||||
.add_step(install_nix())
|
||||
.add_step(cachix_action(cachix_filter))
|
||||
.add_step(build(&flake_output)),
|
||||
Platform::Mac => job
|
||||
.add_step(steps::cache_nix_store_macos())
|
||||
.add_step(install_nix())
|
||||
.add_step(configure_local_nix_cache())
|
||||
.add_step(cachix_action(cachix_filter))
|
||||
.add_step(build(&flake_output))
|
||||
.add_step(export_to_local_nix_cache()),
|
||||
Platform::Windows => unimplemented!(),
|
||||
};
|
||||
|
||||
NamedJob {
|
||||
name: format!("build_nix_{platform}_{arch}"),
|
||||
|
||||
@@ -138,6 +138,17 @@ pub fn cache_rust_dependencies_namespace() -> Step<Use> {
|
||||
.add_with(("path", "~/.rustup"))
|
||||
}
|
||||
|
||||
pub fn cache_nix_dependencies_namespace() -> Step<Use> {
|
||||
named::uses("namespacelabs", "nscloud-cache-action", "v1").add_with(("cache", "nix"))
|
||||
}
|
||||
|
||||
pub fn cache_nix_store_macos() -> Step<Use> {
|
||||
// On macOS, `/nix` is on a read-only root filesystem so nscloud's `cache: nix`
|
||||
// cannot mount or symlink there. Instead we cache a user-writable directory and
|
||||
// use nix-store --import/--export in separate steps to transfer store paths.
|
||||
named::uses("namespacelabs", "nscloud-cache-action", "v1").add_with(("path", "~/nix-cache"))
|
||||
}
|
||||
|
||||
pub fn setup_linux() -> Step<Run> {
|
||||
named::bash("./script/linux")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user