vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / continuous-integration / gocd-server / default.nix
bloba1fb740c269d5936ca3fe4565057edcba3d24730
1 { config, lib, options, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.gocd-server;
7   opt = options.services.gocd-server;
8 in {
9   options = {
10     services.gocd-server = {
11       enable = mkEnableOption "gocd-server";
13       user = mkOption {
14         default = "gocd-server";
15         type = types.str;
16         description = ''
17           User the Go.CD server should execute under.
18         '';
19       };
21       group = mkOption {
22         default = "gocd-server";
23         type = types.str;
24         description = ''
25           If the default user "gocd-server" is configured then this is the primary group of that user.
26         '';
27       };
29       extraGroups = mkOption {
30         default = [ ];
31         type = types.listOf types.str;
32         example = [ "wheel" "docker" ];
33         description = ''
34           List of extra groups that the "gocd-server" user should be a part of.
35         '';
36       };
38       listenAddress = mkOption {
39         default = "0.0.0.0";
40         example = "localhost";
41         type = types.str;
42         description = ''
43           Specifies the bind address on which the Go.CD server HTTP interface listens.
44         '';
45       };
47       port = mkOption {
48         default = 8153;
49         type = types.port;
50         description = ''
51           Specifies port number on which the Go.CD server HTTP interface listens.
52         '';
53       };
55       sslPort = mkOption {
56         default = 8154;
57         type = types.int;
58         description = ''
59           Specifies port number on which the Go.CD server HTTPS interface listens.
60         '';
61       };
63       workDir = mkOption {
64         default = "/var/lib/go-server";
65         type = types.str;
66         description = ''
67           Specifies the working directory in which the Go.CD server java archive resides.
68         '';
69       };
71       packages = mkOption {
72         default = [ pkgs.stdenv pkgs.jre pkgs.git config.programs.ssh.package pkgs.nix ];
73         defaultText = literalExpression "[ pkgs.stdenv pkgs.jre pkgs.git config.programs.ssh.package pkgs.nix ]";
74         type = types.listOf types.package;
75         description = ''
76           Packages to add to PATH for the Go.CD server's process.
77         '';
78       };
80       initialJavaHeapSize = mkOption {
81         default = "512m";
82         type = types.str;
83         description = ''
84           Specifies the initial java heap memory size for the Go.CD server's java process.
85         '';
86       };
88       maxJavaHeapMemory = mkOption {
89         default = "1024m";
90         type = types.str;
91         description = ''
92           Specifies the java maximum heap memory size for the Go.CD server's java process.
93         '';
94       };
96       startupOptions = mkOption {
97         type = types.listOf types.str;
98         default = [
99           "-Xms${cfg.initialJavaHeapSize}"
100           "-Xmx${cfg.maxJavaHeapMemory}"
101           "-Dcruise.listen.host=${cfg.listenAddress}"
102           "-Duser.language=en"
103           "-Djruby.rack.request.size.threshold.bytes=30000000"
104           "-Duser.country=US"
105           "-Dcruise.config.dir=${cfg.workDir}/conf"
106           "-Dcruise.config.file=${cfg.workDir}/conf/cruise-config.xml"
107           "-Dcruise.server.port=${toString cfg.port}"
108           "-Dcruise.server.ssl.port=${toString cfg.sslPort}"
109           "--add-opens=java.base/java.lang=ALL-UNNAMED"
110           "--add-opens=java.base/java.util=ALL-UNNAMED"
111         ];
112         defaultText = literalExpression ''
113           [
114             "-Xms''${config.${opt.initialJavaHeapSize}}"
115             "-Xmx''${config.${opt.maxJavaHeapMemory}}"
116             "-Dcruise.listen.host=''${config.${opt.listenAddress}}"
117             "-Duser.language=en"
118             "-Djruby.rack.request.size.threshold.bytes=30000000"
119             "-Duser.country=US"
120             "-Dcruise.config.dir=''${config.${opt.workDir}}/conf"
121             "-Dcruise.config.file=''${config.${opt.workDir}}/conf/cruise-config.xml"
122             "-Dcruise.server.port=''${toString config.${opt.port}}"
123             "-Dcruise.server.ssl.port=''${toString config.${opt.sslPort}}"
124             "--add-opens=java.base/java.lang=ALL-UNNAMED"
125             "--add-opens=java.base/java.util=ALL-UNNAMED"
126           ]
127         '';
129         description = ''
130           Specifies startup command line arguments to pass to Go.CD server
131           java process.
132         '';
133       };
135       extraOptions = mkOption {
136         default = [ ];
137         type = types.listOf types.str;
138         example = [
139           "-X debug"
140           "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
141           "-verbose:gc"
142           "-Xloggc:go-server-gc.log"
143           "-XX:+PrintGCTimeStamps"
144           "-XX:+PrintTenuringDistribution"
145           "-XX:+PrintGCDetails"
146           "-XX:+PrintGC"
147         ];
148         description = ''
149           Specifies additional command line arguments to pass to Go.CD server's
150           java process.  Example contains debug and gcLog arguments.
151         '';
152       };
154       environment = mkOption {
155         default = { };
156         type = with types; attrsOf str;
157         description = ''
158           Additional environment variables to be passed to the gocd-server process.
159           As a base environment, gocd-server receives NIX_PATH from
160           {option}`environment.sessionVariables`, NIX_REMOTE is set to
161           "daemon".
162         '';
163       };
164     };
165   };
167   config = mkIf cfg.enable {
168     users.groups = optionalAttrs (cfg.group == "gocd-server") {
169       gocd-server.gid = config.ids.gids.gocd-server;
170     };
172     users.users = optionalAttrs (cfg.user == "gocd-server") {
173       gocd-server = {
174         description = "gocd-server user";
175         createHome = true;
176         home = cfg.workDir;
177         group = cfg.group;
178         extraGroups = cfg.extraGroups;
179         useDefaultShell = true;
180         uid = config.ids.uids.gocd-server;
181       };
182     };
184     systemd.services.gocd-server = {
185       description = "GoCD Server";
186       after = [ "network.target" ];
187       wantedBy = [ "multi-user.target" ];
189       environment =
190         let
191           selectedSessionVars =
192             lib.filterAttrs (n: v: builtins.elem n [ "NIX_PATH" ])
193               config.environment.sessionVariables;
194         in
195           selectedSessionVars //
196             { NIX_REMOTE = "daemon";
197             } //
198             cfg.environment;
200       path = cfg.packages;
202       script = ''
203         ${pkgs.git}/bin/git config --global --add http.sslCAinfo /etc/ssl/certs/ca-certificates.crt
204         ${pkgs.jre}/bin/java -server ${concatStringsSep " " cfg.startupOptions} \
205                                ${concatStringsSep " " cfg.extraOptions}  \
206                               -jar ${pkgs.gocd-server}/go-server/lib/go.jar
207       '';
209       serviceConfig = {
210         User = cfg.user;
211         Group = cfg.group;
212         WorkingDirectory = cfg.workDir;
213       };
214     };
215   };