Как построить развертывание NixOps на Hydra
Развертывание моих машин 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
}
Я не очень понимаю этот код, поскольку я скопировал его отсюда.
Это хорошо работает, если я бегу nix-build release.nix
локально, но на гидре я никогда не получаю полную сборку. Иногда сборки не снимаются с очереди (они просто не получают сборку), иногда они терпят неудачу с различными сообщениями об ошибках. Поскольку ничто из проблем с гидрой не воспроизводимо (помимо того факта, что я никогда не получаю полную сборку), мне интересно, каков наилучший способ построения развертывания NixOps.
Обратите внимание, что у меня есть unfree
пакеты в моем развертывании. Опция nixpkgs.config.allowUnfree = true;
установлен на сервере гидра.
Дело не в моих сбоях в работе гидры, а в том, что было бы хорошим способом построить развертывание NixOps с помощью Hydra CI.
1 ответ
Насколько я знаю, нет никакого способа сделать это супер легко. Ваш код выглядит нормально, но мой метод немного другой. Я только строю toplevel
атрибут и я строю конфигурацию NixOS по-разному.
Я строю 'установки' NixOS изнутри Nix, используя что-то вроде:
let
modules = [ ./configuration.nix ];
nixosSystem = import (pkgs.path + "/nixos/lib/eval-config.nix") {
inherit (pkgs) system;
inherit modules;
};
in
nixosSystem.config.system.build.toplevel