fix(flake.nix): include dev buildInputs in dogfood nix image (#16325)

This commit is contained in:
Thomas Kosiewski
2025-01-30 17:47:19 +01:00
committed by GitHub
parent 1aee589095
commit 6e2dc6ffd2
3 changed files with 73 additions and 21 deletions
+2 -2
View File
@@ -1,2 +1,2 @@
91e81c240fcf9f72e4c67497b68ba247a3f901147b61736072eb234e03db87b5 flake.nix f41c80bd08bfef063a9cfe907d0ea1f377974ebe011751f64008a3a07a6b152a flake.nix
b43d86368a0d2713d646d57e964dc2ac49744f5e11b6395fabed2d49596c1615 flake.lock 32c441011f1f3054a688c036a85eac5e4c3dbef0f8cfa4ab85acd82da577dc35 flake.lock
+20 -13
View File
@@ -85,7 +85,7 @@
drpc.defaultPackage.${system} drpc.defaultPackage.${system}
formatter formatter
fzf fzf
gcc gcc13
gdk gdk
getopt getopt
gh gh
@@ -174,7 +174,7 @@
name = "coder-${osArch}"; name = "coder-${osArch}";
# Updated with ./scripts/update-flake.sh`. # Updated with ./scripts/update-flake.sh`.
# This should be updated whenever go.mod changes! # This should be updated whenever go.mod changes!
vendorHash = "sha256-hJBNmHz9ZJLS/QTu8w8y1w/Yi45aSoaSeZ//ysllp6c="; vendorHash = "sha256-QjqF+QZ5JKMnqkpNh6ZjrJU2QcSqiT4Dip1KoicwLYc=";
proxyVendor = true; proxyVendor = true;
src = ./.; src = ./.;
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [
@@ -212,10 +212,9 @@
devShells = { devShells = {
default = pkgs.mkShell { default = pkgs.mkShell {
buildInputs = devShellPackages; buildInputs = devShellPackages;
shellHook = ''
export PLAYWRIGHT_BROWSERS_PATH=${pkgs.playwright-driver.browsers} PLAYWRIGHT_BROWSERS_PATH = pkgs.playwright-driver.browsers;
export PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS=true PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS = true;
'';
LOCALE_ARCHIVE = LOCALE_ARCHIVE =
with pkgs; with pkgs;
@@ -239,21 +238,29 @@
aarch64-windows = buildFat "windows_arm64.exe"; aarch64-windows = buildFat "windows_arm64.exe";
} }
// (pkgs.lib.optionalAttrs pkgs.stdenv.isLinux { // (pkgs.lib.optionalAttrs pkgs.stdenv.isLinux {
dev_image = docker.buildNixShellImage { dev_image = docker.buildNixShellImage rec {
name = "codercom/oss-dogfood-nix"; name = "codercom/oss-dogfood-nix";
tag = "latest-${system}"; tag = "latest-${system}";
# (ThomasK33): Workaround for images with too many layers (>64 layers) causing sysbox
# to have issues on dogfood envs.
maxLayers = 32; maxLayers = 32;
uname = "coder";
homeDirectory = "/home/${uname}";
drv = devShells.default.overrideAttrs (oldAttrs: { drv = devShells.default.overrideAttrs (oldAttrs: {
# (ThomasK33): Workaround for images with too many layers (>64 layers) causing sysbox
# to have issues on dogfood envs.
buildInputs = buildInputs =
oldAttrs.buildInputs (with pkgs; [
++ (with pkgs; [ busybox
nix
coreutils coreutils
]); nix
curl.bin # Ensure the actual curl binary is included in the PATH
glibc.bin # Ensure the glibc binaries are included in the PATH
binutils # ld and strings
filebrowser # Ensure that we're not redownloading filebrowser on each launch
])
++ oldAttrs.buildInputs;
}); });
}; };
}); });
+51 -6
View File
@@ -17,6 +17,8 @@
storeDir ? builtins.storeDir, storeDir ? builtins.storeDir,
pigz, pigz,
zstd, zstd,
stdenv,
glibc,
}: }:
let let
inherit (lib) inherit (lib)
@@ -70,6 +72,7 @@ let
command ? null, command ? null,
run ? null, run ? null,
maxLayers ? 100, maxLayers ? 100,
uname ? "nixbld",
}: }:
assert lib.assertMsg (!(drv.drvAttrs.__structuredAttrs or false)) assert lib.assertMsg (!(drv.drvAttrs.__structuredAttrs or false))
"streamNixShellImage: Does not work with the derivation ${drv.name} because it uses __structuredAttrs"; "streamNixShellImage: Does not work with the derivation ${drv.name} because it uses __structuredAttrs";
@@ -83,7 +86,14 @@ let
exec ${lib.escapeShellArg (valueToString drv.drvAttrs.builder)} ${lib.escapeShellArgs (map valueToString drv.drvAttrs.args)} exec ${lib.escapeShellArg (valueToString drv.drvAttrs.builder)} ${lib.escapeShellArgs (map valueToString drv.drvAttrs.args)}
''; '';
staticPath = "${dirOf shell}:${lib.makeBinPath [ builder ]}"; staticPath = "${dirOf shell}:${
lib.makeBinPath (
lib.flatten [
builder
drv.buildInputs
]
)
}";
# https://github.com/NixOS/nix/blob/2.8.0/src/nix-build/nix-build.cc#L493-L526 # https://github.com/NixOS/nix/blob/2.8.0/src/nix-build/nix-build.cc#L493-L526
rcfile = writeText "nix-shell-rc" '' rcfile = writeText "nix-shell-rc" ''
@@ -109,6 +119,15 @@ let
''} ''}
''; '';
nixConfFile = writeText "nix-conf" ''
experimental-features = nix-command flakes
'';
etcNixConf = runCommand "etcd-nix-conf" { } ''
mkdir -p $out/etc/nix/
ln -s ${nixConfFile} $out/etc/nix/nix.conf
'';
# https://github.com/NixOS/nix/blob/2.8.0/src/libstore/globals.hh#L464-L465 # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/globals.hh#L464-L465
sandboxBuildDir = "/build"; sandboxBuildDir = "/build";
@@ -142,6 +161,8 @@ let
# TODO: Make configurable? # TODO: Make configurable?
NIX_BUILD_CORES = "1"; NIX_BUILD_CORES = "1";
# Make sure we get the libraries for C and C++ in.
LD_LIBRARY_PATH = lib.makeLibraryPath [ stdenv.cc.cc ];
} }
// drvEnv // drvEnv
// { // {
@@ -153,10 +174,10 @@ let
TMPDIR = sandboxBuildDir; TMPDIR = sandboxBuildDir;
TEMPDIR = sandboxBuildDir; TEMPDIR = sandboxBuildDir;
TMP = sandboxBuildDir; TMP = sandboxBuildDir;
TEMP = sandboxBuildDir; TEMP = "/tmp";
# https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1015-L1019 # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1015-L1019
PWD = sandboxBuildDir; PWD = homeDirectory;
# https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1071-L1074 # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1071-L1074
# We don't set it here because the output here isn't handled in any special way # We don't set it here because the output here isn't handled in any special way
@@ -172,16 +193,17 @@ let
contents = [ contents = [
binSh binSh
usrBinEnv usrBinEnv
etcNixConf
(fakeNss.override { (fakeNss.override {
# Allows programs to look up the build user's home directory # Allows programs to look up the build user's home directory
# https://github.com/NixOS/nix/blob/ffe155abd36366a870482625543f9bf924a58281/src/libstore/build/local-derivation-goal.cc#L906-L910 # https://github.com/NixOS/nix/blob/ffe155abd36366a870482625543f9bf924a58281/src/libstore/build/local-derivation-goal.cc#L906-L910
# Slightly differs however: We use the passed-in homeDirectory instead of sandboxBuildDir. # Slightly differs however: We use the passed-in homeDirectory instead of sandboxBuildDir.
# We're doing this because it's arguably a bug in Nix that sandboxBuildDir is used here: https://github.com/NixOS/nix/issues/6379 # We're doing this because it's arguably a bug in Nix that sandboxBuildDir is used here: https://github.com/NixOS/nix/issues/6379
extraPasswdLines = [ extraPasswdLines = [
"nixbld:x:${toString uid}:${toString gid}:Build user:${homeDirectory}:/noshell" "${toString uname}:x:${toString uid}:${toString gid}:Build user:${homeDirectory}:${lib.escapeShellArg shell}"
]; ];
extraGroupLines = [ extraGroupLines = [
"nixbld:!:${toString gid}:" "${toString uname}:!:${toString gid}:"
]; ];
}) })
]; ];
@@ -197,6 +219,28 @@ let
# Gives the user control over the build directory # Gives the user control over the build directory
mkdir -p .${sandboxBuildDir} mkdir -p .${sandboxBuildDir}
chown -R ${toString uid}:${toString gid} .${sandboxBuildDir} chown -R ${toString uid}:${toString gid} .${sandboxBuildDir}
mkdir -p .${homeDirectory}
chown -R ${toString uid}:${toString gid} .${homeDirectory}
mkdir -p ./tmp
chown -R ${toString uid}:${toString gid} ./tmp
mkdir -p ./etc/skel
chown -R ${toString uid}:${toString gid} ./etc/skel
# Create traditional /lib or /lib64 as needed.
# For aarch64 (arm64):
if [ -e "${glibc}/lib/ld-linux-aarch64.so.1" ]; then
mkdir -p ./lib
ln -s "${glibc}/lib/ld-linux-aarch64.so.1" ./lib/ld-linux-aarch64.so.1
fi
# For x86_64:
if [ -e "${glibc}/lib64/ld-linux-x86-64.so.2" ]; then
mkdir -p ./lib64
ln -s "${glibc}/lib64/ld-linux-x86-64.so.2" ./lib64/ld-linux-x86-64.so.2
fi
''; '';
# Run this image as the given uid/gid # Run this image as the given uid/gid
@@ -215,11 +259,12 @@ let
shell shell
rcfile rcfile
]; ];
config.WorkingDir = sandboxBuildDir; config.WorkingDir = homeDirectory;
config.Env = lib.mapAttrsToList (name: value: "${name}=${value}") envVars; config.Env = lib.mapAttrsToList (name: value: "${name}=${value}") envVars;
}; };
in in
{ {
inherit streamNixShellImage;
# This function streams a docker image that behaves like a nix-shell for a derivation # This function streams a docker image that behaves like a nix-shell for a derivation
# Docs: doc/build-helpers/images/dockertools.section.md # Docs: doc/build-helpers/images/dockertools.section.md