Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix root channels location #8073

Merged
merged 6 commits into from
Mar 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
with:
fetch-depth: 0
- run: echo CACHIX_NAME="$(echo $GITHUB_REPOSITORY-install-tests | tr "[A-Z]/" "[a-z]-")" >> $GITHUB_ENV
- uses: cachix/install-nix-action@v19
- uses: cachix/install-nix-action@v20
with:
install_url: https://releases.nixos.org/nix/nix-2.13.3/install
- uses: cachix/cachix-action@v12
Expand All @@ -79,7 +79,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- run: echo CACHIX_NAME="$(echo $GITHUB_REPOSITORY-install-tests | tr "[A-Z]/" "[a-z]-")" >> $GITHUB_ENV
- uses: cachix/install-nix-action@v19
- uses: cachix/install-nix-action@v20
with:
install_url: '${{needs.installer.outputs.installerURL}}'
install_options: "--tarball-url-prefix https://${{ env.CACHIX_NAME }}.cachix.org/serve"
Expand All @@ -91,6 +91,8 @@ jobs:
- run: exec sh -c "nix-instantiate -E 'builtins.currentTime' --eval"
- run: exec zsh -c "nix-instantiate -E 'builtins.currentTime' --eval"
- run: exec fish -c "nix-instantiate -E 'builtins.currentTime' --eval"
- run: exec bash -c "nix-channel --add https://releases.nixos.org/nixos/unstable/nixos-23.05pre466020.60c1d71f2ba nixpkgs"
- run: exec bash -c "nix-channel --update && nix-env -iA nixpkgs.hello && hello"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this make the test impure (i.e. fetching the latest nixpkgs from the network)?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's currently broken (because there's no channel added by the installer), but yes. The thing is that if we want to test that the installer works fine, this is an important code path to test, and I'm not sure how we can make it more pure. Is there a way to pin a channel to a specific version?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way to pin a channel to a specific version?

So a 5mins investigation shows that nix-channel --add https://releases.nixos.org/nixos/unstable/nixos-23.05pre466020.60c1d71f2ba nixpkgs seems to do the trick. Is that a stable url that we can rely on? And is that an acceptable way of pinning the channels version?

Copy link
Member

@Ericson2314 Ericson2314 Mar 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we we still want this since the "mock channel" test?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rather keep this since the “mock channel” ones don't run on gha. But I'm OK with removing it if that's preferred


docker_push_image:
needs: [check_secrets, tests]
Expand All @@ -104,7 +106,7 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: cachix/install-nix-action@v19
- uses: cachix/install-nix-action@v20
with:
install_url: https://releases.nixos.org/nix/nix-2.13.3/install
- run: echo CACHIX_NAME="$(echo $GITHUB_REPOSITORY-install-tests | tr "[A-Z]/" "[a-z]-")" >> $GITHUB_ENV
Expand Down
5 changes: 3 additions & 2 deletions src/libexpr/eval.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "eval-inline.hh"
#include "filetransfer.hh"
#include "function-trace.hh"
#include "profiles.hh"

#include <algorithm>
#include <chrono>
Expand Down Expand Up @@ -2491,8 +2492,8 @@ Strings EvalSettings::getDefaultNixPath()

if (!evalSettings.restrictEval && !evalSettings.pureEval) {
add(settings.useXDGBaseDirectories ? getStateDir() + "/nix/defexpr/channels" : getHome() + "/.nix-defexpr/channels");
add(settings.nixStateDir + "/profiles/per-user/root/channels/nixpkgs", "nixpkgs");
add(settings.nixStateDir + "/profiles/per-user/root/channels");
add(rootChannelsDir() + "/nixpkgs", "nixpkgs");
add(rootChannelsDir());
}

return res;
Expand Down
30 changes: 25 additions & 5 deletions src/libstore/profiles.cc
Original file line number Diff line number Diff line change
Expand Up @@ -282,28 +282,48 @@ std::string optimisticLockProfile(const Path & profile)

Path profilesDir()
{
auto profileRoot = createNixStateDir() + "/profiles";
auto profileRoot =
(getuid() == 0)
? rootProfilesDir()
: createNixStateDir() + "/profiles";
createDirs(profileRoot);
return profileRoot;
}

Path rootProfilesDir()
{
return settings.nixStateDir + "/profiles/per-user/root";
}


