From 5cc7bcda3023b01bd926eccd0c5f095a050c5ab0 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 15 Mar 2016 13:34:41 +0100 Subject: [PATCH] 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. --- nixos/lib/make-disk-image.nix | 3 +- .../virtualisation/virtualbox-image.nix | 57 ++++++++++--------- nixos/release.nix | 32 +++-------- 3 files changed, 38 insertions(+), 54 deletions(-) diff --git a/nixos/lib/make-disk-image.nix b/nixos/lib/make-disk-image.nix index 62728c8ac76..7387bf14738 100644 --- a/nixos/lib/make-disk-image.nix +++ b/nixos/lib/make-disk-image.nix @@ -22,12 +22,13 @@ , # 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 diff --git a/nixos/modules/virtualisation/virtualbox-image.nix b/nixos/modules/virtualisation/virtualbox-image.nix index da9e75a003a..fab59b2525a 100644 --- a/nixos/modules/virtualisation/virtualbox-image.nix +++ b/nixos/modules/virtualisation/virtualbox-image.nix @@ -22,7 +22,9 @@ in { 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; @@ -37,37 +39,36 @@ in { 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"; boot.loader.grub.device = "/dev/sda"; diff --git a/nixos/release.nix b/nixos/release.nix index 101f68a43f7..b697ba4c503 100644 --- a/nixos/release.nix +++ b/nixos/release.nix @@ -150,31 +150,13 @@ in rec { 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) );