Hydra is a Nix-based continuous build system. My
method for configuring a server to be a Hydra build server, is to create a
hydra.nix
file like this:
# NixOps configuration for machines running Hydra
{ config, pkgs, lib, ... }:
{
services.postfix = {
enable = true;
setSendmail = true;
};
services.postgresql = {
enable = true;
package = pkgs.postgresql;
identMap =
''
hydra-users hydra hydra
hydra-users hydra-queue-runner hydra
hydra-users hydra-www hydra
hydra-users root postgres
hydra-users postgres postgres
'';
};
networking.firewall.allowedTCPPorts = [ config.services.hydra.port ];
services.hydra = {
enable = true;
useSubstitutes = true;
hydraURL = "https://my.website.org";
notificationSender = "my.website.org";
buildMachinesFiles = [];
extraConfig = ''
store_uri = file:///var/lib/hydra/cache?secret-key=/etc/nix/my.website.org/secret
binary_cache_secret_key_file = /etc/nix/my.website.org/secret
binary_cache_dir = /var/lib/hydra/cache
'';
};
services.nginx = {
enable = true;
recommendedProxySettings = true;
virtualHosts."my.website.org" = {
forceSSL = true;
enableACME = true;
locations."/".proxyPass = "http://localhost:3000";
};
};
security.acme.certs = {
"my.website.org".email = "my.email@my.website.org";
};
systemd.services.hydra-manual-setup = {
description = "Create Admin User for Hydra";
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
wantedBy = [ "multi-user.target" ];
requires = [ "hydra-init.service" ];
after = [ "hydra-init.service" ];
environment = builtins.removeAttrs (config.systemd.services.hydra-init.environment) ["PATH"];
script = ''
if [ ! -e ~hydra/.setup-is-complete ]; then
# create signing keys
/run/current-system/sw/bin/install -d -m 551 /etc/nix/my.website.org
/run/current-system/sw/bin/nix-store --generate-binary-cache-key my.website.org /etc/nix/my.website.org/secret /etc/nix/my.website.org/public
/run/current-system/sw/bin/chown -R hydra:hydra /etc/nix/my.website.org
/run/current-system/sw/bin/chmod 440 /etc/nix/my.website.org/secret
/run/current-system/sw/bin/chmod 444 /etc/nix/my.website.org/public
# create cache
/run/current-system/sw/bin/install -d -m 755 /var/lib/hydra/cache
/run/current-system/sw/bin/chown -R hydra-queue-runner:hydra /var/lib/hydra/cache
# done
touch ~hydra/.setup-is-complete
fi
'';
};
nix.trustedUsers = ["hydra" "hydra-evaluator" "hydra-queue-runner"];
nix.buildMachines = [
{
hostName = "localhost";
systems = [ "x86_64-linux" "i686-linux" ];
maxJobs = 6;
# for building VirtualBox VMs as build artifacts, you might need other
# features depending on what you are doing
supportedFeatures = [ ];
}
];
}
From there it can be imported in your configuration.nix
or
NixOps files like this:
{ config, pkgs, ... }:
{
imports =
[
./hydra.nix
];
...
}
To deploy hydra, you will then need to either run nixos-rebuild switch
on
the server or use nixops deploy -d my.network
.
The result of this deployment, via NixOps can be seen at hydra.mcwhirter.io.