GNU Guix - Reproducible Development Environments

There’s a lot of work going on at the moment around how to ensure building your development environment for a any given project can be made reliable and reproducible. Much of the emphasis has been around using tools like Vagrant or Docker etc. in order to create a virtual machine/container that your dependencies get installed into. In fact at Talis we use a Puppetised Vagrant setup to ensure our local development environments mirror our live environments as closely as possible.

I was interested to read about GNU Guix which is a slightly different solution to the same problem; which comes with its own set of challenges, it’s essentially a package manager that creates a shell running your dependencies

I’d be interested to hear how others are solving this problem?


I used to run a vagrant + puppet setup, however I found that it just ran too damn slow (even with NFS) to get any real work done.

I’ve gone back to the match as close as possible on native setup with CI to run on the same software setup as production.

The less moving parts you have, the better it tends to be.

Guix sounds interesting, will take a look at it

Seems like a interesting idea, I often compile stuff with ./configure --prefix= so I don’t have to put them system wide and this is what it does, from what I understand. However, I tried to install it on RedHat Enterprise 6 and it fails due to dependencies, which you think they of all people would be sympathetic to, seems like a bad sign to me. Also tried “nix” which wanted me to sudo to create a directory, also a bad sign.

Myself, I normally don’t have to worry about this too much; projects are written with node or python, and therefore the working environment is the project folder (for node) or an associated virtualenv (for python), and I know things will work the same way because I use Ubuntu and deploy to Ubuntu, rather than working on an OS which is different from the one I deploy to (so I don’t need complex VM setups or similar). Occasionally I’ll spin up an LXC as a container, but in general I don’t need to.

I’m having a go at doing this with Docker at the moment. Results are mixed. For one thing the size of the resulting container (based on Ubuntu) is several GB.

I’d be interested to hear if others have had success with container environments.

@sil Are you saying you write Ubuntu only apps? Have Canonical won their fight against open standards already? :smiley:

I am, in fact, saying that, yep. :slight_smile:

So my next *x laptop may as well be a Mac? :frowning:

Um. Why would you think that? Ubuntu SDK apps are written using open source code; the OS itself is open; you are allowed to run what you like on it even if it competes with Canonical’s business model.

What if Canonical does something I don’t like? Unix was developed to avoid application code being tied to a single hardware supplier. I don’t have much more freedom if my code will only run on one Linux distro, or only on a Google OS that they can change the direction of at any point.

I had the same discussion when AT&T moved Unix off the VAX as the standard reference platform, onto their own hardware, about the same time they closed the source code because they thought they could make more money that way, and provoked RMS into writing GNU.

I think code portabillity is important to software freedom. If an SDK is only available on one platform then there is little point in it being Open.

There’s nothing stopping you running Qt/QML apps with the Ubuntu widgets on other platforms. Go ahead and do so if you want to.

So we’ve given up on portable OSs and gone back to portable language environments, like COBOL (1960) or Wirth’s UCSD Pascal on P-system (1978)? I suddenly get why Docker Containers have become popular.

Last time Unix was strong, it split into BSD / System V factions and Windows won. This time, Canonical is being ‘the splitter’ and Google seem likely to rule the world. It’s SO depressing! Apple BSD or Google Linux?

“The clash of ideas is the sound of freedom, FLASHing” - Lady Bird Johnson/Bob Dylan

I haven’t worked with other humans since this question was asked. Have any better answers appeared in the last 5 years?
Let’s say I buy a new $199 Pinebook Pro and want to set it up to duplicate my normal working environment that I have on 2 different Linux distros and Mac OS, inc. Java, Clojure (CLI & Leiningen,) emacs with the right modules installed and a few other bits and pieces and set up a cloud service or two.
I need to configure OS, Java & emacs environments and install a few apps. Maybe I want to put web apps on a server. When I could find everything I needed in the Ubuntu repositories, I could automate that from an automated build config. It wasn’t too hard. I’ve worked in teams that manually built 1 PC then shadow it onto others (that required identical PCs so there were always multiple builds) and one’s that use server tool scripts but that wasn’t worth doing for less than half a dozen PCs.

Do any of the current tools do everything or can you lash them together with hairy string?

Proudly sponsored by Bytemark