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.
This commit is contained in:
Joey Hewitt 2019-07-01 11:32:30 -06:00
parent 05d963e751
commit 0e6bb4e898
3 changed files with 51 additions and 6 deletions

View file

@ -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: nixos-intern:
image: nixos/nix image: nixos/nix
variables: variables:
NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz" NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz"
script: script:
- nix-build tests/intern.nix - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/intern.nix
nixos-extern: nixos-extern:
image: nixos/nix image: nixos/nix
variables: variables:
NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz" NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz"
script: script:
- nix-build tests/extern.nix - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/extern.nix
nixos-clamav: nixos-clamav:
image: nixos/nix image: nixos/nix
variables: variables:
NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz" NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz"
script: script:
- nix-build tests/clamav.nix - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/clamav.nix
nixos-unstable-intern: nixos-unstable-intern:
image: nixos/nix image: nixos/nix
variables: variables:
NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz" NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz"
script: script:
- nix-build tests/intern.nix - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/intern.nix
nixos-unstable-extern: nixos-unstable-extern:
image: nixos/nix image: nixos/nix
variables: variables:
NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz" NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz"
script: script:
- nix-build tests/extern.nix - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/extern.nix
nixos-unstable-clamav: nixos-unstable-clamav:
image: nixos/nix image: nixos/nix
variables: variables:
NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz" NIX_PATH: "nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz"
script: script:
- nix-build tests/clamav.nix - nix-build --arg pkgs 'import tests/lib/pkgs.nokvm.nix' tests/clamav.nix

View file

@ -1,3 +1,11 @@
{ {
security.dhparams.defaultBitSize = 16; # really low for quicker tests 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
'';
} }

31
tests/lib/pkgs.nokvm.nix Normal file
View file

@ -0,0 +1,31 @@
let
pkgs = (import <nixpkgs> { 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 (<nixpkgs>+"/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
'';
}
)));
};
})