Building in Docker
Note: This method is under development.
This is a bit tongue-in-cheek but describes the problem in general terms.
The problem being solved here is how to describe and populate a build space. Here, a build space is a (binary) scalar field across a discrete, multi-dimensional space with the following axes:
- A platform is specified by its distribution name (Debian, Ubuntu, Fedora, Scientific, Mac OS X) its release version string and a set of additional OS-level packages.
- A release is specified by a git tag, hash or other ref on lbne-build .
- The environment includes any peculiarities about the environment in which the build is run which is independent from the above.
The binary scalar value of this space is then either "true" if its combination is supported for "false" if not. This scalar field (and the defined extent of the space) changes over time as new platforms are created, new software releases are made, new build environments are added and their combined support is added or removed.
To be meaningful the platform actually has dependence on the release. In general, different releases will make different demands on prerequisite packages provided by the platform. The base distribution may or may not provide these and thus they must be met by including them in the set of additional OS-level packages.
The environment which is independent from platform and releases includes things like the need to account for HTTP/FTP proxies when building on a host present on a LAN which is firewalled from the Internet. It can also include basic networking such as which DNS servers to use. While these things are separate from the platform they imply a level of custom configuration of that platform which is dependent on the vagaries of the environment in which the build takes place. Note that this environment constraint has implication at build time and later run-time of the build products.
Note: currently this only applies to platforms that run Linux (ie, Mac OS X excluded).
At any given time, a subset of the space is described in a concise configuration file. Each section of the file represents one "build point". The section is interpreted by building a Docker image containing the platform, release and environment. If the build and any subsequent validations succeed then the "binary scalar field" has a value of "true" at the corresponding point.
A partial build consisting of just the platform is done as it is expected to be (re)used by more than one release. An attempt to handle all known environments is made by supplying shell initialization code that will "do the right thing" depending on what environment it encounters.
Each point in the build space is named like:
- names the GNU/Linux distribution (Debian, etc)
- names the released version
- a simple monotonically increasing integer that counts changes in the set of additional OS-level packages installed
- an identifier for the LBNE software release. This is not specified for builds that are meant to only include the platform