38
Continuous Integration and Release Management with Nix Eelco Dolstra Institute of Information & Computing Sciences Utrecht University, The Netherlands July 14, 2004 Eelco Dolstra Continuous Integration and Release Management with Nix

Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Continuous Integration and Release Managementwith Nix

Eelco Dolstra

Institute of Information & Computing SciencesUtrecht University, The Netherlands

July 14, 2004

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 2: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Outline

1 Continuous Integration

2 Release Management

3 Build Farms

4 The Solution: Nix

5 Implementing a Build Farm with Nix

6 Conclusion

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 3: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Outline

1 Continuous Integration

2 Release Management

3 Build Farms

4 The Solution: Nix

5 Implementing a Build Farm with Nix

6 Conclusion

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 4: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Continuous Integration

When developing multiple components of a system in parallel,we must integrate them at some point.

“Integrate often” is more effective than “Big-BangIntegration”.

So compositions of components should be built as often aspossible.

⇒ Requires a build farm.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 5: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Example

Stratego/XT is a compiler/toolset for the Stratego programtransformation language.

Tiger is a compiler for the Tiger language, written in Stratego.

The Stratego/XT developers want to know:Whether Stratego/XT builds on/in a variety of platforms /configurations.

E.g., GCC 3.3 vs. GCC 3.4, SDF 2.2 vs SDF 2.3

Whether changes to the Stratego compiler breaks existingStratego code.

The Tiger developers want to know:

Whether Tiger builds on/in a variety of platforms /configurations.Whether Tiger is compatible with previous/current releases ofStratego/XT, and with the HEAD branch.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 6: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Example

Stratego 0.10

Tiger 1.2 Tiger HEAD

Stratego HEAD

The advantages:

Tiger acts as a real-world regression test for Stratego/XT.

Stratego/XT developers get feedback about unintentionalbreakage in the HEAD.

Tiger developers get early feedback about incompatiblechanges to Stratego/XT.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 7: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Outline

1 Continuous Integration

2 Release Management

3 Build Farms

4 The Solution: Nix

5 Implementing a Build Farm with Nix

6 Conclusion

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 8: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Release Management

We want to build releases of components...

... automatically, since many steps are involved, e.g.,

Make sure that all tests succeed.Build a source distribution.Build binary distributions for a variety of platforms.Upload (publish) to a server.Announce the release on a mailing list.

⇒ Requires a build farm.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 9: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Outline

1 Continuous Integration

2 Release Management

3 Build Farms

4 The Solution: Nix

5 Implementing a Build Farm with Nix

6 Conclusion

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 10: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Other Advantages of Build Farms

Allows more tests than can feasibly be run by a developerprior to commit:

Build on multiple platforms.Build multiple configurations / variants.Run time-consuming test sets.

Distribute pre-built components to other developers.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 11: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Current Build Farms

Mozilla Tinderbox, Cruise Control, AutoBuild, ...

Disadvantages:

Typically build single components, not compositions.

Do not manage dependencies:

E.g., “package X requires GCC 3.3, GTK 2.4, Bison 1.875c,...”This is left to the sysadmin of the build farm machines.But dependencies can conflict: “package Y does not build onGCC 3.3”.And dependencies can evolve: “package X now requires GCC3.4” ⇒ requires Θ(n) sysadmin time.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 12: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Dependency Hell

freetype-2.1.5

firefox-0.8

gtk+-2.4.0

fontconfig-2.2.2

pango-1.4.0

libXft-2.1.6

xlib-1.0

libXt-0.1.4-cvs

glibc-2.3.2

libX11-6.2.1

libIDL-0.8.2

glib-2.4.0

libXrender-0.8.4

atk-1.6.0

libSM-6.0.2

libXau-0.1.1

libICE-6.3.2 glib-2.2.3

perl-5.8.3

gnused-4.0.7 binutils-2.14coreutils-5.0

libtiff-3.5.7libpng-1.2.5

libjpeg-6b

libXext-6.4.2

zlib-1.2.1

expat-1.95.7

xproto-6.6.1

linux-headers-2.4.25-i386

libXtrans-0.1 xextensions-1.0.1

renderext-0.8

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 13: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Outline

1 Continuous Integration

2 Release Management

3 Build Farms

4 The Solution: Nix

5 Implementing a Build Farm with Nix

6 Conclusion

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 14: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Nix: A System for Software Deployment

Nix is a system for software deployment, i.e., for distributingsoftware from the developer to the user.

