vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / continuous-integration / woodpecker / agents.nix
blobb88bc6a0ccac0f1dcbe2e7fd6d0ba86923f151a2
1 { config
2 , lib
3 , pkgs
4 , ...
5 }:
7 let
8   cfg = config.services.woodpecker-agents;
10   agentModule = lib.types.submodule {
11     options = {
12       enable = lib.mkEnableOption "this Woodpecker-Agent. Agents execute tasks generated by a Server, every install will need one server and at least one agent";
14       package = lib.mkPackageOption pkgs "woodpecker-agent" { };
16       environment = lib.mkOption {
17         default = { };
18         type = lib.types.attrsOf lib.types.str;
19         example = lib.literalExpression ''
20           {
21             WOODPECKER_SERVER = "localhost:9000";
22             WOODPECKER_BACKEND = "docker";
23             DOCKER_HOST = "unix:///run/podman/podman.sock";
24           }
25         '';
26         description = "woodpecker-agent config environment variables, for other options read the [documentation](https://woodpecker-ci.org/docs/administration/agent-config)";
27       };
29       extraGroups = lib.mkOption {
30         type = lib.types.listOf lib.types.str;
31         default = [ ];
32         example = [ "podman" ];
33         description = ''
34           Additional groups for the systemd service.
35         '';
36       };
38       path = lib.mkOption {
39         type = lib.types.listOf lib.types.package;
40         default = [ ];
41         example = [ "" ];
42         description = ''
43           Additional packages that should be added to the agent's `PATH`.
44           Mostly useful for the `local` backend.
45         '';
46       };
48       environmentFile = lib.mkOption {
49         type = lib.types.listOf lib.types.path;
50         default = [ ];
51         example = [ "/var/secrets/woodpecker-agent.env" ];
52         description = ''
53           File to load environment variables
54           from. This is helpful for specifying secrets.
55           Example content of environmentFile:
56           ```
57           WOODPECKER_AGENT_SECRET=your-shared-secret-goes-here
58           ```
59         '';
60       };
61     };
62   };
64   mkAgentService = name: agentCfg: {
65     name = "woodpecker-agent-${name}";
66     value = {
67       description = "Woodpecker-Agent Service - ${name}";
68       wantedBy = [ "multi-user.target" ];
69       after = [ "network-online.target" ];
70       wants = [ "network-online.target" ];
71       serviceConfig = {
72         DynamicUser = true;
73         SupplementaryGroups = agentCfg.extraGroups;
74         EnvironmentFile = agentCfg.environmentFile;
75         ExecStart = lib.getExe agentCfg.package;
76         Restart = "on-failure";
77         RestartSec = 15;
78         CapabilityBoundingSet = "";
79         NoNewPrivileges = true;
80         ProtectSystem = "strict";
81         PrivateTmp = true;
82         PrivateDevices = true;
83         PrivateUsers = true;
84         ProtectHostname = true;
85         ProtectClock = true;
86         ProtectKernelTunables = true;
87         ProtectKernelModules = true;
88         ProtectKernelLogs = true;
89         ProtectControlGroups = true;
90         RestrictAddressFamilies = [ "AF_UNIX AF_INET AF_INET6" ];
91         LockPersonality = true;
92         MemoryDenyWriteExecute = true;
93         RestrictRealtime = true;
94         RestrictSUIDSGID = true;
95         PrivateMounts = true;
96         SystemCallArchitectures = "native";
97         SystemCallFilter = "~@clock @privileged @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @setuid @swap";
98         BindReadOnlyPaths = [
99           "-/etc/resolv.conf"
100           "-/etc/nsswitch.conf"
101           "-/etc/ssl/certs"
102           "-/etc/static/ssl/certs"
103           "-/etc/hosts"
104           "-/etc/localtime"
105         ];
106       };
107       inherit (agentCfg) environment path;
108     };
109   };
112   meta.maintainers = with lib.maintainers; [ ambroisie ];
114   options = {
115     services.woodpecker-agents = {
116       agents = lib.mkOption {
117         default = { };
118         type = lib.types.attrsOf agentModule;
119         example = lib.literalExpression ''
120           {
121             podman = {
122               environment = {
123                 WOODPECKER_SERVER = "localhost:9000";
124                 WOODPECKER_BACKEND = "docker";
125                 DOCKER_HOST = "unix:///run/podman/podman.sock";
126               };
128               extraGroups = [ "podman" ];
130               environmentFile = [ "/run/secrets/woodpecker/agent-secret.txt" ];
131             };
133             exec = {
134               environment = {
135                 WOODPECKER_SERVER = "localhost:9000";
136                 WOODPECKER_BACKEND = "local";
137               };
139               environmentFile = [ "/run/secrets/woodpecker/agent-secret.txt" ];
141               path = [
142                 # Needed to clone repos
143                 git
144                 git-lfs
145                 woodpecker-plugin-git
146                 # Used by the runner as the default shell
147                 bash
148                 # Most likely to be used in pipeline definitions
149                 coreutils
150               ];
151             };
152           }
153         '';
154         description = "woodpecker-agents configurations";
155       };
156     };
157   };
159   config = {
160     systemd.services =
161       let
162         mkServices = lib.mapAttrs' mkAgentService;
163         enabledAgents = lib.filterAttrs (_: agent: agent.enable) cfg.agents;
164       in
165       mkServices enabledAgents;
166   };