如何在hydra上构建NixOps部署
部署我的NixOps机器需要很多时间,因为需要构建包。我想在我信任的私人Hydra实例上定期进行构建 我目前的方法涉及这个如何在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;
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
中的激活脚本创建。