NixOS Module
Hercules CI Agent can be deployed using NixOS, using either the module that is distributed with NixOS, or the hercules-ci-agent
flake.
A minimal configuration looks as follows:
# NixOS configuration module
{
imports = [
inputs.hercules-ci-agent.nixosModules.multi-agent-service
];
services.hercules-ci-agents."" = {
# See https://docs.hercules-ci.com/hercules-ci-agent/nixos-module
};
}
Options
The hercules-ci-agent
flake provides an attribute nixosModules.multi-agent-service
with the following options.
services.hercules-ci-agents
Multiple instances of hercules-ci-agent can be specified.
If you specify an instance named ""
, it will behave just as the
services.hercules-ci-agent
options did.
-
User:
hercules-ci-agent
-
Default base directory:
/var/lib/hercules-ci-agent
Otherwise:
-
User:
hci-${name}
-
Default base directory:
/var/lib/hercules-ci-agent-${name}
Type: attribute set of (submodule)
Default: { }
Declared by:
services.hercules-ci-agents.<name>.package
Package containing the bin/hercules-ci-agent executable.
Type: package
Default: pkgs.hercules-ci-agent
Declared by:
services.hercules-ci-agents.<name>.allowUnknownSettings
Allow unknown settings to be written to the agent.json
file.
This is useful for forward compatibility - if you’ve overridden the package.
Type: boolean
Default: false
Declared by:
services.hercules-ci-agents.<name>.settings
These settings are written to the agent.json
file.
Type: anything
Default: { }
Declared by:
services.hercules-ci-agents.<name>.settings.allowInsecureBuiltinFetchers
Allow the use of insecure fetching protocols, such as http
.
Disabled by default, because most users do not need this, but note that Nix by default does allow this.
Type: boolean
Default: false
Declared by:
services.hercules-ci-agents.<name>.settings.apiBaseUrl
API base URL that the agent will connect to.
When using Hercules CI Enterprise, set this to the URL where your Hercules CI server is reachable.
Type: string
Default: "https://hercules-ci.com"
Declared by:
services.hercules-ci-agents.<name>.settings.baseDirectory
State directory (secrets, work directory, etc) for agent
Type: path
Default: "/var/lib/hercules-ci-agent"
Declared by:
services.hercules-ci-agents.<name>.settings.binaryCachesPath
Path to a JSON file containing binary cache secret keys.
As these values are confidential, they should not be in the store, but
copied over using other means, such as agenix, NixOps
deployment.keys
, or manual installation.
The format is described on docs.hercules-ci.com/hercules-ci-agent/binary-caches-json/.
Type: path
Default: staticSecretsDirectory + "/binary-caches.json"
Declared by:
services.hercules-ci-agents.<name>.settings.clusterJoinTokenPath
Location of the cluster-join-token.key file.
You can retrieve the contents of the file when creating a new agent via hercules-ci.com/dashboard.
As this value is confidential, it should not be in the store, but
installed using other means, such as agenix, NixOps deployment.keys
,
or manual installation.
The contents of the file are used for authentication between the agent and the API.
Type: path
Default: staticSecretsDirectory + "/cluster-join-token.key"
Declared by:
services.hercules-ci-agents.<name>.settings.concurrentTasks
Number of tasks to perform simultaneously.
A task is a single derivation build, an evaluation or an effect run. At
minimum, you need 2 concurrent tasks for x86_64-linux
in your
cluster, to allow for import from derivation.
concurrentTasks
can be around the CPU core count or lower if memory
is the bottleneck.
The optimal value depends on the resource consumption characteristics of your workload, including memory usage and in-task parallelism. This is typically determined empirically.
When scaling, it is generally better to have a double-size machine than two machines, because each split of resources causes inefficiencies; particularly with regards to build latency because of extra downloads.
Type: positive integer, meaning >0, or value “auto” (singular enum)
Default: "auto"
, meaning equal to the number of CPU cores.
Declared by:
services.hercules-ci-agents.<name>.settings.effectMountables
An attribute set of mountable directories for effects.
Type: lazy attribute set of (submodule)
Default: { }
Declared by:
services.hercules-ci-agents.<name>.settings.effectMountables.<name>.condition
A condition expression that decides whether a mountable is accessible to an effect.
Type: condition
Default: "true"
Declared by:
services.hercules-ci-agents.<name>.settings.effectMountables.<name>.readOnly
If true
, the mount into the sandbox will be a read-only bind mount.
If false
, the mount is not mounted read-only, and it will be
writable if it is for the system user that runs hercules-ci-agent (i.e.
hercules-ci-agent
or hci-${name}
).
Type: boolean
Declared by:
services.hercules-ci-agents.<name>.settings.effectMountables.<name>.source
A mountable directory as a path string.
Type: path
Default: null
Example: "/etc/hosts"
Declared by:
services.hercules-ci-agents.<name>.settings.labels
A key-value map of user data.
Any Nix type that is representable in JSON is permitted.
Type: JSON value
Default:
{ agent.source = "..."; # One of "nixpkgs", "flake", "override" lib.version = "..."; pkgs.version = "..."; }
Declared by:
services.hercules-ci-agents.<name>.settings.logLevel
Control the importance threshold for messages are logged to the system log.
More verbose: "DebugS"
, less verbose: "WarningS"
, "ErrorS"
.
Type: one of “DebugS”, “InfoS”, “WarningS”, “ErrorS”
Default: "InfoS"
Declared by:
services.hercules-ci-agents.<name>.settings.nixSettings
Since hercules-ci-agent 0.10.2.
A key-value map of Nix settings.
Nix interprets keys that start with extra-
as additions to the
existing (e.g. system) value. However, nixSettings
is unordered, so
make sure to use extra-${x}
or plain ${x}
, but not both.
Type: lazy attribute set of string
Default: { }
Example:
{ # ignore other system substituters substituters = "https://cache.nixos.org"; };
Declared by:
services.hercules-ci-agents.<name>.settings.secretsJsonPath
Path to a JSON file containing secrets for effects.
As these values are confidential, they should not be in the store, but
copied over using other means, such as agenix, NixOps
deployment.keys
, or manual installation.
The format is described on docs.hercules-ci.com/hercules-ci-agent/secrets-json/.
Type: path
Default: staticSecretsDirectory + "/secrets.json"
Declared by:
services.hercules-ci-agents.<name>.settings.staticSecretsDirectory
This is the default directory to look for statically configured secrets
like cluster-join-token.key
.
See also clusterJoinTokenPath
and binaryCachesPath
for
fine-grained configuration.
Type: path
Default: baseDirectory + "/secrets"
Declared by:
services.hercules-ci-agents.<name>.settings.workDirectory
The directory in which temporary subdirectories are created for task state. This includes sources for Nix evaluation.
Type: path
Default: baseDirectory + "/work"
Declared by: