Files
vms/flake.nix
T

204 lines
6.3 KiB
Nix
Raw Normal View History

2024-06-21 12:33:38 -05:00
# github.com/brianmcgee has lots of great ideas for going above and beyond for this
{
description = "Greg's homepage";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
devshell.url = "github:numtide/devshell";
flake-parts.url = "github:hercules-ci/flake-parts";
flake-root.url = "github:srid/flake-root";
process-compose.url = "github:Platonic-Systems/process-compose-flake";
treefmt-nix.url = "github:numtide/treefmt-nix";
};
2024-06-26 16:00:57 -05:00
outputs = { devshell, flake-parts, flake-root, process-compose, treefmt-nix, nixpkgs, ... }@inputs: let
lib = nixpkgs.lib;
providers = [
"qemu"
"virtualbox-iso"
"hyperv-iso"
];
distros = import ./distros;
# Inserts the distro name into each element in the list
insertNames = lib.attrsets.mapAttrsToList (distro: val: (builtins.map (x: x // { inherit distro; }) val)) distros;
# Flattens all the distros into a single list
flat = lib.lists.flatten insertNames;
# Combines providers list with flattened list
withProviders = lib.attrsets.mapCartesianProduct
({d, provider}: d // { inherit provider; })
{ d = flat; provider = providers; };
active = builtins.filter (x: (x?eol) && (!x.eol)) withProviders;
name = d: "-${d.distro}-${d.arch}-${d.provider}-${d.version}";
distroFile = d: "distros/${d.distro}/${d.version}/${d.arch}.pkrvars.hcl";
cmd = d: ''
2024-07-13 03:03:14 -05:00
# This is a workaround for a goofy behavior in CI
2024-07-13 03:31:10 -05:00
if [ -e "''${PACKER_CONFIG_DIR}" ]; then
find "''${PACKER_CONFIG_DIR}" -name '*_linux_amd64' -exec chmod +x '{}' ";"
fi
2024-07-13 03:03:14 -05:00
packer init sources
2024-07-24 10:52:23 -05:00
packer build -only=${d.provider}.${d.arch} -var-file=${distroFile d}'';
2024-06-26 16:00:57 -05:00
in flake-parts.lib.mkFlake { inherit inputs; }
{
2024-06-21 12:33:38 -05:00
imports = [
inputs.devshell.flakeModule
inputs.flake-root.flakeModule
inputs.treefmt-nix.flakeModule
];
flake = {
# Universal things
};
systems = [
"x86_64-linux"
"aarch64-linux"
];
2024-06-26 16:00:57 -05:00
perSystem = { config, pkgs, self', system, ... }:
{
2024-06-21 12:33:38 -05:00
_module.args.pkgs = import inputs.nixpkgs {
inherit system;
config.allowUnfree = true;
};
# https://numtide.github.io/devshell/intro.html
devshells.default = {
# These commands will be shown in the motd that users read
# upon entering the shell
2024-06-21 13:00:22 -05:00
commands = [ {
package = self'.packages.cache;
category = "utils";
help = "Downloads ISO files and adds them to the S3 bucket";
2024-06-28 09:52:25 -05:00
} {
package = self'.packages.generate;
category = "utils";
help = "Generate dynamic HCL files";
2024-06-24 23:04:16 -05:00
} {
package = self'.packages.shellcheck;
category = "utils";
help = "Run shellchecks";
2024-06-24 23:13:53 -05:00
} {
package = self'.packages.validate;
category = "utils";
help = "Validate all the files";
2024-06-28 09:52:25 -05:00
} {
package = pkgs.vagrant;
category = "utils";
help = "Vagrant to help with testing";
2024-06-26 16:00:57 -05:00
} ] ++ (builtins.map (d: { package = self'.packages."build${name d}"; category = "builds"; }) withProviders);
env = [{
name = "EFI_DIR";
value = "${pkgs.OVMF.fd}/FV/";
2024-07-13 03:31:10 -05:00
} {
name = "PACKER_CONFIG_DIR";
value = "./packer_config";
2024-11-18 14:31:43 -06:00
} {
name = "STORAGE_URL";
value = "http://s3.thehellings.lan:9000";
2024-07-13 03:31:10 -05:00
} ];
2024-06-21 12:33:38 -05:00
};
2024-06-28 09:52:25 -05:00
# This is not special, this is just flakes
2024-06-26 16:00:57 -05:00
packages = let
base = {
runtimeInputs = with pkgs; [
packer
2024-07-13 03:03:14 -05:00
findutils
2024-06-28 09:52:25 -05:00
qemu_full
vagrant
2024-06-26 16:00:57 -05:00
];
};
2024-06-28 09:52:25 -05:00
build = d: let
vp = x: if x.provider == "qemu" then "libvirt"
else if x.provider == "virtualbox-iso" then "virtualbox"
else if x.provider == "hyperv-iso" then "hyperv"
else "unknown";
in pkgs.writeShellApplication (base // {
2024-06-26 16:00:57 -05:00
name = "build${name d}";
text = ''
2024-06-28 09:52:25 -05:00
set -x
${cmd d} -except=upload -var headless=false sources/
vagrant box add --provider ${vp d} ./output/${vp d}/${d.distro}-${d.version}.box --name test_box --force
2024-06-26 16:00:57 -05:00
'';
2024-06-28 09:52:25 -05:00
});
2024-07-13 03:31:10 -05:00
cibuild = d: pkgs.writeShellApplication (base // {
name = "ci${name d}";
text = ''
set -x
${cmd d} -except=upload sources/
'';
});
2024-06-26 16:00:57 -05:00
upload = d: pkgs.writeShellApplication (base // {
name = "upload${name d}";
text = ''
2024-07-13 03:31:10 -05:00
set -x
${cmd d} sources/
2024-06-26 16:00:57 -05:00
'';
2024-07-13 03:31:10 -05:00
});
2024-06-26 16:00:57 -05:00
builds = lib.lists.foldr (d: acc: acc // { "build${name d}" = (build d); }) {} withProviders;
uploads = lib.lists.foldr (d: acc: acc // { "upload${name d}" = (upload d); }) {} withProviders;
2024-07-13 03:31:10 -05:00
cibuilds = lib.lists.foldr (d: acc: acc // { "ci${name d}" = (cibuild d); }) {} withProviders;
2024-07-22 10:34:22 -05:00
qemu_list = builtins.toJSON (builtins.map (d: { buildcmd = (name d); }) (builtins.filter (x: x.provider == "qemu") active));
vbox_list = builtins.toJSON (builtins.map (d: { buildcmd = (name d); }) (builtins.filter (x: x.provider == "virtualbox-iso") active));
2024-06-26 16:00:57 -05:00
hyperv_list = builtins.toJSON (builtins.map (d: { distro = distroFile d; }) (builtins.filter (x: x.provider == "hyperv-iso") active));
2024-07-13 03:31:10 -05:00
in builds // uploads // cibuilds // {
2024-06-26 16:00:57 -05:00
continue = pkgs.writeText "continue.yml"
(builtins.replaceStrings ["QEMU_MATRIX" "VBOX_MATRIX" "HYPERV_MATRIX"] [qemu_list vbox_list hyperv_list]
(builtins.readFile ./.gitlab-ci-build.yml.in)
);
2024-06-26 20:57:47 -05:00
cache = pkgs.callPackage (import ./nix/cache.nix) { inherit active distroFile; };
2024-07-13 01:39:48 -05:00
validate = pkgs.callPackage (import ./nix/validate.nix) {};
2024-06-21 16:23:24 -05:00
cache-restore = pkgs.writeShellApplication {
name = "cache-restore";
runtimeInputs = with pkgs; [
jq
minio-client
packer
];
text = builtins.readFile ./cache-restore.sh;
};
2024-06-28 09:52:25 -05:00
generate = pkgs.writeShellApplication {
name = "generate";
runtimeInputs = with pkgs; [
bash
2024-07-23 18:13:58 -05:00
coreutils
2024-06-28 09:52:25 -05:00
curl
jq
pup
];
text = ''
shopt -s globstar
for vars in distros/**/*.pkrvars.hcl.sh; do
bash "./''${vars}"
done
2024-07-24 10:14:40 -05:00
set -x
echo "BUILD=$(date "+%Y.%m.%d.%H")" >> build.env
2024-06-28 09:52:25 -05:00
'';
};
2024-06-24 23:04:16 -05:00
shellcheck = pkgs.writeShellApplication {
name = "shellcheck";
runtimeInputs = with pkgs; [
shellcheck
];
text = ''
scripts=()
shopt -s globstar
for f in **/*.sh; do
scripts+=("$f")
done
shellcheck -e SC2239 "''${scripts[@]}"
'';
};
2024-06-21 12:33:38 -05:00
};
# https://numtide.github.io/treefmt/
treefmt.config = {
inherit (config.flake-root) projectRootFile;
package = pkgs.treefmt;
programs = {
deadnix.enable = true;
};
settings.formatter = {
};
};
};
};
}