From 0e6bb4e898f14af1b476c07cd1da65f4cccc3ee1 Mon Sep 17 00:00:00 2001 From: Joey Hewitt Date: Mon, 1 Jul 2019 11:32:30 -0600 Subject: [PATCH] workaround GitLab CI KVM issue Their CI environment currently doesn't have KVM. This commit should be reverted when/if they do, for much better CI speed. You can still run tests locally on your KVM-enabled machine as documented on the wiki. Workaround on GitLab is several pieces (injected through .gitlab-ci.yml): - Make a /dev/kvm file so that nix thinks we have "kvm" system feature and proceeds with executing the tests. - Inject a QEMU package that replaces qemu-kvm with a full emulator. - Monkey-patch the test script to wait longer for the VM to boot, since it's slow on full emulation. 1200 seconds, double the previous value. The patch method is not bulletproof, but better than maintaining forks of nixpkgs. - Set systemd's DefaultTimeoutStartSec=15min, so nix's "backdoor" test service doesn't time out on the slow boot. --- .gitlab-ci.yml | 18 ++++++++++++------ tests/lib/config.nix | 8 ++++++++ tests/lib/pkgs.nokvm.nix | 31 +++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 tests/lib/pkgs.nokvm.nix diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2e5b6aa..ac6f54b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,41 +1,47 @@ +before_script: + # report CPU info so we can monitor if real KVM becomes available. create /dev/kvm to fool nix + - cat /proc/cpuinfo + - ls -l /dev/kvm || true + - touch /dev/kvm + nixos-intern: image: nixos/nix variables: NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz" script: - - nix-build tests/intern.nix + - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/intern.nix nixos-extern: image: nixos/nix variables: NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz" script: - - nix-build tests/extern.nix + - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/extern.nix nixos-clamav: image: nixos/nix variables: NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz" script: - - nix-build tests/clamav.nix + - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/clamav.nix nixos-unstable-intern: image: nixos/nix variables: NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz" script: - - nix-build tests/intern.nix + - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/intern.nix nixos-unstable-extern: image: nixos/nix variables: NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz" script: - - nix-build tests/extern.nix + - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/extern.nix nixos-unstable-clamav: image: nixos/nix variables: NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz" script: - - nix-build tests/clamav.nix + - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/clamav.nix diff --git a/tests/lib/config.nix b/tests/lib/config.nix index 1d56ad1..b247c66 100644 --- a/tests/lib/config.nix +++ b/tests/lib/config.nix @@ -1,3 +1,11 @@ { security.dhparams.defaultBitSize = 16; # really low for quicker tests + + # For slow non-kvm tests. + # nixos/modules/testing/test-instrumentation.nix also sets this. I don't know if there's a better way than etc to override theirs. + environment.etc."systemd/system.conf.d/bigdefaulttimeout.conf".text = '' + [Manager] + # Allow extremely slow start (default for test-VMs is 5 minutes) + DefaultTimeoutStartSec=15min + ''; } diff --git a/tests/lib/pkgs.nokvm.nix b/tests/lib/pkgs.nokvm.nix new file mode 100644 index 0000000..fa13fde --- /dev/null +++ b/tests/lib/pkgs.nokvm.nix @@ -0,0 +1,31 @@ +let + pkgs = (import { system = builtins.currentSystem; config = {}; }); + patchedMachinePM = pkgs.writeTextFile { + name = "Machine.pm.patched-to-wait-longer-for-vm"; + text = builtins.replaceStrings ["alarm 600;"] ["alarm 1200;"] (builtins.readFile (+"/nixos/lib/test-driver/Machine.pm")); + }; +in +(pkgs // { + qemu_test = with pkgs; stdenv.mkDerivation { + name = "qemu_test_no_kvm"; + buildInputs = [ coreutils qemu_test ]; + inherit qemu_test; + inherit coreutils; + builder = builtins.toFile "builder.sh" '' + PATH=$coreutils/bin:$PATH + mkdir -p $out/bin + cp $qemu_test/bin/* $out/bin/ + ln -sf $out/bin/qemu-system-${stdenv.hostPlatform.qemuArch} $out/bin/qemu-kvm + ''; + }; + stdenv = pkgs.stdenv // { + mkDerivation = args: (pkgs.stdenv.mkDerivation (args // ( + pkgs.lib.optionalAttrs (args.name == "nixos-test-driver") { + installPhase = args.installPhase + '' + rm $libDir/Machine.pm + cp ${patchedMachinePM} $libDir/Machine.pm + ''; + } + ))); + }; +})