infrastructure/nixos/github-runner/zone.nix
2024-02-20 19:50:41 -08:00

134 lines
3.8 KiB
Nix

{
config,
lib,
inputs,
...
}: let
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.modules) mkIf mkMerge mkDefault;
inherit (lib.attrsets) listToAttrs nameValuePair;
inherit (lib.lists) genList;
inherit (inputs.self.lib.lib) unmerged;
cfg = config.services.github-runner-zone;
genZone = f: genList f cfg.count;
genZoneAttrs = prefix: f: listToAttrs (genZone (i: nameValuePair "${prefix}${toString i}" (f i)));
in {
options.services.github-runner-zone = with lib.types; {
enable = mkEnableOption "github-runners.zone" // {
default = true;
};
targetName = mkOption {
type = str;
default = "github-runner-zone";
};
networkNamespace.name = mkOption {
type = nullOr str;
default = null;
};
count = mkOption {
type = int;
default = 4;
};
ephemeral = mkOption {
type = bool;
default = true;
};
keyPrefix = mkOption {
type = str;
default = "zone-";
};
namePrefix = mkOption {
type = str;
default = "${config.networking.hostName}-";
};
userPrefix = mkOption {
type = nullOr str;
default = "github-runner-zone-";
};
dynamicUser = mkOption {
type = bool;
default = false;
};
group = mkOption {
type = nullOr str;
default = "github-runner-zone";
};
runnerSettings = mkOption {
type = unmerged.type;
};
};
config = {
services.github-runner-zone = {
runnerSettings = {
enable = mkDefault true;
ephemeral = mkDefault cfg.ephemeral;
replace = mkDefault true;
extraLabels = [ "ubuntu-latest" ];
tokenFile = mkDefault config.sops.secrets.github-runner-gensokyo-zone-token.path;
url = mkDefault "https://github.com/gensokyo-zone";
group = mkDefault cfg.group;
extraEnvironment = {
GIT_TEXTDOMAINDIR = "${config.programs.git.package}/share/locale";
};
networkNamespace.name = mkIf (cfg.networkNamespace.name != null) (mkDefault cfg.networkNamespace.name);
serviceSettings = {
wantedBy = [ "${cfg.targetName}.target" ];
unitConfig = {
StopPropagatedFrom = [ "${cfg.targetName}.target" ];
};
};
serviceOverrides = mkIf (!cfg.dynamicUser) {
# XXX: the ci sshd hack requires this for now :<
PrivateUsers = false;
InaccessiblePaths = [
"/run/wrappers"
];
};
};
};
services.github-runners = genZoneAttrs cfg.keyPrefix (i: mkMerge [
(unmerged.merge cfg.runnerSettings)
{
name = mkDefault "${cfg.namePrefix}${toString i}";
user = mkIf (cfg.userPrefix != null) (
mkDefault "${cfg.userPrefix}${toString i}"
);
}
]);
systemd = mkIf cfg.enable {
services.nix-daemon = mkIf cfg.enable {
networkNamespace = mkIf (cfg.networkNamespace.name != null) {
name = mkDefault cfg.networkNamespace.name;
privateMounts = mkDefault false;
};
};
targets.${cfg.targetName} = {
wantedBy = [ "multi-user.target" ];
};
};
users = mkIf cfg.enable {
groups = mkIf (cfg.group != null) {
${toString cfg.group} = { };
};
users = mkMerge [
(mkIf (!cfg.dynamicUser) (genZoneAttrs cfg.userPrefix (i: {
isSystemUser = true;
useDefaultShell = mkDefault true;
group = mkIf (cfg.group != null) (mkDefault cfg.group);
createHome = false;
home = "/var/lib/github-runner/${cfg.keyPrefix}${toString i}";
})))
];
};
sops.secrets = {
github-runner-gensokyo-zone-token = mkIf cfg.enable {
sopsFile = mkDefault ../secrets/github-runner.yaml;
};
};
};
}