nix - 将 nixpkgs 结账传播到 NixOps 机器

标签 nix nixos nixops

我正在 nixpkgs 上维护我的个人更改,我将其用于系统重建(通过 NixOps)和在我的工作站上进行开发(主要通过 nix-shell )。这些更改是基于nixos-17.09重新提交的。 channel 并存储在私有(private) git 服务器上。部署中的所有计算机都具有对该 git 服务器的读取访问权限。

当使用nix-shell时在远程计算机上,我得到源自计算机安装时的旧软件包(在我的例子中为 nixos-17.03 )。

有没有办法获得 nixpkgs 完全相同的修订版哪个用于远程计算机上可用的部署?

最佳答案

您遇到的问题是由于 NixOps 在本地构建然后将闭包复制到远程计算机,因此不会运行 nix-channel --update在远程计算机上,Nix 软件包集合 (nixpkgs) 不会在远程计算机上更新。

诸如nix-env之类的命令和nix-shellnixpkgs $NIX_PATH 指向(或通过 -I 参数提供的任何路径)。

解决方案

解决方案是获取您的 nixpkgs 版本进入远程机器并确保 $NIX_PATH指向它。默认情况下,$NIX_PATH看起来像这样:

nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels

所以我们的想法是让它看起来像这样:

nixpkgs=/nix/store/blah-blah-blah:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels

其中blah-blah-blah是你的nixpkgs Git 存储库已插入 Nix 存储区。以下是如何执行此操作的示例:

let
    # This will point to whatever NIX_PATH states on the local machine,
    # unless overwritten with -I.
    hostNixpkgs = import <nixpkgs> {};

    # Some other nixpkgs from a GitHub repo
    romildo = hostNixpkgs.pkgs.fetchFromGitHub {
         owner = "romildo";
         repo = "nixpkgs";
         rev = "b167ba35987c2e69dc1bb91d5c245a04421ee7ed";
         sha256 = "02d8dfvginz45h2zhq745kynzygnsy760qh7yy152wpfhczag180";
    };
in
{
    network.description = "My NixOS VMs";

    vm0 = { config, lib, pkgs, ... }:
    {
      ...

      # This is really hacky, but it works.
      # I'd prefer to set environment.etc.NIX_PATH, but that's not allowed,
      # because that value is "read-only".
      environment.extraInit = "export NIX_PATH=nixpkgs=${romildo}:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels";
    };
}

它是如何工作的

Nix 创建 /nix/store/BLAH-set-environment除其他外,它还导出一堆环境变量。该文件在所有 shell session 中都可用。 environment.extraInit使您可以将任何您想要的 shell 中性 (sh) 代码附加到此环境中。由于这段任意代码被插入到脚本的末尾,因此可以用来覆盖环境变量,例如 NIX_PATH .

需要注意的是,您必须在部署后重新登录才能使更改生效。但由此产生的NIX_PATH看起来像这样:nixpkgs=/nix/store/mzxkszfv05np2f6rgdi2kwxd937f0sxa-source:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels 。所以在这个例子中,nix-shell将寻找nixpkgs/nix/store/mzxkszfv05np2f6rgdi2kwxd937f0sxa-source .

关于nix - 将 nixpkgs 结账传播到 NixOps 机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47961494/

相关文章:

nix - "active Nix expression"是什么?

nixos - 使用 NixOps 部署静态文件

nix - Nix Php 准备好了吗?

nix - nix-shell '<nixpkgs>' -A gnused 的等效 shell.nix 是什么

rust - nixos:我的自定义包派生在 `cargo build` 上失败

continuous-deployment - 在持续交付工作流程中使用 nix

ssl - nixos etcd.pem (kubernetes)

alias - 如何在 nixos 中设置别名?

travis-ci - Travis-ci 何时支持 NixOS/NixOps?