Path getDefaultProfile()
{
Path profileLink = settings.useXDGBaseDirectories ? createNixStateDir() + "/profile" : getHome() + "/.nix-profile";
try {
auto profile =
getuid() == 0
? settings.nixStateDir + "/profiles/default"
: profilesDir() + "/profile";
auto profile = profilesDir() + "/profile";
if (!pathExists(profileLink)) {
replaceSymlink(profile, profileLink);
}
// Backwards compatibiliy measure: Make root's profile available as
// `.../default` as it's what NixOS and most of the init scripts expect
Path globalProfileLink = settings.nixStateDir + "/profiles/default";
if (getuid() == 0 && !pathExists(globalProfileLink)) {
replaceSymlink(profile, globalProfileLink);
}
return absPath(readLink(profileLink), dirOf(profileLink));
} catch (Error &) {
return profileLink;
}
}

Path defaultChannelsDir()
{
return profilesDir() + "/channels";
}

Path rootChannelsDir()
{
return rootProfilesDir() + "/channels";
}

}
29 changes: 24 additions & 5 deletions src/libstore/profiles.hh
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,32 @@ void lockProfile(PathLocks & lock, const Path & profile);
rebuilt. */
std::string optimisticLockProfile(const Path & profile);

/* Creates and returns the path to a directory suitable for storing the user’s
profiles. */
/**
* Create and return the path to a directory suitable for storing the user’s
* profiles.
*/
Path profilesDir();

/* Resolve the default profile (~/.nix-profile by default, $XDG_STATE_HOME/
nix/profile if XDG Base Directory Support is enabled), and create if doesn't
exist */
/**
* Return the path to the profile directory for root (but don't try creating it)
*/
Path rootProfilesDir();

/**
* Create and return the path to the file used for storing the users's channels
*/
Path defaultChannelsDir();

/**
* Return the path to the channel directory for root (but don't try creating it)
*/
Path rootChannelsDir();

/**
* Resolve the default profile (~/.nix-profile by default,
* $XDG_STATE_HOME/nix/profile if XDG Base Directory Support is enabled),
* and create if doesn't exist
*/
Path getDefaultProfile();

}
3 changes: 2 additions & 1 deletion src/nix-channel/nix-channel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,8 @@ static int main_nix_channel(int argc, char ** argv)
nixDefExpr = settings.useXDGBaseDirectories ? createNixStateDir() + "/defexpr" : home + "/.nix-defexpr";

// Figure out the name of the channels profile.
profile = profilesDir() + "/channels";
profile = profilesDir() + "/channels";
createDirs(dirOf(profile));

enum {
cNone,
Expand Down
4 changes: 2 additions & 2 deletions src/nix-env/nix-env.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1403,11 +1403,11 @@ static int main_nix_env(int argc, char * * argv)
try {
createDirs(globals.instSource.nixExprPath);
replaceSymlink(
fmt("%s/profiles/per-user/%s/channels", settings.nixStateDir, getUserName()),
defaultChannelsDir(),
globals.instSource.nixExprPath + "/channels");
if (getuid() != 0)
replaceSymlink(
fmt("%s/profiles/per-user/root/channels", settings.nixStateDir),
rootChannelsDir(),
globals.instSource.nixExprPath + "/channels_root");
} catch (Error &) { }
}
Expand Down
22 changes: 22 additions & 0 deletions tests/installer/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ let
};
};

mockChannel = pkgs:
pkgs.runCommandNoCC "mock-channel" {} ''
mkdir nixexprs
mkdir $out
echo -n 'someContent' > nixexprs/someFile
tar cvf - nixexprs | bzip2 > $out/nixexprs.tar.bz2
'';

disableSELinux = "sudo setenforce 0";

images = {
Expand Down Expand Up @@ -189,6 +197,9 @@ let
echo "Running installer..."
$ssh "set -eux; $installScript"

echo "Copying the mock channel"
scp -r -P 20022 $ssh_opts ${mockChannel pkgs} vagrant@localhost:channel

echo "Testing Nix installation..."
$ssh <<EOF
set -ex
Expand All @@ -204,6 +215,17 @@ let

out=\$(nix-build --no-substitute -E 'derivation { name = "foo"; system = "x86_64-linux"; builder = "/bin/sh"; args = ["-c" "echo foobar > \$out"]; }')
[[ \$(cat \$out) = foobar ]]

if pgrep nix-daemon; then
MAYBESUDO="sudo"
else
MAYBESUDO=""
fi


$MAYBESUDO \$(which nix-channel) --add file://\$HOME/channel myChannel
$MAYBESUDO \$(which nix-channel) --update
[[ \$(nix-instantiate --eval --expr 'builtins.readFile <myChannel/someFile>') = '"someContent"' ]]
EOF

echo "Done!"
Expand Down