Why Baker?

After 10 years of industry and teaching nearly 1000 students various software engineering courses, including a specialized course on DevOps, I saw one common problem that has not gotten better. It was amazing to see how difficult and widespread the simple problem of installing and configuring software tools and dependencies was for everyone. The combination of versions and variations in tools, programming language, services, and operating system creates immense complexity.

First, we started teaching the graduate students how to use a mix of tools including Vagrant, Docker, Ansible. After a semester of teaching students these tools, they were able to successfully do great things; however, training needed to learn these tools requires a large investment — -time most people not specializing in software engineering/infrastructure do not have.

We built Baker to allow anyone to create their own computing environments without needing to know specialized tooling and to allow users to get to speed quickly. We tried to take the best of all the tools we were inspired from and package it into one simple experience.

Bakelets

Bakelets are modules that install components such as a language (nodejs, python, java), tool (latex, jupyter), or service (mysql, docker, neo4j). So far, we’ve created dozens of different computing environments for different research and software projects by just composing the bakelets. Our goal is to provide a set of curated components that make it easy to build the most common types of computing environments needed. We also support the ability to create custom bakelets. Long-term we will integrate research we have that takes advantage of our ability to auto-discover dependencies and set those up as needed.

Baker Implementation

Baker started out like much other tools — we started with using wrappers around existing tools and scripted together a common workflow. However, overtime, as we started to understand how these tools worked and what we needed from them, we were able to replace their functionality with a simpler re-implementation. For example, we initially used vagrant to help provision VirtualBox machines. But at the core, vagrant is simply making calls to VBoxManage. We eventually were able to replace Vagrant with a new npm module, node-virtualbox. As a result, we were able to greatly speed up time to provision machines as well as avoid several issues/bugs with Vagrant. The current implementation of bakelets uses a mixture of nodejs and Ansible scripts. Overtime, we believe we could reduce/replace Ansible as well. Again, Ansible at its core is simply making ssh calls with the help of python scripts copied over to the target server.

Baker uses a small microkernel to host the Ansible configuration server, runc, and provide a host kernel for Baker containers. The microkernel runs completely in ram with a custom initramfs and kernel running alpine linux. For Mac, we’re able to run this completely in the mac.hypervisor framework. We’d like to be able to target building custom microkernels for hosting baker environments in the future as well.

Trying out Baker

Currently, VirtualBox is required if you’re creating VMs.

You can install Baker from source.

git clone https://github.com/ottomatica/Baker

cd Baker

npm install

npm link

Or use brew:

brew install ottomatica/ottomatica/baker — devel

Binary downloads (Windows) and more instructions are available in the installation documentation.

Finally, we have several example programming environments we have created for a getting started with Baker.