Sander van der Burg
Changing non-functional requirements and various developments in the software engineering process have increased programmer productivity and the quality of software systems. A negative side effect is that they have significantly increased the software deployment process of software systems, which consists of all activities to make a software system available for use, such as building, package, installing, activating and upgrading software components.
In the early days, software was written for a dedicated machine and deployed only once. The latest generation of systems are offered as services through the Internet (i.e. the cloud) and are accessible by nearly anyone from almost any place. These type of systems are very complex — they consist of a large collection components implemented in various programming languages, using various component technologies, distributed across multiple machines in a network, and may run on various operating systems. For these types of systems, the software deployment process is labourious, error prone, inefficient. Moreover, it is difficult to guarantee that important non-functional requirements are properly supported, such as reliability, and privacy, and to ensure that licenses under which the components are governed are properly obeyed.
In this thesis, we work towards a fully automated deployment solution capable of deploying modern generation systems in a reliable, reproducible, generic and efficient manner. These quality attributes are inspired by the Nix package manager which scope is limited to single systems. As deployment processes of modern systems are distributed and incorporate both technical aspects which can be solved in a generic manner as well as domain-specific non-functional aspects, we cannot solve these processes in a generic manner.
As a solution, we propose a reference architecture for distributed software deployment that captures several components implementing general deployment aspects, such as service deployment and infrastructure deployment, in which domain-specific deployment components can be integrated. The reference architecture can be turned into a concrete architecture for a domain-specific deployment tool. Furthermore, we use an important architectural pattern to combine these components, so that most of our desired quality attributes can be achieved.
In addition to the reference architecture, this thesis describes how various deployment aspects are implemented, such as Disnix providing distributed service deployment and DisnixOS providing complementary infrastructure deployment. Both of these tools extend the concepts of the Nix package manager to distributed systems. Besides tools, we also address a number of general concepts, and a very important non-functional aspect concerning software licenses.