Making use of GHC bindists built by GitLab CI

Posted on June 11, 2019

The new GHC GitLab CI infrastructure builds hundreds of different commits a week. Each commit on master is built, as well as any merge requests; each build produces an bindist which can be downloaded and installed on the relevant platform.

ghc-artefact-nix provides a program ghc-head-from which downloads and enters a shell providing an artefact built with GitLab CI.

Using ghc-artefact-nix

You can install ghc-head-from using NUR.

nix-shell -p nur.repos.mpickering.ghc-head-from

There are three modes of operation.

Grab a recent commit from master

ghc-head-from

Grab a merge request

ghc-head-from 1107

Grab a specific bindist (for example, from a branch or fork)

ghc-head-from https://gitlab.haskell.org/ghc/ghc/-/jobs/98842/artifacts/raw/ghc-x86_64-fedora27-linux.tar.xz

The URL you provide has to be a direct link to a fedora27 bindist.

Technical Details

The bindist is downloaded from the (very flaky) CDN and patched to remove platform specific paths. The fedora27 job is used because it is built using ncurses6 which works better with nix.

Using an artefact in a nix expression

The old-ghc-nix repo provides a mkGhc function which can be used in a nix expression to create an attribute for a specific bindist. It is also packaged using NUR.

nur.repos.mpickering.ghc.mkGhc
  {  url = "https://gitlab-artifact-url.com"; hash = "sha256"; ncursesVersion = "6"; }

The ncursesVersion attribute is important to set for fedora27 jobs as the function assumes that the bindist was built with deb8 which uses ncurses5.

If you plan on using the artefact for a while then make sure you click the “keep” button on the artefact download page as otherwise it will be deleted after a week. This is very useful if you are developing a library against an unreleased version of the compiler and want to make sure all your collaborators are using the same version of GHC.