mirror of
https://github.com/gensokyo-zone/infrastructure.git
synced 2026-02-09 04:19:19 -08:00
137 lines
3.8 KiB
Nix
137 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;
|
|
};
|
|
};
|
|
};
|
|
}
|