No description
Find a file
Lars Karlitski 0dd939b658 stages/dnf: only write known options to repo file
Don't pass through arbitrary options. This means that pipeline repo
objects don't have the same options as dnf repo files anymore:

1. Hard code repo name to repo id. The name has no influence on the
resulting image and should thus not appear in a pipeline.

2. Set gpgcheck=1 when gpgkey is given. It defaults to false, which
means that all sample and test pipelines didn't verify packages. It
would have failed anyway, because the container doesn't have the key
referenced in /etc. Change all gpgkeys to refer to the key id and import
them manually.

3. Don't allow lists for baseurl and gpgkey. We can add that if we need
it at some point.
2019-09-24 20:17:04 +02:00
assemblers assemblers/tar: Allow creating tar archive without any compression 2019-09-10 14:55:40 +02:00
osbuild tree-wide: always explicitly pass check to subprocess.run 2019-09-24 20:17:04 +02:00
samples stages/dnf: only write known options to repo file 2019-09-24 20:17:04 +02:00
stages stages/dnf: only write known options to repo file 2019-09-24 20:17:04 +02:00
test stages/dnf: only write known options to repo file 2019-09-24 20:17:04 +02:00
.gitignore gitignore: Add test directories to gitignore 2019-09-10 09:22:26 +02:00
.packit.yaml packit: use default tarball and version behavior 2019-09-16 15:16:37 +02:00
.pylintrc pylint: disable too-many-arguments rule 2019-07-24 12:55:48 +02:00
.travis.yml run timezone and firewall tests in CI 2019-09-10 22:40:48 +02:00
bump-version.sh release version 2 2019-09-18 00:05:43 +02:00
LICENSE Add LICENSE 2019-04-09 18:18:44 +02:00
Makefile Remove tarball-alternative rule and replace tarball rule 2019-09-02 10:28:21 +02:00
MANIFEST.in introduce spec file and related build scripts 2019-07-23 15:22:40 +02:00
osbuild-run tree-wide: always explicitly pass check to subprocess.run 2019-09-24 20:17:04 +02:00
osbuild.spec release version 2 2019-09-18 00:05:43 +02:00
README.md stages/dnf: only write known options to repo file 2019-09-24 20:17:04 +02:00
setup.py release version 2 2019-09-18 00:05:43 +02:00
tree-diff tools: add a helper to generate a 'deep diff' of two trees 2019-09-18 14:53:02 +02:00

osbuild

A build system for operating system images, working towards an image build pipeline that's more comprehensible, reproducible, and extendable.

Pipelines

The build process for an image is described by a pipeline. Each stage in a pipeline is a program that, given some configuration, modifies a file system tree. Finally, an assembler takes a filesystem tree, and assembles it into an image. Pipelines are defined as JSON files like this one:

{
  "name": "Example Image",
  "stages": [
    {
      "name": "org.osbuild.dnf",
      "options": {
        "releasever": "30",
        "basearch": "x86_64",
        "repos": {
          "fedora": {
            "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch",
            "gpgkey": "F1D8 EC98 F241 AAF2 0DF6  9420 EF3C 111F CFC6 59B9"
          }
        },
        "packages": [ "@Core", "grub2-pc", "httpd" ]
        }
    },
    {
      "name": "org.osbuild.systemd",
      "options": {
        "enabled_services": [ "httpd" ]
      }
    },
    {
      "name": "org.osbuild.grub2",
      "options": {
        "root_fs_uuid": "76a22bf4-f153-4541-b6c7-0332c0dfaeac"
      }
    }
  ],
  "assembler": {
    "name": "org.osbuild.qcow2",
    "options": {
      "filename": "example.qcow2",
      "root_fs_uuid": "76a22bf4-f153-4541-b6c7-0332c0dfaeac",
      "size": 3221225472
    }
  }
}

osbuild runs each of the stages in turn, isolating them from the host and from each other, with the exception that they all operate on the same filesystem-tree. The assembler is similarly isolated, and given the same tree, in read-only mode and assembles it into an image without altering its contents.

The filesystem tree produced by the final stage of a pipeline, is named and optionally saved to be reused as the base for future pipelines.

Each stage is passed the (appended) options object as JSON over stdin.

The above pipeline has no base and produces a qcow2 image.

Running

usage: python3 -m osbuild [-h] [--build-pipeline PIPELINE] [--store DIRECTORY]
                   [-l DIRECTORY] -o DIRECTORY
                   PIPELINE

Build operating system images

positional arguments:
  PIPELINE              json file containing the pipeline that should be built

optional arguments:
  -h, --help            show this help message and exit
  --build-pipeline PIPELINE
                        json file containing the pipeline to create a build
                        environment
  --store DIRECTORY     the directory where intermediary os trees are stored
  -l DIRECTORY, --libdir DIRECTORY
                        the directory containing stages, assemblers, and the
                        osbuild library

required named arguments:
  -o DIRECTORY, --output DIRECTORY
                        provide the empty DIRECTORY as output argument to the
                        last stage

Running example

You can build basic qcow2 image of Fedora 30 by running a following command:

sudo python3 -m osbuild -o output --libdir . samples/base-qcow2.json
  • Root rights are required because osbuild heavily relies on creating systemd containers and bind mounting.

    It shouldn't interfere with host OS but please be careful! It's still under development!

  • --libdir argument is required because osbuild expects itself to be installed in directories under /usr. Using this argument you can change the expected path.

  • You don't need to use any kind of virtual environment, modern version of Python 3 is enough. osbuild uses only standard library and linux commands.