Combine OVA generation steps

Previously this was done in three derivations (one to build the raw
disk image, one to convert to OVA, one to add a hydra-build-products
file). Now it's done in one step to reduce the amount of copying
to/from S3. In particular, not uploading the raw disk image prevents
us from hitting hydra-queue-runner's size limit of 2 GiB.

Changed files
+38 -54
nixos
+2 -1
nixos/lib/make-disk-image.nix
···
, # Shell code executed after the VM has finished.
postVM ? ""
+
, name ? "nixos-disk-image"
}:
with lib;
pkgs.vmTools.runInLinuxVM (
-
pkgs.runCommand "nixos-disk-image"
+
pkgs.runCommand name
{ preVM =
''
mkdir $out
+29 -28
nixos/modules/virtualisation/virtualbox-image.nix
···
config = {
-
system.build.virtualBoxImage = import ../../lib/make-disk-image.nix {
+
system.build.virtualBoxOVA = import ../../lib/make-disk-image.nix {
+
name = "nixos-ova-${config.system.nixosLabel}-${pkgs.stdenv.system}";
+
inherit pkgs lib config;
partitioned = true;
diskSize = cfg.baseImageSize;
···
postVM =
''
echo "creating VirtualBox disk image..."
-
${pkgs.vmTools.qemu}/bin/qemu-img convert -f raw -O vdi $diskImage $out/disk.vdi
+
${pkgs.vmTools.qemu}/bin/qemu-img convert -f raw -O vdi $diskImage disk.vdi
rm $diskImage
+
+
echo "creating VirtualBox VM..."
+
export HOME=$PWD
+
export PATH=${pkgs.linuxPackages.virtualbox}/bin:$PATH
+
vmName="NixOS ${config.system.nixosLabel} (${pkgs.stdenv.system})"
+
VBoxManage createvm --name "$vmName" --register \
+
--ostype ${if pkgs.stdenv.system == "x86_64-linux" then "Linux26_64" else "Linux26"}
+
VBoxManage modifyvm "$vmName" \
+
--memory 1536 --acpi on --vram 32 \
+
${optionalString (pkgs.stdenv.system == "i686-linux") "--pae on"} \
+
--nictype1 virtio --nic1 nat \
+
--audiocontroller ac97 --audio alsa \
+
--rtcuseutc on \
+
--usb on --mouse usbtablet
+
VBoxManage storagectl "$vmName" --name SATA --add sata --portcount 4 --bootable on --hostiocache on
+
VBoxManage storageattach "$vmName" --storagectl SATA --port 0 --device 0 --type hdd \
+
--medium disk.vdi
+
+
echo "exporting VirtualBox VM..."
+
mkdir -p $out
+
fn="$out/nixos-${config.system.nixosLabel}-${pkgs.stdenv.system}.ova"
+
VBoxManage export "$vmName" --output "$fn"
+
+
mkdir -p $out/nix-support
+
echo "file ova $fn" >> $out/nix-support/hydra-build-products
'';
};
-
-
system.build.virtualBoxOVA = pkgs.runCommand "virtualbox-ova"
-
{ buildInputs = [ pkgs.linuxPackages.virtualbox ];
-
vmName = "NixOS ${config.system.nixosLabel} (${pkgs.stdenv.system})";
-
fileName = "nixos-image-${config.system.nixosLabel}-${pkgs.stdenv.system}.ova";
-
}
-
''
-
echo "creating VirtualBox VM..."
-
export HOME=$PWD
-
VBoxManage createvm --name "$vmName" --register \
-
--ostype ${if pkgs.stdenv.system == "x86_64-linux" then "Linux26_64" else "Linux26"}
-
VBoxManage modifyvm "$vmName" \
-
--memory 1536 --acpi on --vram 32 \
-
${optionalString (pkgs.stdenv.system == "i686-linux") "--pae on"} \
-
--nictype1 virtio --nic1 nat \
-
--audiocontroller ac97 --audio alsa \
-
--rtcuseutc on \
-
--usb on --mouse usbtablet
-
VBoxManage storagectl "$vmName" --name SATA --add sata --portcount 4 --bootable on --hostiocache on
-
VBoxManage storageattach "$vmName" --storagectl SATA --port 0 --device 0 --type hdd \
-
--medium ${config.system.build.virtualBoxImage}/disk.vdi
-
-
echo "exporting VirtualBox VM..."
-
mkdir -p $out
-
VBoxManage export "$vmName" --output "$out/$fileName"
-
'';
fileSystems."/".device = "/dev/disk/by-label/nixos";
+7 -25
nixos/release.nix
···
with import nixpkgs { inherit system; };
-
let
-
-
config = (import lib/eval-config.nix {
-
inherit system;
-
modules =
-
[ versionModule
-
./modules/installer/virtualbox-demo.nix
-
];
-
}).config;
-
-
in
-
# Declare the OVA as a build product so that it shows up in Hydra.
-
hydraJob (runCommand "nixos-ova-${config.system.nixosVersion}-${system}"
-
{ meta = {
-
description = "NixOS VirtualBox appliance (${system})";
-
maintainers = maintainers.eelco;
-
};
-
ova = config.system.build.virtualBoxOVA;
-
preferLocalBuild = true;
-
}
-
''
-
mkdir -p $out/nix-support
-
fn=$(echo $ova/*.ova)
-
echo "file ova $fn" >> $out/nix-support/hydra-build-products
-
'') # */
+
hydraJob ((import lib/eval-config.nix {
+
inherit system;
+
modules =
+
[ versionModule
+
./modules/installer/virtualbox-demo.nix
+
];
+
}).config.system.build.virtualBoxOVA)
);