Features:

Correctness: complete deployment. No missingdependencies—Nix always deploys closures of components.Support for multiple versions/variants of components.Users can have different versions/variants installed at the sametime.Automatic garbage collection of unused components.Atomic upgrades / rollbacks.Simple language for describing components and compositions.Transparant source/binary deployment.

Basic model is source deployment, with binary deployment asa transparent optimisation.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 15: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Nix Expressions

Nix expressions describe how components and compositionscan be built.Simple functional language.

Nix expression for Stratego/XT: strategoxt.nix

{stdenv, fetchurl, aterm, sdf}:stdenv.mkDerivation {name = "strategoxt-0.10";builder = ./builder.sh;src = fetchurl {url = ftp://.../strategoxt-0.10.tar.gz;md5 = "526a28e84248b649bb098b22d227cd26";

};inherit aterm sdf;

}

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 16: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Nix Expressions

Nix expressions describe how components and compositionscan be built.Simple functional language.

Build script for Stratego/XT: builder.sh

tar xvfz $srccd strategoxt-*./configure --prefix=$out \--with-aterm=$aterm \--with-sdf=$sdf

makemake install

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 17: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Nix Expressions

Nix expressions describe how components and compositionscan be built.Simple functional language.

Composition: composition.nix

let {stdenv = import (...)/stdenv.nix;aterm = (import (...)/aterm.nix) {inherit stdenv;};sdf = (import (...)/sdf.nix) {inherit stdenv;};strategoxt = (import ./strategoxt.nix) {inherit stdenv aterm sdf;

};body = strategoxt;

}

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 18: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

User Operations

To build and install Stratego/XT:

$ nix-env -if ./composition.nix strategoxt

When a new version comes along:

$ nix-env -uf ./composition.nix strategoxt

If it doesn’t work:

$ nix-env --rollback

Delete unused components:

$ nix-collect-garbage

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 19: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

User Operations (Channels)

Subscribe to a channel:

$ nix-channel --add http://.../nix-stable-pkgs

Update all packages to the latest versions:

$ nix-channel --upgrade

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 20: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Transparent Binary Deployment

On the producer side:

$ nix-push ./composition.nix http://server/cache

On the client side:

$ nix-pull http://server/cache

Installation will now reuse pre-built components, iff they areexactly the same.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 21: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Implementation

All packages are stored in isolation from each other in the filesystem (in subdirectories of the Nix store—typically/nix/store).

Names of component directories contain a cryptographic hashof all inputs involved in building the component:

Input components (compilers, libraries, other tools).Sources.Build scripts.Variability parameters.System type on which the component is to be built.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 22: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Implementation

/nix/store

eeeeaf42e56b-subversion-0.32.1

bin

svn

lib

libsvn_wc.so

libsvn_ra_dav.so

a17fb5a6c48f-openssl-0.9.7c

lib

libssl.so.0.9.7

8d013ea878d0-glibc-2.3.2

lib

libc.so.6

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 23: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Outline

1 Continuous Integration

2 Release Management

3 Build Farms

4 The Solution: Nix

5 Implementing a Build Farm with Nix

6 Conclusion

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 24: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Implementing a Build Farm with Nix

So why is this useful for a build farm?

The Nix expression language is ideal for describing the buildtasks to be performed.

The Nix expression language makes it easy to describe variantcompositions.

Nix manages the dependencies (and thus the buildenvironment).

Nix supports distributed builds in a semi-transparent way.

The hashing scheme + complete dependencies allow builds tobe reproduced reliably.

Efficiency: due to the hashing scheme, we only rebuild thingsthat have actually changed.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 25: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Making Stratego/XT Releases

What each release should contain:

A source distribution.

Binary distributions for a number of platforms. (Test setsshould also be run on each platform).

Build logs.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 26: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Making Stratego/XT Releases (2)

Building a source distribution

# Bring in some standard packages (compilers, etc.)

pkgs = (import .../all-packages);pkgsLinux = pkgs {system = "i686-linux"};

strategoxtTarball = revision: svnToSourceTarball revision {stdenv = pkgsLinux.stdenv;buildInputs = [pkgsLinux.autoconf pkgsLinux.automake ...];

};

