Most other docs folders in the repo are called `doc` too, let's make this consistent. Change-Id: Icd712429b51763076548c977321e370f2a77877e Reviewed-on: https://cl.tvl.fyi/c/depot/+/2741 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
		
			
				
	
	
		
			114 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
title: "Tvix - Architecture & data flow"
 | 
						|
numbersections: true
 | 
						|
author:
 | 
						|
- adisbladis
 | 
						|
- flokli
 | 
						|
- tazjin
 | 
						|
email:
 | 
						|
- adis@blad.is
 | 
						|
- mail@tazj.in
 | 
						|
lang: en-GB
 | 
						|
classoption:
 | 
						|
- twocolumn
 | 
						|
header-includes:
 | 
						|
- \usepackage{caption, graphicx, tikz, aeguill, pdflscape}
 | 
						|
---
 | 
						|
 | 
						|
# Background
 | 
						|
 | 
						|
We intend for Tvix tooling to be more decoupled than the existing,
 | 
						|
monolithic Nix implementation. In practice, we expect to gain several
 | 
						|
benefits from this, such as:
 | 
						|
 | 
						|
- Ability to use different builders
 | 
						|
- Ability to use different store implementations
 | 
						|
- No monopolisation of the implementation, allowing users to replace
 | 
						|
  components that they are unhappy with (up to and including the
 | 
						|
  language evaluator)
 | 
						|
- Less hidden intra-dependencies between tools due to explicit RPC/IPC
 | 
						|
  boundaries
 | 
						|
 | 
						|
Communication between different components of the system will use
 | 
						|
gRPC. The rest of this document outlines the components.
 | 
						|
 | 
						|
# Components
 | 
						|
 | 
						|
## Coordinator
 | 
						|
 | 
						|
*Purpose:* The coordinator (in the simplest case, the Tvix CLI tool)
 | 
						|
oversees the flow of a build process and delegates tasks to the right
 | 
						|
subcomponents. For example, if a user runs the equivalent of
 | 
						|
`nix-build` in a folder containing a `default.nix` file, the
 | 
						|
coordinator will invoke the evaluator, pass the resulting derivations
 | 
						|
to the builder and coordinate any necessary store interactions (for
 | 
						|
substitution and other purposes).
 | 
						|
 | 
						|
While many users are likely to use the CLI tool as their primary
 | 
						|
method of interacting with Tvix, it is not unlikely that alternative
 | 
						|
coordinators (e.g. for a distributed, "Nix-native" CI system) would be
 | 
						|
implemented. To facilitate this, we are considering implementing the
 | 
						|
coordinator on top of a state-machine model that would make it
 | 
						|
possible to reuse the FSM logic without tying it to any particular
 | 
						|
kind of application.
 | 
						|
 | 
						|
## Evaluator
 | 
						|
 | 
						|
*Purpose:* Eval takes care of evaluating Nix code. In a typical build
 | 
						|
flow it would be responsible for producing derivations. It can also be
 | 
						|
used as a standalone tool, for example, in use-cases where Nix is used
 | 
						|
to generate configuration without any build or store involvement.
 | 
						|
 | 
						|
*Requirements:* For now, it will run on the machine invoking the build
 | 
						|
command itself. We give it filesystem access to handle things like
 | 
						|
imports or `builtins.readFile`.
 | 
						|
 | 
						|
In the future, we might abstract away raw filesystem access by
 | 
						|
allowing the evaluator to request files from the coordinator (which
 | 
						|
will query the store for it). This might get messy, and the benefits
 | 
						|
are questionable. We might be okay with running the evaluator with
 | 
						|
filesystem access for now and can extend the interface if the need
 | 
						|
arises.
 | 
						|
 | 
						|
## Builder
 | 
						|
 | 
						|
*Purpose:* A builder receives derivations from the coordinator and
 | 
						|
builds them.
 | 
						|
 | 
						|
By making builder a standardised interface it's possible to make the
 | 
						|
sandboxing mechanism used by the build process pluggable.
 | 
						|
 | 
						|
Nix is currently using a hard-coded
 | 
						|
[libseccomp](https://github.com/seccomp/libseccomp) based sandboxing
 | 
						|
mechanism and another one based on
 | 
						|
[sandboxd](https://www.unix.com/man-page/mojave/8/sandboxd/) on macOS.
 | 
						|
These are only separated by [compiler preprocessor
 | 
						|
macros](https://gcc.gnu.org/onlinedocs/cpp/Ifdef.html) within the same
 | 
						|
source files despite having very little in common with each other.
 | 
						|
 | 
						|
This makes experimentation with alternative backends difficult and
 | 
						|
porting Nix to other platforms harder than it has to be. We want to
 | 
						|
write a new Linux builder which uses
 | 
						|
[OCI](https://github.com/opencontainers/runtime-spec), the current
 | 
						|
dominant Linux containerisation technology, by default.
 | 
						|
 | 
						|
With a well-defined builder abstraction, it's also easy to imagine
 | 
						|
other backends such as a Kubernetes-based one in the future.
 | 
						|
 | 
						|
## Store
 | 
						|
 | 
						|
*Purpose:* Store takes care of storing build results. It provides a
 | 
						|
unified interface to get file paths and upload new ones.
 | 
						|
 | 
						|
Most likely, we will end up with multiple implementations of store, a
 | 
						|
few possible ones that come to mind are:
 | 
						|
 | 
						|
- Local
 | 
						|
- SSH
 | 
						|
- GCP
 | 
						|
- S3
 | 
						|
- Ceph
 | 
						|
 | 
						|
# Figures
 | 
						|
 | 
						|

 |