Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在hydra上构建NixOps部署_Nix_Nixos - Fatal编程技术网

如何在hydra上构建NixOps部署

如何在hydra上构建NixOps部署,nix,nixos,Nix,Nixos,部署我的NixOps机器需要很多时间,因为需要构建包。我想在我信任的私人Hydra实例上定期进行构建 我目前的方法涉及这个release.nix文件,但效果不太好 { nixpkgs ? <nixpkgs>, onlySystem ? true, extraModules ? [] }: let nixos = import "${nixpkgs}/nixos"; buildEnv = conf: (nixos { configuration = conf;

部署我的NixOps机器需要很多时间,因为需要构建包。我想在我信任的私人Hydra实例上定期进行构建

我目前的方法涉及这个
release.nix
文件,但效果不太好

{ nixpkgs ? <nixpkgs>, onlySystem ? true, extraModules ? [] }:

let

  nixos = import "${nixpkgs}/nixos";

  buildEnv = conf: (nixos {
    configuration = conf;
  });
  buildTarget = m: let build = buildEnv (buildConf m); in
    if onlySystem then build.system else build.vm;

  buildConf = module: { ... }:
    {
      imports = [ module ] ++ extraModules;
    };

in

{
  machine1 = buildTarget ./machine1/configuration.nix;
  machine2 = buildTarget ./machine2/configuration.nix 
  machine3 = buildTarget ./machine3/configuration.nix 
  machine4 = buildTarget ./machine4/configuration.nix 
}
{nixpkgs?,onlySystem?true,extraModules?[]}
让
nixos=导入“${nixpkgs}/nixos”;
buildEnv=conf:(nixos){
配置=conf;
});
buildTarget=m:让build=buildEnv(buildconfm);在里面
如果只有系统,则build.system else build.vm;
buildConf=模块:{…}:
{
导入=[模块]++外部模块;
};
在里面
{
machine1=buildTarget./machine1/configuration.nix;
machine2=buildTarget./machine2/configuration.nix
machine3=buildTarget./machine3/configuration.nix
machine4=buildTarget./machine4/configuration.nix
}
我不太理解这段代码,因为我是从中复制的

如果我在本地运行
nix build release.nix
,这个构建很好,但是在hydra上我从来没有得到完整的构建。有时构建不会出列(它们只是没有得到构建),有时它们会失败并显示各种错误消息。由于hydra问题没有一个是可复制的(除了我从未得到完整构建这一事实之外),我想知道构建NixOps部署的最佳实践是什么

请注意,我的部署中有
unfree
包。选项
nixpkgs.config.allowUnfree=true在hydra服务器上设置


这不是关于我的hydra失败的问题,而是关于用hydra CI构建NixOps部署的好方法。

据我所知,没有办法让这变得超级简单。您的代码看起来不错,但我的方法略有不同。我只构建了
toplevel
属性,并且以不同的方式构建了NixOS配置

我使用以下方法从Nix内部构建NixOS“安装”:

let
  modules = [ ./configuration.nix ];
  nixosSystem = import (pkgs.path + "/nixos/lib/eval-config.nix") {
      inherit (pkgs) system;
      inherit modules;
    };
in
  nixosSystem.config.system.build.toplevel

什么是
config.system.build.toplevel
?它代表什么?我查看了派生的输出,它是一个目录,似乎包含了很多用于第一阶段引导和第二阶段引导的内容。它被写入
/nix/var/nix/profiles/system
,这也是系统配置的垃圾收集根目录。如果缺少任何东西,它可能会被垃圾收集,因此这很好地表明它将包含系统配置所需的所有内容。因此,它的唯一目的是锚定系统构建的工件,以防止GC垃圾收集它们?没有程序真正从
/nix/var/nix/profiles/system
访问文件。因为这些东西通常放在第一阶段的initrd或init脚本中。我猜
etc
目录也与
/etc
相同?配置文件也可用于还原到该代(
system-$N-link
等)<代码>/etc
及其内容由
toplevel
中的激活脚本创建。