services.buildkite-agents: support multi-tags

The buildkite agent supports multiple tags with the same key. This
functionality is used to have a [single agent listen on multiple
queues](https://buildkite.com/docs/agent/v3/queues#setting-an-agents-queue).

However, having the tags be of type `attrsOf str` means that
we cannot suport this use case. This commit modifies the type
of tags to be `attrsOf (either str (listOf str))` where the list
is expanded into multiple tags with the same key.

Example:
```
{tags = {queue = ["default", "testing"];};}
```
generates
```
tags="queue=default,queue=testing"
```
in the buildkite agent configuration.

Changed files
+7 -3
nixos
modules
services
continuous-integration
+7 -3
nixos/modules/services/continuous-integration/buildkite-agents.nix
···
};
tags = mkOption {
-
type = types.attrsOf types.str;
+
type = types.attrsOf (types.either types.str (types.listOf types.str));
default = {};
example = { queue = "default"; docker = "true"; ruby2 ="true"; };
description = ''
···
## don't end up in the Nix store.
preStart = let
sshDir = "${cfg.dataDir}/.ssh";
-
tagStr = lib.concatStringsSep "," (lib.mapAttrsToList (name: value: "${name}=${value}") cfg.tags);
+
tagStr = name: value:
+
if lib.isList value
+
then lib.concatStringsSep "," (builtins.map (v: "${name}=${v}") value)
+
else "${name}=${value}";
+
tagsStr = lib.concatStringsSep "," (lib.mapAttrsToList tagStr cfg.tags);
in
optionalString (cfg.privateSshKeyPath != null) ''
mkdir -m 0700 -p "${sshDir}"
···
token="$(cat ${toString cfg.tokenPath})"
name="${cfg.name}"
shell="${cfg.shell}"
-
tags="${tagStr}"
+
tags="${tagsStr}"
build-path="${cfg.dataDir}/builds"
hooks-path="${cfg.hooksPath}"
${cfg.extraConfig}