SlideShare a Scribd company logo
Hydra: Continuous Integration and Testing for
Demanding People: The Details
Sander van der Burg
Conference Compass
July 15, 2014
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Continuous integration
We want to deliver and test software rapidly
We quickly want to see the impact of changes to the source
code and its dependencies.
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra
Hydra: A Nix-based continuous integration server:
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra
Hydra: A Nix-based continuous integration server:
Generic. Supports multiple programming language
environments and component technologies.
Deployment. Build and test environments are deployed
automatically and all dependencies are ensured to be present
and correct.
Variability. Multiple versions/variants of dependencies can
safely coexist.
Multi platform support. Builds can be easily delegated to
machines with a different operating system.
Scalability. Builds are transparently delegated to any machine
in a cluster capable of building it.
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra
How to use Hydra to build or test stuff?
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra overview
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra overview
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Components
Queue runner: Regularly checks what has changed and
what to build
Evaluator: Builds the jobs
Server: Web application making builds and test results
available
Nix: Package mananger responsible for the actual
builds and depedency management
Hydra overview
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
The Nix package manager
A package manager borrowing concepts from purely functional
programming languages.
x = y ⇒ f (x) = f (y)
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Nix store
Main idea: store all packages
in isolation from each other:
/nix/store/40awryfqzp46m...
-disnix-0.3
Paths contain a 160-bit
cryptographic hash of all
inputs used to build the
package:
Sources
Libraries
Compilers
Build scripts
. . .
/nix/store
40awryfqzp...-disnix-0.3
bin
disnix-env
disnix-manifest
disnix-service
kjlv4klmra...-getopt-1.1.4
bin
getopt
am13rq9ka...-dbus-glib-0.102
lib
libdbus-glib-1.so.2
94n64qy99...-glibc-2.19
lib
libc.so.6
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Nix expressions
disnix.nix
{ stdenv, fetchurl, pkgconfig, dbus_glib
, libxml2, libxslt, getopt, nix, dysnomia }:
stdenv.mkDerivation {
name = "disnix-0.3";
src = fetchurl {
url = http://.../disnix-0.3.tar.bz2;
sha256 = "1jjmzdd7fac6isq5wdaqjbwwnsnzjag5s4...";
};
buildInputs = [ pkgconfig dbus_glib libxml2 libxslt
getopt nix dysnomia ];
buildCommand = ’’
tar xjf $src
./configure --prefix=$out
make; make install
’’;
}
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Nix expressions
disnix.nix
{ stdenv, fetchurl, pkgconfig, dbus_glib
, libxml2, libxslt, getopt, nix, dysnomia }:
stdenv.mkDerivation {
name = "disnix-0.3";
src = fetchurl {
url = http://.../disnix-0.3.tar.bz2;
sha256 = "1jjmzdd7fac6isq5wdaqjbwwnsnzjag5s4...";
};
buildInputs = [ pkgconfig dbus_glib libxml2 libxslt
getopt nix dysnomia ];
buildCommand = ’’
tar xjf $src
./configure --prefix=$out
make; make install
’’;
}
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Environments
Expression defines a function that composes an
environment in which a build is executed
Nearly any type of build can be performed inside it,
e.g. C/C++, Java, Perl, Python...
We can also run tests inside these environments
The buildInputs parameters are used to configure all
settings to make a build find its dependencies, e.g.
setting PATH, PYTHONPATH, CLASSPATH ...
There are also function abstractions for different kinds
of packages
If no buildCommand is given, it executes the default
GNU Autotools build procedure: ./configure;
make; make install.
Nix expressions
all-packages.nix
{system ? builtins.currentSystem}:
rec {
stdenv = ... { inherit system; };
fetchurl = ...;
pkgconfig = ...;
dbus_glib = ...;
libxml2 = ...;
libxslt = ...;
getopt = ...;
nix = callPackage ../pkgs/tools/package-management/nix { };
dysnomia = import ../pkgs/tools/package-management/dysnomia {
inherit stdenv fetchurl getopt;
};
disnix = import ../pkgs/tools/package-management/disnix {
inherit stdenv fetchurl pkgconfig dbus_glib;
inherit libxml2 libxslt getopt nix dysnomia;
};
...
}
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Nix expressions
all-packages.nix
{system ? builtins.currentSystem}:
rec {
stdenv = ... { inherit system; };
fetchurl = ...;
pkgconfig = ...;
dbus_glib = ...;
libxml2 = ...;
libxslt = ...;
getopt = ...;
nix = callPackage ../pkgs/tools/package-management/nix { };
dysnomia = import ../pkgs/tools/package-management/dysnomia {
inherit stdenv fetchurl getopt;
};
disnix = import ../pkgs/tools/package-management/disnix {
inherit stdenv fetchurl pkgconfig dbus_glib;
inherit libxml2 libxslt getopt nix dysnomia;
};
...
}
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Environments
Composes packages by calling them with the required
function arguments.
Function invocations are lazy – they are only evaluated
if needed.
Previous expression for Disnix that defines a function
is imported here.
All dependencies are composed in the same expression
as well.
Building Nix expressions
Building a Nix package:
$ nix-build all-packages.nix -A disnix
/nix/store/40awryfqzp46mjzm1rwy9qa8vxscjhgx-disnix-0.3
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Building Nix expressions
Building a Nix package:
$ nix-build all-packages.nix -A disnix
/nix/store/40awryfqzp46mjzm1rwy9qa8vxscjhgx-disnix-0.3
The Nix package manager builds disnix and all its
dependencies that have not been built yet.
Hash component is derived from all build inputs used to build
the package.
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Finding runtime dependencies
/nix/store
40awryfqzp...-disnix-0.3
bin
disnix-env
disnix-manifest
disnix-service
kjlv4klmra...-getopt-1.1.4
bin
getopt
am13rq9ka...-dbus-glib-0.102
lib
libdbus-glib-1.so.2
94n64qy99...-glibc-2.19
lib
libc.so.6
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Finding runtime dependencies
/nix/store
40awryfqzp...-disnix-0.3
bin
disnix-env
disnix-manifest
disnix-service
kjlv4klmra...-getopt-1.1.4
bin
getopt
am13rq9ka...-dbus-glib-0.102
lib
libdbus-glib-1.so.2
94n64qy99...-glibc-2.19
lib
libc.so.6
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Contents of
40aw...-disnix-0.3/bin/disnix-service
...
72 74 00 5f 65 6e 64 00 2f 6e 69 78 2f 73 74 6f |rt._end./nix/sto|
72 65 2f 61 6d 31 33 72 71 39 6b 61 7a 6d 31 78 |re/am13rq9kazm1x|
34 30 71 37 67 6b 70 71 77 31 35 62 37 33 32 6d |40q7gkpqw15b732m|
63 62 69 2d 64 62 75 73 2d 67 6c 69 62 2d 30 2e |cbi-dbus-glib-0.|
31 30 32 2f 6c 69 62 2f 6c 69 62 64 62 75 73 2d |102/lib/libdbus-|
67 6c 69 62 2d 31 2e 73 6f 3a 2f 6e 69 78 2f 73 |glib-1.so:/nix/s|
74 6f 72 65 2f 30 39 33 66 61 69 64 32 6d 78 69 |tore/093faid2mxi|
63 72 33 36 38 79 39 36 63 35 61 6a 6b 6c 39 6b |cr368y96c5ajkl9k|
...
Finding runtime dependencies
/nix/store
40awryfqzp...-disnix-0.3
bin
disnix-env
disnix-manifest
disnix-service
kjlv4klmra...-getopt-1.1.4
bin
getopt
am13rq9ka...-dbus-glib-0.102
lib
libdbus-glib-1.so.2
94n64qy99...-glibc-2.19
lib
libc.so.6
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Contents of
40aw...-disnix-0.3/bin/disnix-service
...
72 74 00 5f 65 6e 64 00 2f 6e 69 78 2f 73 74 6f |rt._end./nix/sto|
72 65 2f 61 6d 31 33 72 71 39 6b 61 7a 6d 31 78 |re/am13rq9kazm1x|
34 30 71 37 67 6b 70 71 77 31 35 62 37 33 32 6d |40q7gkpqw15b732m|
63 62 69 2d 64 62 75 73 2d 67 6c 69 62 2d 30 2e |cbi-dbus-glib-0.|
31 30 32 2f 6c 69 62 2f 6c 69 62 64 62 75 73 2d |102/lib/libdbus-|
67 6c 69 62 2d 31 2e 73 6f 3a 2f 6e 69 78 2f 73 |glib-1.so:/nix/s|
74 6f 72 65 2f 30 39 33 66 61 69 64 32 6d 78 69 |tore/093faid2mxi|
63 72 33 36 38 79 39 36 63 35 61 6a 6b 6c 39 6b |cr368y96c5ajkl9k|
...
Building Nix expressions
During a build of package many side effects are removed:
Most environment variables are initially cleared or set to
dummy values, such as PATH.
Environment variables, such as PATH, are configured to only
contain the specified dependencies.
Nix store paths prevent packages to be implicitly found in
many cases (unlike “traditional” systems using /usr/lib,
/usr/bin or C:WINDOWSSystem32).
Timestamps are set to 1 second after the epoch
Files in the Nix store are made read-only.
Optionally, builds can be performed in a chroot()
environment, improving purity
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
User environments
Users can have
different sets of
installed applications.
PATH
/nix/.../profiles
current
42
/nix/store
pp56i0a01si5...-user-env
bin
firefox
disnix-env
b9w6q73mqm...-disnix-0.2
bin
disnix-env
mr8f62946...-firefox-30.0
bin
firefox
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
User environments
Users can have
different sets of
installed applications.
nix-env operations
create new user
environments in the
store.
PATH
/nix/.../profiles
current
42
/nix/store
pp56i0a01si5...-user-env
bin
firefox
disnix-env
b9w6q73mqm...-disnix-0.2
bin
disnix-env
mr8f62946...-firefox-30.0
bin
firefox
40awryfq...-disnix-0.3
bin
disnix-env
(nix-env -u disnix)
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
User environments
Users can have
different sets of
installed applications.
nix-env operations
create new user
environments in the
store.
PATH
/nix/.../profiles
current
42
/nix/store
pp56i0a01si5...-user-env
bin
firefox
disnix-env
b9w6q73mqm...-disnix-0.2
bin
disnix-env
mr8f62946...-firefox-30.0
bin
firefox
40awryfq...-disnix-0.3
bin
disnix-env
i3d9vh6d8ip1...-user-env
bin
disnix-env
firefox
(nix-env -u disnix)
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
User environments
Users can have
different sets of
installed applications.
nix-env operations
create new user
environments in the
store.
PATH
/nix/.../profiles
current
42
43
/nix/store
pp56i0a01si5...-user-env
bin
firefox
disnix-env
b9w6q73mqm...-disnix-0.2
bin
disnix-env
mr8f62946...-firefox-30.0
bin
firefox
40awryfq...-disnix-0.3
bin
disnix-env
i3d9vh6d8ip1...-user-env
bin
disnix-env
firefox
(nix-env -u disnix)
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
User environments
Users can have
different sets of
installed applications.
nix-env operations
create new user
environments in the
store.
We can atomically
switch between them.
PATH
/nix/.../profiles
current
42
43
/nix/store
pp56i0a01si5...-user-env
bin
firefox
disnix-env
b9w6q73mqm...-disnix-0.2
bin
disnix-env
mr8f62946...-firefox-30.0
bin
firefox
40awryfq...-disnix-0.3
bin
disnix-env
i3d9vh6d8ip1...-user-env
bin
disnix-env
firefox
(nix-env -u disnix)
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
User environments
Users can have
different sets of
installed applications.
nix-env operations
create new user
environments in the
store.
We can atomically
switch between them.
These are roots of the
garbage collector.
PATH
/nix/.../profiles
current
43
/nix/store
pp56i0a01si5...-user-env
bin
firefox
disnix-env
b9w6q73mqm...-disnix-0.2
bin
disnix-env
mr8f62946...-firefox-30.0
bin
firefox
40awryfq...-disnix-0.3
bin
disnix-env
i3d9vh6d8ip1...-user-env
bin
disnix-env
firefox
(nix-env --remove-generations old)
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
User environments
Users can have
different sets of
installed applications.
nix-env operations
create new user
environments in the
store.
We can atomically
switch between them.
These are roots of the
garbage collector.
PATH
/nix/.../profiles
current
43
/nix/store
mr8f62946...-firefox-30.0
bin
firefox
40awryfq...-disnix-0.3
bin
disnix-env
i3d9vh6d8ip1...-user-env
bin
disnix-env
firefox
(nix-collect-garbage)
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra expression
release.nix
{ nixpkgs ? <nixpkgs>, systems ? [ "x86_64-linux" "x86_64-darwin" ]
, dysnomia ? { outPath = ./.; rev = 1234; } }:
let pkgs = import nixpkgs {}; in
rec {
tarball = pkgs.releaseTools.sourceTarball {
name = "dysnomia-tarball";
version = builtins.readFile ./version;
src = dysnomia;
buildInputs = [ pkgs.getopt ];
};
build = pkgs.lib.genAttrs systems (system:
let pkgs = import nixpkgs { inherit system; }; in
pkgs.releaseTools.nixBuild {
name = "dysnomia";
version = builtins.readFile ./version;
src = tarball;
buildInputs = [ pkgs.getopt ];
});
...
}
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra expression
release.nix
{ nixpkgs ? <nixpkgs>, systems ? [ "x86_64-linux" "x86_64-darwin" ]
, dysnomia ? { outPath = ./.; rev = 1234; } }:
let pkgs = import nixpkgs {}; in
rec {
tarball = pkgs.releaseTools.sourceTarball {
name = "dysnomia-tarball";
version = builtins.readFile ./version;
src = dysnomia;
buildInputs = [ pkgs.getopt ];
};
build = pkgs.lib.genAttrs systems (system:
let pkgs = import nixpkgs { inherit system; }; in
pkgs.releaseTools.nixBuild {
name = "dysnomia";
version = builtins.readFile ./version;
src = tarball;
buildInputs = [ pkgs.getopt ];
});
...
}
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Jobs
An Hydra expression is a function returing an attribute
set: rec{attr1 = value1; ...; attrn = valuen; }
Function parameters define variability points:
Locations of the Dysnomia, Nixpkgs collection Git
repositories
Target system architectures
Each attribute corresponds to a job.
Each value refers to a function performing a build or
test.
File is typically placed in the root folder of a source
package.
Building jobs from the command-line
Building a source tarball:
$ nix-build release.nix -A tarball
Building Dysnomia for 64-bit AMD Linux:
$ nix-build release.nix -A build.x86 64-linux
Building Dysnomia for Mac OS X (Nix delegates the build to
a Mac machine if the build is run on Linux and an external
machine is configured):
$ nix-build release.nix -A build.x86 64-darwin
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Building jobs from Hydra
Create a project:
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Building jobs from Hydra
Create a jobset:
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Building jobs from Hydra
Create a jobset:
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Jobs
All (but one) inputs are provided as function
arguments to the release expression.
One input is the package itself (dysnomia) that
contains the release.nix expression
Building jobs from Hydra
Evaluation results (job names correspond to those defined in
release.nix):
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra expression referring to other jobsets
release.nix
{ nixpkgs ? <nixpkgs>, systems ? [ "x86_64-linux" "x86_64-darwin" ]
, dysnomiaJobset ?
import ../dysnomia/release.nix { inherit nixpkgs systems; }
, disnix ? { outPath = ./.; rev = 1234; } }:
let pkgs = import nixpkgs {}; in
rec {
tarball = ...
build = pkgs.lib.genAttrs systems (system:
let dysnomia = builtins.getAttr system (dysnomiaJobset.build); in
with import nixpkgs { inherit system; };
releaseTools.nixBuild {
name = "disnix";
src = tarball;
buildInputs = [ pkgconfig dbus_glib libxml2 libxslt
getopt nix dysnomia ];
};
...
}
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Building jobs from Hydra
Use an input of type: ’Previous Hydra evaluation’:
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Hydra jobs I typically write
Source packages. Jobs that assemble tarballs, Zip files or
other archives containing the source code.
Binary packages. The actual builds for a variety of
architectures, such as i686-linux, x86 64-linux,
x86 64-darwin.
Program manuals. For example, building the manual from
Docbook.
Program documentation catalogs. Generating a
documentation catalog from the source code, e.g. using
javadoc, doxygen or JSDuck.
Unit tests. Running Unit tests, for example with JUnit or
mocha and producing a coverage report.
System integration tests. Composing NixOS Linux VMs with
all environmental dependencies, e.g. DBMS, web server etc,
and run tests inside them.
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Nix channel
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Nix channel
Adding a channel:
$ nix-channel --add http://localhost/jobset/disnix/disnix-master/channel/latest
$ nix-channel --update
When running:
$ nix-env -i disnix
installing ‘disnix-0.3pre174e883b7b09da822494876d2f297736f33707a7’
these paths will be fetched (0.31 MiB download, 0.91 MiB unpacked):
/nix/store/70rkq38r69fwrz90ayc4fyg823z92nmf-disnix-0.3
fetching path ‘/nix/store/70rkq38r69fwrz90ayc4fyg823z92nmf-disnix-0.3’...
The build gets downloaded from the Hydra server, instead of being
built from source code.
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Nix package manager: Exercises
Check it out yourself!!!
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Availability
Nix and Hydra are available as free and open source software under
the LGPLv2 and the GPLv3 licenses:
Nix: http://nixos.org/nix
Hydra: http://nixos.org/hydra
NixOS’ Hydra server: http://hydra.nixos.org
Nix can be used on any Linux distribution, NixOS, Mac OS X,
FreeBSD, and Windows (through Cygwin)
Hydra can be used on any Linux distribution
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Related work
Using Nix while doing development:
Deploy development packages and composing an environment
in which they can be found
NixOS: http://nixos.org/nixos
Deploy an entire system configuration (Linux distribution) with
Nix.
System integration testing with NixOS
Efficiently compose networks of NixOS machines within a build
in which system integration tests can be performed
Disnix: http://nixos/disnix
(Re)deploy service-oriented systems into networks of machines
NixOps: http://nixos/nixops
Deploy networks of NixOS configurations to physical machines
or into the cloud
Automatically creates VM instances if needed
NiJS: https://www.npmjs.org/package/nijs
Compose Nix packages in JavaScript
Invoke JavaScript functions from Nix expressions
Very primitive stand-alone package manager
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
Questions
Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People

More Related Content

PDF
Hydra: Continuous Integration and Testing for Demanding People: The Basics
PDF
Deploying (micro)services with Disnix
PDF
The NixOS project and deploying systems declaratively
PDF
The Nix project
PDF
Deploying NPM packages with the Nix package manager
PDF
Using NixOS for declarative deployment and testing
PDF
The Nix project
PDF
Nix for Python developers
Hydra: Continuous Integration and Testing for Demanding People: The Basics
Deploying (micro)services with Disnix
The NixOS project and deploying systems declaratively
The Nix project
Deploying NPM packages with the Nix package manager
Using NixOS for declarative deployment and testing
The Nix project
Nix for Python developers

What's hot (20)

PPT
IPexpo - What is DevOps, and why should infrastructure operations care?
PDF
Security in a containerized world - Jessie Frazelle
PPTX
LlinuxKit security, Security Scanning and Notary
PDF
There is no container - Ori Pekelman
PDF
Using Docker Containers to Improve Reproducibility in Software and Web Engine...
PDF
O'Reilly Software Architecture Conference London 2017: Building Resilient Mic...
PDF
Docker and kernel security
PDF
Securing Applications and Pipelines on a Container Platform
PPT
Containers 101
PDF
Swimming upstream
PDF
Ryan Koop's Docker Chicago Meetup Demo March 12 2014
PDF
CI/CD with Kubernetes
PDF
Continuous Security in DevOps
PDF
Introduction to Docker and all things containers, Docker Meetup at RelateIQ
PDF
OpenStack Days Krakow
PDF
Mirantis Contributions to Kubernetes Ecosystem
PDF
Deployment with Ruby on Rails
PPTX
Docker & Daily DevOps
PDF
Getting started with docker
PPTX
Kubernetes and container security
IPexpo - What is DevOps, and why should infrastructure operations care?
Security in a containerized world - Jessie Frazelle
LlinuxKit security, Security Scanning and Notary
There is no container - Ori Pekelman
Using Docker Containers to Improve Reproducibility in Software and Web Engine...
O'Reilly Software Architecture Conference London 2017: Building Resilient Mic...
Docker and kernel security
Securing Applications and Pipelines on a Container Platform
Containers 101
Swimming upstream
Ryan Koop's Docker Chicago Meetup Demo March 12 2014
CI/CD with Kubernetes
Continuous Security in DevOps
Introduction to Docker and all things containers, Docker Meetup at RelateIQ
OpenStack Days Krakow
Mirantis Contributions to Kubernetes Ecosystem
Deployment with Ruby on Rails
Docker & Daily DevOps
Getting started with docker
Kubernetes and container security
Ad

Similar to Hydra: Continuous Integration and Testing for Demanding People: The Details (20)

PDF
Automating Mendix application deployments with Nix
PDF
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
PDF
Deploying .NET applications with the Nix package manager
PPTX
Continuous Integration for OpenVMS with Jenkins
PDF
From Zero to Application Delivery with NixOS
PDF
Model-driven Distributed Software Deployment
PDF
$ make install
PDF
Functional Operations (Functional Programming at Comcast Labs Connect)
PDF
A Reference Architecture for Distributed Software Deployment
PDF
Jenkins for One
PPTX
Why NXTware Remote for Jenkins
PDF
Dependencies Managers in C/C++. Using stdcpp 2014
PPT
Presentation 1 open source tools in continuous integration environment v1.0
PDF
Apache Continuum Build, Test, and Release
PDF
Native OSGi, Modular Software Development in a Native World - Alexander Broek...
PDF
Perl Continous Integration
PPTX
Continuous integration for open source distros v 3.0
DOC
Vijay_Teekinavar_Kallesh
PDF
Deploying software at Scale
PDF
How many tools use Continuous integration in Devops- VaST ITES INC..pdf
Automating Mendix application deployments with Nix
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
Deploying .NET applications with the Nix package manager
Continuous Integration for OpenVMS with Jenkins
From Zero to Application Delivery with NixOS
Model-driven Distributed Software Deployment
$ make install
Functional Operations (Functional Programming at Comcast Labs Connect)
A Reference Architecture for Distributed Software Deployment
Jenkins for One
Why NXTware Remote for Jenkins
Dependencies Managers in C/C++. Using stdcpp 2014
Presentation 1 open source tools in continuous integration environment v1.0
Apache Continuum Build, Test, and Release
Native OSGi, Modular Software Development in a Native World - Alexander Broek...
Perl Continous Integration
Continuous integration for open source distros v 3.0
Vijay_Teekinavar_Kallesh
Deploying software at Scale
How many tools use Continuous integration in Devops- VaST ITES INC..pdf
Ad

More from Sander van der Burg (17)

PDF
The Monitoring Playground
PDF
nix-processmgmt: An experimental Nix-based process manager-agnostic framework
PDF
Using Nix and Docker as automated deployment solutions
PDF
Dysnomia: complementing Nix deployments with state deployment
PDF
A Reference Architecture for Distributed Software Deployment
PDF
Techniques and lessons for improvement of deployment processes
PDF
A Generic Approach for Deploying and Upgrading Mutable Software Components
PDF
Deploying .NET services with Disnix
PDF
A Self-Adaptive Deployment Framework for Service-Oriented Systems
PDF
Pull Deployment of Services
PDF
Disnix: A toolset for distributed deployment
PDF
Automated Deployment of Hetergeneous Service-Oriented System
PDF
Pull Deployment of Services: Introduction, Progress and Challenges
PDF
Software Deployment in a Dynamic Cloud
PDF
Atomic Upgrading of Distributed Systems
PDF
Model-driven Distributed Software Deployment
PDF
Model-driven Distributed Software Deployment laymen's talk
The Monitoring Playground
nix-processmgmt: An experimental Nix-based process manager-agnostic framework
Using Nix and Docker as automated deployment solutions
Dysnomia: complementing Nix deployments with state deployment
A Reference Architecture for Distributed Software Deployment
Techniques and lessons for improvement of deployment processes
A Generic Approach for Deploying and Upgrading Mutable Software Components
Deploying .NET services with Disnix
A Self-Adaptive Deployment Framework for Service-Oriented Systems
Pull Deployment of Services
Disnix: A toolset for distributed deployment
Automated Deployment of Hetergeneous Service-Oriented System
Pull Deployment of Services: Introduction, Progress and Challenges
Software Deployment in a Dynamic Cloud
Atomic Upgrading of Distributed Systems
Model-driven Distributed Software Deployment
Model-driven Distributed Software Deployment laymen's talk

Recently uploaded (20)

PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Digital Strategies for Manufacturing Companies
PPTX
ai tools demonstartion for schools and inter college
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
Nekopoi APK 2025 free lastest update
PDF
System and Network Administraation Chapter 3
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
top salesforce developer skills in 2025.pdf
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
CHAPTER 2 - PM Management and IT Context
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Digital Strategies for Manufacturing Companies
ai tools demonstartion for schools and inter college
Design an Analysis of Algorithms II-SECS-1021-03
Nekopoi APK 2025 free lastest update
System and Network Administraation Chapter 3
Upgrade and Innovation Strategies for SAP ERP Customers
Reimagine Home Health with the Power of Agentic AI​
PTS Company Brochure 2025 (1).pdf.......
Navsoft: AI-Powered Business Solutions & Custom Software Development
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
How to Migrate SBCGlobal Email to Yahoo Easily
top salesforce developer skills in 2025.pdf
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Odoo POS Development Services by CandidRoot Solutions
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
CHAPTER 2 - PM Management and IT Context

Hydra: Continuous Integration and Testing for Demanding People: The Details

  • 1. Hydra: Continuous Integration and Testing for Demanding People: The Details Sander van der Burg Conference Compass July 15, 2014 Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 2. Continuous integration We want to deliver and test software rapidly We quickly want to see the impact of changes to the source code and its dependencies. Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 3. Hydra Hydra: A Nix-based continuous integration server: Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 4. Hydra Hydra: A Nix-based continuous integration server: Generic. Supports multiple programming language environments and component technologies. Deployment. Build and test environments are deployed automatically and all dependencies are ensured to be present and correct. Variability. Multiple versions/variants of dependencies can safely coexist. Multi platform support. Builds can be easily delegated to machines with a different operating system. Scalability. Builds are transparently delegated to any machine in a cluster capable of building it. Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 5. Hydra How to use Hydra to build or test stuff? Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 6. Hydra overview Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 7. Hydra overview Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People Components Queue runner: Regularly checks what has changed and what to build Evaluator: Builds the jobs Server: Web application making builds and test results available Nix: Package mananger responsible for the actual builds and depedency management
  • 8. Hydra overview Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 9. The Nix package manager A package manager borrowing concepts from purely functional programming languages. x = y ⇒ f (x) = f (y) Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 10. Nix store Main idea: store all packages in isolation from each other: /nix/store/40awryfqzp46m... -disnix-0.3 Paths contain a 160-bit cryptographic hash of all inputs used to build the package: Sources Libraries Compilers Build scripts . . . /nix/store 40awryfqzp...-disnix-0.3 bin disnix-env disnix-manifest disnix-service kjlv4klmra...-getopt-1.1.4 bin getopt am13rq9ka...-dbus-glib-0.102 lib libdbus-glib-1.so.2 94n64qy99...-glibc-2.19 lib libc.so.6 Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 11. Nix expressions disnix.nix { stdenv, fetchurl, pkgconfig, dbus_glib , libxml2, libxslt, getopt, nix, dysnomia }: stdenv.mkDerivation { name = "disnix-0.3"; src = fetchurl { url = http://.../disnix-0.3.tar.bz2; sha256 = "1jjmzdd7fac6isq5wdaqjbwwnsnzjag5s4..."; }; buildInputs = [ pkgconfig dbus_glib libxml2 libxslt getopt nix dysnomia ]; buildCommand = ’’ tar xjf $src ./configure --prefix=$out make; make install ’’; } Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 12. Nix expressions disnix.nix { stdenv, fetchurl, pkgconfig, dbus_glib , libxml2, libxslt, getopt, nix, dysnomia }: stdenv.mkDerivation { name = "disnix-0.3"; src = fetchurl { url = http://.../disnix-0.3.tar.bz2; sha256 = "1jjmzdd7fac6isq5wdaqjbwwnsnzjag5s4..."; }; buildInputs = [ pkgconfig dbus_glib libxml2 libxslt getopt nix dysnomia ]; buildCommand = ’’ tar xjf $src ./configure --prefix=$out make; make install ’’; } Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People Environments Expression defines a function that composes an environment in which a build is executed Nearly any type of build can be performed inside it, e.g. C/C++, Java, Perl, Python... We can also run tests inside these environments The buildInputs parameters are used to configure all settings to make a build find its dependencies, e.g. setting PATH, PYTHONPATH, CLASSPATH ... There are also function abstractions for different kinds of packages If no buildCommand is given, it executes the default GNU Autotools build procedure: ./configure; make; make install.
  • 13. Nix expressions all-packages.nix {system ? builtins.currentSystem}: rec { stdenv = ... { inherit system; }; fetchurl = ...; pkgconfig = ...; dbus_glib = ...; libxml2 = ...; libxslt = ...; getopt = ...; nix = callPackage ../pkgs/tools/package-management/nix { }; dysnomia = import ../pkgs/tools/package-management/dysnomia { inherit stdenv fetchurl getopt; }; disnix = import ../pkgs/tools/package-management/disnix { inherit stdenv fetchurl pkgconfig dbus_glib; inherit libxml2 libxslt getopt nix dysnomia; }; ... } Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 14. Nix expressions all-packages.nix {system ? builtins.currentSystem}: rec { stdenv = ... { inherit system; }; fetchurl = ...; pkgconfig = ...; dbus_glib = ...; libxml2 = ...; libxslt = ...; getopt = ...; nix = callPackage ../pkgs/tools/package-management/nix { }; dysnomia = import ../pkgs/tools/package-management/dysnomia { inherit stdenv fetchurl getopt; }; disnix = import ../pkgs/tools/package-management/disnix { inherit stdenv fetchurl pkgconfig dbus_glib; inherit libxml2 libxslt getopt nix dysnomia; }; ... } Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People Environments Composes packages by calling them with the required function arguments. Function invocations are lazy – they are only evaluated if needed. Previous expression for Disnix that defines a function is imported here. All dependencies are composed in the same expression as well.
  • 15. Building Nix expressions Building a Nix package: $ nix-build all-packages.nix -A disnix /nix/store/40awryfqzp46mjzm1rwy9qa8vxscjhgx-disnix-0.3 Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 16. Building Nix expressions Building a Nix package: $ nix-build all-packages.nix -A disnix /nix/store/40awryfqzp46mjzm1rwy9qa8vxscjhgx-disnix-0.3 The Nix package manager builds disnix and all its dependencies that have not been built yet. Hash component is derived from all build inputs used to build the package. Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 18. Finding runtime dependencies /nix/store 40awryfqzp...-disnix-0.3 bin disnix-env disnix-manifest disnix-service kjlv4klmra...-getopt-1.1.4 bin getopt am13rq9ka...-dbus-glib-0.102 lib libdbus-glib-1.so.2 94n64qy99...-glibc-2.19 lib libc.so.6 Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People Contents of 40aw...-disnix-0.3/bin/disnix-service ... 72 74 00 5f 65 6e 64 00 2f 6e 69 78 2f 73 74 6f |rt._end./nix/sto| 72 65 2f 61 6d 31 33 72 71 39 6b 61 7a 6d 31 78 |re/am13rq9kazm1x| 34 30 71 37 67 6b 70 71 77 31 35 62 37 33 32 6d |40q7gkpqw15b732m| 63 62 69 2d 64 62 75 73 2d 67 6c 69 62 2d 30 2e |cbi-dbus-glib-0.| 31 30 32 2f 6c 69 62 2f 6c 69 62 64 62 75 73 2d |102/lib/libdbus-| 67 6c 69 62 2d 31 2e 73 6f 3a 2f 6e 69 78 2f 73 |glib-1.so:/nix/s| 74 6f 72 65 2f 30 39 33 66 61 69 64 32 6d 78 69 |tore/093faid2mxi| 63 72 33 36 38 79 39 36 63 35 61 6a 6b 6c 39 6b |cr368y96c5ajkl9k| ...
  • 19. Finding runtime dependencies /nix/store 40awryfqzp...-disnix-0.3 bin disnix-env disnix-manifest disnix-service kjlv4klmra...-getopt-1.1.4 bin getopt am13rq9ka...-dbus-glib-0.102 lib libdbus-glib-1.so.2 94n64qy99...-glibc-2.19 lib libc.so.6 Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People Contents of 40aw...-disnix-0.3/bin/disnix-service ... 72 74 00 5f 65 6e 64 00 2f 6e 69 78 2f 73 74 6f |rt._end./nix/sto| 72 65 2f 61 6d 31 33 72 71 39 6b 61 7a 6d 31 78 |re/am13rq9kazm1x| 34 30 71 37 67 6b 70 71 77 31 35 62 37 33 32 6d |40q7gkpqw15b732m| 63 62 69 2d 64 62 75 73 2d 67 6c 69 62 2d 30 2e |cbi-dbus-glib-0.| 31 30 32 2f 6c 69 62 2f 6c 69 62 64 62 75 73 2d |102/lib/libdbus-| 67 6c 69 62 2d 31 2e 73 6f 3a 2f 6e 69 78 2f 73 |glib-1.so:/nix/s| 74 6f 72 65 2f 30 39 33 66 61 69 64 32 6d 78 69 |tore/093faid2mxi| 63 72 33 36 38 79 39 36 63 35 61 6a 6b 6c 39 6b |cr368y96c5ajkl9k| ...
  • 20. Building Nix expressions During a build of package many side effects are removed: Most environment variables are initially cleared or set to dummy values, such as PATH. Environment variables, such as PATH, are configured to only contain the specified dependencies. Nix store paths prevent packages to be implicitly found in many cases (unlike “traditional” systems using /usr/lib, /usr/bin or C:WINDOWSSystem32). Timestamps are set to 1 second after the epoch Files in the Nix store are made read-only. Optionally, builds can be performed in a chroot() environment, improving purity Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 21. User environments Users can have different sets of installed applications. PATH /nix/.../profiles current 42 /nix/store pp56i0a01si5...-user-env bin firefox disnix-env b9w6q73mqm...-disnix-0.2 bin disnix-env mr8f62946...-firefox-30.0 bin firefox Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 22. User environments Users can have different sets of installed applications. nix-env operations create new user environments in the store. PATH /nix/.../profiles current 42 /nix/store pp56i0a01si5...-user-env bin firefox disnix-env b9w6q73mqm...-disnix-0.2 bin disnix-env mr8f62946...-firefox-30.0 bin firefox 40awryfq...-disnix-0.3 bin disnix-env (nix-env -u disnix) Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 23. User environments Users can have different sets of installed applications. nix-env operations create new user environments in the store. PATH /nix/.../profiles current 42 /nix/store pp56i0a01si5...-user-env bin firefox disnix-env b9w6q73mqm...-disnix-0.2 bin disnix-env mr8f62946...-firefox-30.0 bin firefox 40awryfq...-disnix-0.3 bin disnix-env i3d9vh6d8ip1...-user-env bin disnix-env firefox (nix-env -u disnix) Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 24. User environments Users can have different sets of installed applications. nix-env operations create new user environments in the store. PATH /nix/.../profiles current 42 43 /nix/store pp56i0a01si5...-user-env bin firefox disnix-env b9w6q73mqm...-disnix-0.2 bin disnix-env mr8f62946...-firefox-30.0 bin firefox 40awryfq...-disnix-0.3 bin disnix-env i3d9vh6d8ip1...-user-env bin disnix-env firefox (nix-env -u disnix) Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 25. User environments Users can have different sets of installed applications. nix-env operations create new user environments in the store. We can atomically switch between them. PATH /nix/.../profiles current 42 43 /nix/store pp56i0a01si5...-user-env bin firefox disnix-env b9w6q73mqm...-disnix-0.2 bin disnix-env mr8f62946...-firefox-30.0 bin firefox 40awryfq...-disnix-0.3 bin disnix-env i3d9vh6d8ip1...-user-env bin disnix-env firefox (nix-env -u disnix) Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 26. User environments Users can have different sets of installed applications. nix-env operations create new user environments in the store. We can atomically switch between them. These are roots of the garbage collector. PATH /nix/.../profiles current 43 /nix/store pp56i0a01si5...-user-env bin firefox disnix-env b9w6q73mqm...-disnix-0.2 bin disnix-env mr8f62946...-firefox-30.0 bin firefox 40awryfq...-disnix-0.3 bin disnix-env i3d9vh6d8ip1...-user-env bin disnix-env firefox (nix-env --remove-generations old) Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 27. User environments Users can have different sets of installed applications. nix-env operations create new user environments in the store. We can atomically switch between them. These are roots of the garbage collector. PATH /nix/.../profiles current 43 /nix/store mr8f62946...-firefox-30.0 bin firefox 40awryfq...-disnix-0.3 bin disnix-env i3d9vh6d8ip1...-user-env bin disnix-env firefox (nix-collect-garbage) Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 28. Hydra expression release.nix { nixpkgs ? <nixpkgs>, systems ? [ "x86_64-linux" "x86_64-darwin" ] , dysnomia ? { outPath = ./.; rev = 1234; } }: let pkgs = import nixpkgs {}; in rec { tarball = pkgs.releaseTools.sourceTarball { name = "dysnomia-tarball"; version = builtins.readFile ./version; src = dysnomia; buildInputs = [ pkgs.getopt ]; }; build = pkgs.lib.genAttrs systems (system: let pkgs = import nixpkgs { inherit system; }; in pkgs.releaseTools.nixBuild { name = "dysnomia"; version = builtins.readFile ./version; src = tarball; buildInputs = [ pkgs.getopt ]; }); ... } Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 29. Hydra expression release.nix { nixpkgs ? <nixpkgs>, systems ? [ "x86_64-linux" "x86_64-darwin" ] , dysnomia ? { outPath = ./.; rev = 1234; } }: let pkgs = import nixpkgs {}; in rec { tarball = pkgs.releaseTools.sourceTarball { name = "dysnomia-tarball"; version = builtins.readFile ./version; src = dysnomia; buildInputs = [ pkgs.getopt ]; }; build = pkgs.lib.genAttrs systems (system: let pkgs = import nixpkgs { inherit system; }; in pkgs.releaseTools.nixBuild { name = "dysnomia"; version = builtins.readFile ./version; src = tarball; buildInputs = [ pkgs.getopt ]; }); ... } Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People Jobs An Hydra expression is a function returing an attribute set: rec{attr1 = value1; ...; attrn = valuen; } Function parameters define variability points: Locations of the Dysnomia, Nixpkgs collection Git repositories Target system architectures Each attribute corresponds to a job. Each value refers to a function performing a build or test. File is typically placed in the root folder of a source package.
  • 30. Building jobs from the command-line Building a source tarball: $ nix-build release.nix -A tarball Building Dysnomia for 64-bit AMD Linux: $ nix-build release.nix -A build.x86 64-linux Building Dysnomia for Mac OS X (Nix delegates the build to a Mac machine if the build is run on Linux and an external machine is configured): $ nix-build release.nix -A build.x86 64-darwin Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 31. Building jobs from Hydra Create a project: Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 32. Building jobs from Hydra Create a jobset: Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 33. Building jobs from Hydra Create a jobset: Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People Jobs All (but one) inputs are provided as function arguments to the release expression. One input is the package itself (dysnomia) that contains the release.nix expression
  • 34. Building jobs from Hydra Evaluation results (job names correspond to those defined in release.nix): Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 35. Hydra expression referring to other jobsets release.nix { nixpkgs ? <nixpkgs>, systems ? [ "x86_64-linux" "x86_64-darwin" ] , dysnomiaJobset ? import ../dysnomia/release.nix { inherit nixpkgs systems; } , disnix ? { outPath = ./.; rev = 1234; } }: let pkgs = import nixpkgs {}; in rec { tarball = ... build = pkgs.lib.genAttrs systems (system: let dysnomia = builtins.getAttr system (dysnomiaJobset.build); in with import nixpkgs { inherit system; }; releaseTools.nixBuild { name = "disnix"; src = tarball; buildInputs = [ pkgconfig dbus_glib libxml2 libxslt getopt nix dysnomia ]; }; ... } Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 36. Building jobs from Hydra Use an input of type: ’Previous Hydra evaluation’: Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 37. Hydra jobs I typically write Source packages. Jobs that assemble tarballs, Zip files or other archives containing the source code. Binary packages. The actual builds for a variety of architectures, such as i686-linux, x86 64-linux, x86 64-darwin. Program manuals. For example, building the manual from Docbook. Program documentation catalogs. Generating a documentation catalog from the source code, e.g. using javadoc, doxygen or JSDuck. Unit tests. Running Unit tests, for example with JUnit or mocha and producing a coverage report. System integration tests. Composing NixOS Linux VMs with all environmental dependencies, e.g. DBMS, web server etc, and run tests inside them. Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 38. Nix channel Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 39. Nix channel Adding a channel: $ nix-channel --add http://localhost/jobset/disnix/disnix-master/channel/latest $ nix-channel --update When running: $ nix-env -i disnix installing ‘disnix-0.3pre174e883b7b09da822494876d2f297736f33707a7’ these paths will be fetched (0.31 MiB download, 0.91 MiB unpacked): /nix/store/70rkq38r69fwrz90ayc4fyg823z92nmf-disnix-0.3 fetching path ‘/nix/store/70rkq38r69fwrz90ayc4fyg823z92nmf-disnix-0.3’... The build gets downloaded from the Hydra server, instead of being built from source code. Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 40. Nix package manager: Exercises Check it out yourself!!! Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 41. Availability Nix and Hydra are available as free and open source software under the LGPLv2 and the GPLv3 licenses: Nix: http://nixos.org/nix Hydra: http://nixos.org/hydra NixOS’ Hydra server: http://hydra.nixos.org Nix can be used on any Linux distribution, NixOS, Mac OS X, FreeBSD, and Windows (through Cygwin) Hydra can be used on any Linux distribution Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 42. Related work Using Nix while doing development: Deploy development packages and composing an environment in which they can be found NixOS: http://nixos.org/nixos Deploy an entire system configuration (Linux distribution) with Nix. System integration testing with NixOS Efficiently compose networks of NixOS machines within a build in which system integration tests can be performed Disnix: http://nixos/disnix (Re)deploy service-oriented systems into networks of machines NixOps: http://nixos/nixops Deploy networks of NixOS configurations to physical machines or into the cloud Automatically creates VM instances if needed NiJS: https://www.npmjs.org/package/nijs Compose Nix packages in JavaScript Invoke JavaScript functions from Nix expressions Very primitive stand-alone package manager Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People
  • 43. Questions Sander van der Burg Hydra: Continuous Integration and Testing for Demanding People