Difference between revisions of "Building in Docker"

From DUNE
Jump to navigation Jump to search
Line 7: Line 7:
 
== Build Space ==
 
== Build Space ==
  
This is a bit tongue-in-cheek but describes the problem in general terms.
+
To put it in general terms,
+
the problem being solved here is how to describe and populate a <b>build space</b>.  Here, a build space is a (binary) scalar field across a discrete, multi-dimensional space with the following axes:
The problem being solved here is how to describe and populate a <b>build space</b>.  Here, a build space is a (binary) scalar field across a discrete, multi-dimensional space with the following axes:
 
  
 
; platforms : A <b>platform</b> 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.
 
; platforms : A <b>platform</b> 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.
Line 29: Line 28:
 
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.
 
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.
+
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.
  
 
== Naming Conventions ==
 
== Naming Conventions ==
Line 35: Line 34:
 
Each point in the build space is named like:
 
Each point in the build space is named like:
  
  <nowiki><distroname>-<distroversion>-<packagenum>[-<release>]</nowiki>
+
  <nowiki>lbne-<release>-<distroname>-<distroversion>-<build></nowiki>
  
 
Where:
 
Where:
  
; distroname : names the GNU/Linux distribution (Debian, etc)
+
; lbne : just a marker
; distroversion : names the released version
+
; release : an identifier for the LBNE software release version.
; packagenum : a simple monotonically increasing integer that counts changes in the set of additional OS-level packages installed
+
; distroname : lower-case, one word names the GNU/Linux distribution ("debian", "fedora", "scientific", "ubuntu", etc)
; release : an identifier for the LBNE software release. This is not specified for builds that are meant to only include the platform
+
; distroversion : dotted-numerical released version string ("7.7", "14.04", etc)
 +
; build : a monotonically increasing integer to number any changes not captured by the other identifiers such as a change in additional OS-level packages needed to satisfy any prerequisites.
 +
 
 +
Example:  
 +
 
 +
lbne-0.5.1-debian-7.7-1

Revision as of 19:37, 30 December 2014

Overview

The Software Builds can be done with and in Docker containers using lbne-docker . See the README file there for details.

Note: This method is under development.

Build Space

To put it 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:

platforms 
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.
releases 
A release is specified by a git tag, hash or other ref on lbne-build .
environment 
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.

Strategy

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.

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.

Naming Conventions

Each point in the build space is named like:

lbne-<release>-<distroname>-<distroversion>-<build>

Where:

lbne 
just a marker
release 
an identifier for the LBNE software release version.
distroname 
lower-case, one word names the GNU/Linux distribution ("debian", "fedora", "scientific", "ubuntu", etc)
distroversion 
dotted-numerical released version string ("7.7", "14.04", etc)
build 
a monotonically increasing integer to number any changes not captured by the other identifiers such as a change in additional OS-level packages needed to satisfy any prerequisites.

Example:

lbne-0.5.1-debian-7.7-1