svnToSourceTarball is a function that checks out sources from aspecific revision from a Subversion repository (as specified byversion.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 27: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Making Stratego/XT Releases (3)

Building a binary distribution for Linux

strategoxtBinary = revision: buildBinary(strategoxtTarball revision)

{stdenv = pkgsLinux.stdenv;withATerm = pkgsLinux.aterm;withSDF = pkgsLinux.sdf;

};

buildBinary performs a build of a source distribution.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 28: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Making Stratego/XT Releases (4)

Building a release page

strategoxtRelease = revision: makeReleasePage {stdenv = pkgsLinux.stdenv;sourceTarball = strategoxtTarball;binaries = [strategoxtBinary];

};

makeReleasePage creates a bunch of HTML and other files thatshould be uploaded to a server.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 29: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Making Stratego/XT Releases (5)

Instantiating

strategoxtHeadRelease = strategoxtRelease {url = https://svn.cs.uu.nl/repos/StrategoXT/trunk;rev = (HEAD revision);

};

strategoxt010Release = strategoxtRelease {url = https://svn.cs.uu.nl/repos/StrategoXT/tags/0.10;rev = 6812;

};

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 30: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Distributed Builds

Nix expressions specify on what system a package is to bebuilt.

derivation {name = "strategoxt-0.10";builder = ./builder.sh;system = "powerpc-darwin";

}

Normally, if we build this on (say) a i686-linux:

$ nix-env -i foo.nix ...

error: I am a ‘i686-linux’, but a‘powerpc-darwin’ is required to build this.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 31: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Distributed Builds

Solution: we can configure Nix with a mapping from systemtypes to machines (e.g., powerpc-darwin ⇒bigmac.cs.uu.nl).

If we then try to perform the build, Nix will:

Send all build inputs to bigmac.cs.uu.nl.Run Nix on that machine to perform the build.Copy back the result.

Different subexpressions can require different system types(useful for build farms and cross-compilation).

Builds are performed in parallel.

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 32: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Making Stratego/XT Releases (5)

Building for Multiple Platforms

pkgs = (import .../all-packages);pkgsLinux = pkgs {system = "i686-linux";};pkgsDarwin = pkgs {system = "powerpc-darwin";};

strategoxtBinary = pkgs: revision: buildBinary(strategoxtTarball revision)

{stdenv = pkgs.stdenv;withATerm = pkgs.aterm;withSDF = pkgs.sdf;

};

strategoxtBinaries = revision: [(strategoxtBinary pkgsLinux revision)(strategoxtBinary pkgsDarwin revision)

];

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 33: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Making Tiger Releases

Building Tiger Binaries

tigerTarball = ...;

tigerBinary = revision: strategoxt: buildBinary(tigerTarball revision)

{stdenv = pkgsLinux.stdenv;withStrategoXT = strategoxt;

};

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 34: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Multiple Compositions

Building Tiger Binaries

tigerHeadRelease = strategoxtRelease {url = https://svn.cs.uu.nl/repos/tiger/trunk;rev = (HEAD revision);

};

tiger12Release = strategoxtRelease {url = https://svn.cs.uu.nl/repos/tiger/tags/1.2;rev = ...;

};

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 35: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Multiple Compositions

Building Tiger Binaries

tigerBinaries = [(tigerBinary (tigerHeadRelease)(strategoxtBinary (strategoxtHeadRelease)))

(tigerBinary (tigerHeadRelease)(strategoxtBinary (strategoxt010Release)))

(tigerBinary (tiger12Release)(strategoxtBinary (strategoxtHeadRelease)))

(tigerBinary (tiger12Release)(strategoxtBinary (strategoxt010Release)))

]

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 36: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Multiple Compositions

Building Tiger Binaries

tigerBinaries =[ tigerBinary t s| t <- [tigerHeadRelease tiger12Release], s <- [strategoxtHeadRelease strategoxt010Release]];

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 37: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Outline

1 Continuous Integration

2 Release Management

3 Build Farms

4 The Solution: Nix

5 Implementing a Build Farm with Nix

6 Conclusion

Eelco Dolstra Continuous Integration and Release Management with Nix

Page 38: Continuous Integration and Release Management with Nix · Continuous Integration and Release Management with Nix Eelco Dolstra ... Continuous Integration When developing multiple

Conclusion

The Nix build farm:

Allows safe and efficient management of dependencies.

Ensures reproducibility.

Supports multi-platform builds.

Is efficient: only changed things are rebuilt.

Produces actual releases.

More information:http://www.cs.uu.nl/groups/ST/Trace/Nix.

Eelco Dolstra Continuous Integration and Release Management with Nix