main
1{
2 den,
3 lib,
4 ...
5}: {
6 den.aspects.services.woodpecker.agent = {
7 includes = [den.aspects.services.podman];
8 settings = {
9 agents = lib.mkOption {
10 type = lib.types.attrsOf (lib.types.submodule {
11 options = {
12 server = lib.mkOption {
13 type = lib.types.str;
14 };
15 secretFileAged = lib.mkOption {
16 type = lib.types.path;
17 };
18 labels = lib.mkOption {
19 type = lib.types.attrsOf lib.types.str;
20 default = {};
21 };
22 extraEnvironments = lib.mkOption {
23 type = lib.types.attrsOf lib.types.str;
24 default = {};
25 };
26 };
27 });
28 default = {};
29 };
30 };
31
32 nixos = {
33 host,
34 config,
35 ...
36 }: let
37 cfg = host.settings.services.woodpecker.agent;
38 mapLabels = lib.concatMapAttrsStringSep "," (n: v: "${n}=${v}");
39 mkSecretName = name: "woodpecker-agent-${name}-token";
40 in
41 lib.mkMerge (
42 lib.mapAttrsToList (name: agent: {
43 services.woodpecker-agents.agents.${name} = {
44 enable = true;
45 extraGroups = ["podman"];
46 environment =
47 {
48 WOODPECKER_AGENT_LABELS = mapLabels agent.labels;
49 WOODPECKER_SERVER = agent.server;
50 WOODPECKER_AGENT_SECRET_FILE = config.vaultix.secrets.${mkSecretName name}.path;
51 WOODPECKER_GRPC_SECURE = "true";
52 WOODPECKER_MAX_WORKFLOWS = "4";
53 DOCKER_HOST = "unix:///run/podman/podman.sock";
54 WOODPECKER_BACKEND = "docker";
55 WOODPECKER_BACKEND_DOCKER_ENABLE_IPV6 = "true";
56 }
57 // agent.extraEnvironments;
58 };
59
60 systemd.services."woodpecker-agent-${name}".serviceConfig = {
61 DynamicUser = lib.mkForce false;
62 User = "woodpecker-agent-${name}";
63 Group = "woodpecker-agent-${name}";
64 };
65
66 users.users."woodpecker-agent-${name}" = {
67 isSystemUser = true;
68 useDefaultShell = true;
69 group = "woodpecker-agent-${name}";
70 };
71 users.groups."woodpecker-agent-${name}" = {};
72
73 vaultix.secrets.${mkSecretName name} = {
74 file = agent.secretFileAged;
75 owner = "root";
76 group = "woodpecker-agent-${name}";
77 mode = "0440";
78 };
79 })
80 cfg.agents
81 );
82 };
83}