Reference Guide Obs

obs-reference-guide

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 101

DownloadReference Guide Obs-reference-guide
Open PDF In BrowserView PDF
Reference Guide

Reference Guide: Open Build Service
by Adrian Schröter, Frank Schreiner, Karsten Keil, and Stefan Knorr

Publication Date: 01/23/2019
SUSE LLC

10 Canal Park Drive
Suite 200

Cambridge MA 02141
USA

https://www.suse.com/documentation
Copyright © 2006– 2019 SUSE LLC and contributors. All rights reserved.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free

Documentation License, Version 1.2 or (at your option) version 1.3; with the Invariant Section being this

copyright notice and license. A copy of the license version 1.2 is included in the section entitled “GNU
Free Documentation License”.

For SUSE trademarks, see http://www.suse.com/company/legal/ . All other third-party trademarks are the
property of their respective owners. Trademark symbols (®, ™ etc.) denote trademarks of SUSE and its
affiliates. Asterisks (*) denote third-party trademarks.

All information found in this book has been compiled with utmost attention to detail. However, this does

not guarantee complete accuracy. Neither SUSE LLC, its affiliates, the authors nor the translators shall be
held liable for possible errors or the consequences thereof.

Contents

About this Guide viii
1
1.1
1.2

2
2.1

OBS Architecture 1
Overview Graph 1

Communication Flow 4

OBS Concepts 7
Project Organization 7
Project Metadata 7 • Project Build Configuration 8 • Project Build
Macro Configuration 9 • An OBS Package 9

2.2

The OBS Interconnect 9

2.3

Download on Demand Repositories (DoD) 9
Motivation 9 • XML Document Hierarchy 10 • The
Daemon 10 • The download Element 10 • The master
Subelement 11 • The pubkey Subelement 11 • Repository Types 11

2.4

Integrating External Source Repositories 14
Motivation 14 • Creating an Reference to an External SCM 15 • Working
with Local Checkouts 16 • Managing Build Recipes in a SCM 16

3
3.1

Build Process 17
Phases of a Build Process 17
Preinstall Phase 17 • Install Phase 17 • Package Build 18 • After
the Build 18

3.2

Identify a build 18
Read DISTURL from a rpm 18 • Read DISTURL from a container 19

4
4.1

iii

Source Management 20
Find Package Sources 20

Reference Guide

5
5.1

Request And Review System 21
What a request looks like 21
Action Types 22 • Request states 23 • Reviewers 24 • Request
creation 24 • Request operations 24

6

Image Templates 26

6.1

Structure of Image Templates 26

6.2

Adding Image Templates to/Removing Image Templates from the Official
Image Template Page 26

6.3

7

Receiving Image Templates via Interconnect 26

Multiple Build Description File Handling 28

7.1

Overview 28

7.2

How Multibuild is Defined 28

8

Maintenance Support 30

8.1

Simple Project Setup 31

8.2

Using the Maintenance Process 32
Workflow A: A Maintainer Builds an Entire Update Incident for
Submission 32 • Workflow B: Submitting a Package Without
Branching 33 • Workflow C: Process Gets Initiated By the Maintenance
Team 34 • Maintenance Incident Processing 34 • Incident Gets
Released 35 • Incident Gets Reopened and Re-Released 35 • Using
Custom Update IDs 36

8.3

OBS Internal Mechanisms 36
Maintenance Incident Workflow 36 • Searching for Incidents 38

8.4

Setting Up Projects for a Maintenance Cycle 39
Defining a Maintenance Space 39 • Maintained Project Setups 39

8.5

Optional Channel Setup 39
Defining a Channel 39 • Using Channels in Maintenance Workflow 40

iv

Reference Guide

9

Binary Package Tracking 43

9.1

Which Binaries Are Tracked? 43

9.2

What Data Is Tracked? 43
Binary Identifier 43 • Binary Information 44 • Product
information 44

9.3

API Search Interface 44
Examples 45

10
10.1

Administration 46
OBS Components 46
Front-end 48 • Back-end 48 • Command Line Client 50 • Content
Delivery Server 50 • Requirements 50

10.2

OBS Appliances 51
Server Appliance 51 • Worker Appliance 51 • Image
Types 51 • Deployment 52 • Separating Data from the
System 52 • Updating the Appliance 53

10.3

Back-end Administration 53
Services 53 • Advanced Setups 54

10.4

Front-end Administration 54
Delayed Jobs 55 • Full Text Search 55

11

Scheduling and Dispatching 56

11.1

Definition of a Build Process 56

11.2

Scheduling Strategies 56
Build Trigger Setting 57 • Block Mode 57 • Follow Project Links 58

12

Build Job Constraints 59

12.1

hostlabel 59

12.2

sandbox 60

12.3

linux 60
version 60 • flavor 61

v

Reference Guide

12.4

hardware 61
cpu 61 • processors 62 • disk 62 • memory 63 • physicalmemory 63

12.5

Constraint Handling 64
More than half of the workers satisfy the constraints 64 • Less than
Half of the Workers Satisfy the Constraints 64 • No Workers Satisfy the
Constraints 64

12.6

Checking Constraints with osc 65

13

Building Preinstall Images 67

14

Authorization 68

14.1

OBS Authorization Methods 68
Default Mode 68 • Proxy Mode 68 • LDAP Mode 68

14.2

OBS Token Authorization 68
Managing User Tokens 69 • Executing a Source Service 69

15

Quality Assurance(QA) Hooks 71

15.1

Source Related Checks 71

15.2

Build Time Checks 71
In-Package Checks 71 • Post Build Checks 72 • Post Build Root
Checks 72 • KIWI Specific Post Build Root Checks 72

15.3

Workflow Checks 72
Automated Test Cases 72

16

openSUSE Factory 74

16.1

openSUSE:Factory project 74

16.2

Devel Projects 74

Glossary 75
A
A.1

vi

GNU Licenses 85
GNU General Public License 85

Reference Guide

A.2

vii

GNU Free Documentation License 87

Reference Guide

About this Guide
This guide is part of the Open Build Service documentation. These books are considered to
contain only reviewed content, establishing the reference documentation of OBS.

This guide does not focus on a specific OBS version. It is also not a replacement of the documentation inside of the openSUSE Wiki (https://en.opensuse.org/Portal:Build_Service) . However, content from the wiki may be included in these books in a consolidated form.

1 Available Documentation
The following documentation is available for OBS:
Book “Administrator Guide”

This guide offers information about the initial setup and maintenance for running Open
Build Service instances.
Article “Beginnerʼs Guide”

This guide describes basic workflows for working with packages on Open Build Service.

This includes checking out a package from an upstream project, creating patches, branching a repository, and more.
Book “Best Practice Guide”

This guide offers step-by-step instructions for the most common features of the Open Build
Service and the openSUSE Build Service.
Reference Guide

This guide covers ideas and motivations, concepts and processes of the Open Build Service
and also covers administration topics.
Book “User Guide”

This guide is intended for users and developers who want to dig deeper into Open Build
Service. It contains information on backgrounds, setting up your computer for working
with OBS, and usage scenarios.

viii

Available Documentation

2 Feedback
Several feedback channels are available:
Bugs and Enhancement Requests

Help for openSUSE is provided by the community. Refer to https://en.opensuse.org/Porfor more information.

tal:Support
Bug Reports

To report bugs for Open Build Service, go to https://bugzilla.opensuse.org/ , log in, and
click New.
Mail

For feedback on the documentation of this product, you can also send a mail to doc-

team@suse.com . Make sure to include the document title, the product version and the

publication date of the documentation. To report errors or suggest enhancements, provide
a concise description of the problem and refer to the respective section number and page
(or URL).

3 Documentation Conventions
The following notices and typographical conventions are used in this documentation:
/etc/passwd : directory names and le names
PLACEHOLDER : replace PLACEHOLDER with the actual value
PATH : the environment variable PATH
ls , --help : commands, options, and parameters
user : users or groups
package name : name of a package
Alt

,

Alt

– F1 : a key to press or a key combination; keys are shown in uppercase as on

a keyboard

File, File Save As: menu items, buttons
Dancing Penguins (Chapter Penguins, ↑Another Manual): This is a reference to a chapter in
another manual.

ix

Feedback

Commands that must be run with root privileges. Often you can also prefix these commands with the sudo command to run them as non-privileged user.
root # command
geeko > sudo command

Commands that can be run by non-privileged users.
geeko > command

Notices

Warning: Warning Notice
Vital information you must be aware of before proceeding. Warns you about security
issues, potential loss of data, damage to hardware, or physical hazards.

Important: Important Notice
Important information you should be aware of before proceeding.

Note: Note Notice
Additional information, for example about differences in software versions.

Tip: Tip Notice
Helpful information, like a guideline or a piece of practical advice.

4 Contributing to the Documentation
The OBS documentation is written by the community. And you can help too!
Especially as an advanced user or an administrator of OBS, there will be many topics where

you can pitch in even if your English is not the most polished. Conversely, if you are not very
experienced with OBS but your English is good: We rely on community editors to improve the
language.

x

Contributing to the Documentation

This guide is written in DocBook XML which can be converted to HTML or PDF documentation.
To clone the source of this guide, use Git:
git clone https://github.com/openSUSE/obs-docu.git

To learn how to validate and generate the OBS documentation, see the le README .
To submit changes, use GitHub pull requests:
1. Fork your own copy of the repository.
2. Commit your changes into the forked repository.
3. Create a pull request. This can be done at https://github.com/openSUSE/obs-docu

.

It is even possible to host instance-specific content in the official Git repository, but it needs to
be tagged correctly. For example, parts of this documentation are tagged as  . In this case, the paragraph will only become visible when creating the openSUSE ver-

sion of a guide.

xi

Contributing to the Documentation

1 OBS Architecture

1.1 Overview Graph
Open Build Service (OBS) is not a monolithic server; it consists of multiple daemons that fulfill
different tasks (see Figure 1.1, “Simplified OBS Component Overview”).

FIGURE 1.1: SIMPLIFIED OBS COMPONENT OVERVIEW

The OBS Back-end manages the source les and build jobs of the OBS.

1

Overview Graph

Source Server

Maintains the source repository and project/package configurations. It provides an HTTP
interface, which is the only interface for the Front-end and It may forward requests to
further back-end services.

The Source Server keeps track of all sources that are available for building. It takes care

of le deduplication so that every source le is stored only once. This is done by keeping
track of the MD5 hashes of the les in combination with the le names. All revisions of
committed sources are stored and will not be deleted. This guarantees the ability to get
the source for every delivered binary package.

Each OBS installation has one Source Server only. It maintains the "sources", "trees" and
"projects" directories.
Repository Server

A repository server provides access to the binaries via an HTTP interface. It is used by the
front-end via the source server only. Workers use the server for registration, requesting the
needed binaries for the build jobs and storing the result. Notifications for schedulers are

also created by repository servers. Each OBS installation has at least one repository server.
A larger installation using partitioning has one on each partition.
Scheduler

A scheduler calculates the need for build jobs. It detects changes in sources, project con-

figurations or in binaries used in the build environment. It is responsible for starting jobs

in the right order and integrating the built binary packages. Each OBS installation has one
scheduler per available architecture and partition. It maintains the cntent of the "build"
directory.
Dispatcher

The dispatcher takes a job (created by the scheduler) and assigns it to a free worker.
It also checks possible build constraints to verify that the worker qualifies for the job.

It only notifies a worker about a job; the worker downloads the needed resources itself
afterwards. Each OBS installation has one dispatcher per partition, one of which is the
master dispatcher.

The dispatcher tries to assign jobs fairly between the project repositories. For this the
dispatcher maintains a load per project repository (similar to the Unix system load) of

used build time. The dispatcher assigned jobs to build clients from the repository with

the lowest load (thereby increasing its load). It is possible to tweak this mechanism via

2

Overview Graph

dispatching priorities assigned to the repositories via the /build/dispatchprios API call

or via the dispatch_adjust map in the BSConfig.pm configuration le. See the dispatch
priorities in reference guide for more details.
Publisher

The publisher processes publish events from the scheduler for finished repositories. It

merges the build result of all architectures into a defined directory structure, creates the
needed metadata, and may sync it to a download server. It maintains the content of the
"repos" directory on the back-end. Each OBS installation has one publisher per partition.
Signer

The signer handles signing events and calls an external tool to execute the signing. Each

OBS installation usually has one signer per partition and also on the source server installation.

Source Service Server

The Source Service Server helps to automate processes for continuous integration. The

server can call different services for different tasks. It can download sources from websites
and version control systems such as subversion and git. Services can also include working

on the source to extract spec-les from archives, repacking the archives or adjusting version
numbers in spec les. It is also often used to enforce policies by running checks. A failed
check will appear as broken source and blocks a package from building.

The Source Service Server is optional and currently only one Source Service Server is
supported.

Download on Demand Updater (dodup) (OBS version 2.7 or later)

The download on demand updater monitors all external repositories which are defined as

download on demand resources. It polls for changes in the metadata and re-downloads the
metadata in case. The scheduler will be notified to recalculate the build jobs depending on
these repositories afterwards. Each OBS installation can have one dodup service running
on each partition.

Delta Store (OBS version 2.7 or later)

The delta store daemon maintains the deltas in the source storage. Multiple obscpio

archives can be stored in one deltastore to avoid duplication on disk. This service calculates the delta and maintains the delta store. Each OBS installation can have one delta
store process running next to the source server.
Worker

3

Overview Graph

The workers register with the repository servers. They receive build jobs from the dispatcher. Afterwards they download sources from the source server and the needed binaries from

the repository server(s). They build the package using the build script and send the result

back to the repository server. A worker can run on the same host as the other services, but
most OBS installations have dedicated hardware for the workers.

1.2 Communication Flow
The communication ow can be split into 3 parts:
1. User-to-front-end communication
2. Front-end-to-source-server communication
3. communication between source server and other back-end components, in rst place the

repository servers.

The user is using the front-end (via tools like osc) to communicate with the Open Build Service.

The front-end is providing a web interface and also an API. The front-end is implemented as
Ruby on Rails application. All communication happens via the http protocol (normally encrypted
so https is used.

The communication between the front-end and the back-end also use the http protocol, using
the back-end source server as gateway to most of the other back-end components.

The figure Figure 1.2, “OBS Communication” shows the communication ow between the OBS components if a package source (e.g. a _service le) was updated.

If a source le of a package was updated, the new source le is uploaded with an HTTP PUT

operation to the front-end. The front-end may ask for authentication (if not already done) and

check the access rights for the user. If everything is OK, the new le will be send to the back-end
Source server via an HTTP PUT request as well. The source server stores the changed source

(under revision control) and check if for this change source service runs are needed. If yes
the Source Service server is informed via an HTTP PUT request of the _service le to run the
requested services.

The Source Service server runs the different source services, e.g download the requested revision
from a GIT server. After running all services it delivers the final sources back to the Source
server, which then store these under revision control as well.

The Source server then notifies the Schedulers (for each architecture) about the change of the
package via an event.

4

Communication Flow

The Scheduler recalculates the package and project state and if all build requires are solved,
a build Job is created and put in the Job pool. The notified Dispatcher checks for free worker
which met the build constraints for the job and send the job to the worker.

FIGURE 1.2: OBS COMMUNICATION

5

Communication Flow

The Worker downloads the sources from the Source server and all required binary packages
from the Repo server. The package then will be built, the worker is monitored by the warden
service to detect any worker crashes.

If the build was finished the build results (which are also contain build logs) the results are uploaded to the Scheduler again and if requested the Signer does sign the packages. The Scheduler

recalculate the project status if here are more dependent packages to build. If not it informs the
Publisher to publish the new build results and create an updated version of the repository. The
Publisher will also request signing of the repository metadata.

6

Communication Flow

2 OBS Concepts
We describe here the high-level concepts: how Open Build Service is designed, manages its
content and is supposed to work.

2.1 Project Organization
All sources and binaries which are hosted inside of OBS are organized into projects. A project
is the container defining a larger task. It defines who is working there.

2.1.1

Project Metadata

A project is configured in the project /source/$PROJECT/_meta path. It can be edited in the
web interface using the RAW Config tab or via command line with
osc meta prj -e $PROJECT

This le contains:
Generic description data in title and description elements.
An ACL list of users and groups connected with a role. The maintainer role defines the
list of users permitted to commit changes to the project.

A number of ags controlling the build and publishing process and possible read access
protections.

A list of repositories to be created. This list defines what other repositories should be used,
which architectures shall be built and build job scheduling parameters.

The following ags can be used to control the behavior of a package or project. Most of them
can also be limited to specified repositories or architectures.

7

Project Organization

build defines whether package sources should get built. If enabled, it signals the scheduler

to trigger server-side builds based on events like source changes, changes of packages

used in the build environment or manual rebuild triggers. A local build via CLI is possible
independent of this ag. Default is enabled.

publish can be used to enable or disable publishing the build result as repository. This

happens after an entire repository has finished building for an architecture. A publish also
gets triggered when the publish ag is enabled after a repository finishes the build. Default
is enabled.

debuginfo can be used to modify the build process to create debuginfo data along with the

package build for later debugging purposes. Changing this ag does not trigger rebuilds,
it just affects the next build. Default is disabled.

useforbuild is used to control if a built result shall be copied to the build pool. This

means it will get used for other builds in their build environment. When this is disabled,
the build has no influence on builds of other packages using this repository. In case a

former build exists the old binaries will be used. Disabling this ag also means that "wipe"
commands to remove binary les will have no effect on the build pool. Changing this ag
does not trigger rebuilds, it just affects the next build. Default is enabled.

access ag can be used to hide an entire project. This includes binaries and sources. It

can only be used at project creation time and can just be enabled (making it public again)
afterwards. This ag can only be used on projects. Default is enabled.

sourceaccess ag can be used to hide the sources, but still show the existence of a project

or package. This also includes debug packages in case the distribution is supporting this

correctly. This ag can only be used at package creation time. There is no code yet which
checks for possible references to this package. Default is enabled.

downloadbinary permission still exists like before. However, unlike "access" and

"sourceaccess" this is not a security feature. It is just a convenience feature, which makes it
impossible to get the binaries via the API directly. But it is still possible to get the binaries
via build time in any case. Default is enabled.

2.1.2

Project Build Configuration

A project is configured in the project /source/$PROJECT/_config path. It can be edited in
web interface in the Project Config tab or via one of the following command lines

8

Project Build Configuration

osc meta prjconf -e $PROJECT
osc co $PROJECT _project

This le contains information on how to set up a build environment.

2.1.3

Project Build Macro Configuration

The macro configuration is part of the build configuration in /source/$PROJECT/_config . It
can be added at the end after a Macros: line.

2.1.4

An OBS Package

An OBS Package is a sub-namespace below a project. It contains the specification of a single
package build for all specified repositories.

2.2 The OBS Interconnect
The OBS interconnect is a mechanism to connect two OBS instances. All content, including

sources and binary build results, will be available in the connecting instance. Unlike other methods the instances will also notify each other about changes.

2.3 Download on Demand Repositories (DoD)
2.3.1

Motivation

In a DoD repository external software repositories can be configured which are used for dependency resolution and where packages will be downloaded at build time. A DoD repository has
some main advantages in comparison to binary import projects:

less disk usage as only really required packages will be downloaded
automatic package updates when new upstream releases are available
simple to configure in project meta with no for shell access to repo servers

9

Project Build Macro Configuration

In download repotypes where package checksums can be verified (e.g. susetags, rpmmd and
deb), we recommend that you use a mirror server URL in  in order to reduce
traffic on the master server and configure a  with an https url and a sslfinger in
order to avoid man in the middle attacks by peer verification.

2.3.2

XML Document Hierarchy




 (optional)
 (optional)




2.3.3

The Daemon

The bs_dodup daemon periodically checks for new metadata in remote repositories. This daemon
can be enabled for startup with the command
systemctl enable obsdodup.service

and can be started with
systemctl start obsdodup.service

2.3.4

The download Element

mandatory attributes:
arch
url
repotype

10

XML Document Hierarchy

2.3.5

The master Subelement

The  tag as shown in the rpmmd example below is optional but strongly recommended
for security reasons.

Verification is supported in the following repotypes
susetags
rpmmd
deb
This option could be defined by any valid URL (HTTP and HTTPS) to the origin of the repository
but it is strongly recommended to use https with a sslfingerprint to bs_dodup possibility to

verify its peer in order to avoid man-in-the-middle attacks. The download URL can be a mirror
as we validate package checksums found in repo data.

You can easily query the SSL fingerprint of a remote server with the following command:
openssl s_client -connect : < /dev/null 2>/dev/null | openssl x509 fingerprint -noout

2.3.6

The pubkey Subelement

The pubkey element contains one or more GPG public keys in order to verify repository information but not packages. For an example, look at the repotype "deb" documentation below.

2.3.7

Repository Types

2.3.7.1

YAST Sources (susetags)

Example:

[...]



11

The master Subelement


x86_64
i586



2.3.7.2

RPM Sources (rpmmd)

Example:

[...]







x86_64
i586



2.3.7.3

Apt Repository (deb)

Apt supports two repository types, at repositories and distribution repositories.
The download url syntax for them is:
//
<at_url>/.[/]
You can specify multiple components separated by a comma.
An empty components string is parsed as "main".

12

Repository Types

Example:

[...]



-----BEGIN PGP PUBLIC KEY BLOCK----Version: GnuPG v1.4.12 (GNU/Linux)
[...]




-----BEGIN PGP PUBLIC KEY BLOCK----Version: GnuPG v1.4.12 (GNU/Linux)
[...]


x86_64
i586



2.3.7.4

Arch Repository (arch)

Be aware that there is currently no way to verify the origin of repository for Arch.
Example:

[...]



13

Repository Types


x86_64
i586



2.3.7.5

Mandriva Repository (mdk)

Example:

[...]



x86_64
i586



2.4 Integrating External Source Repositories
2.4.1

Motivation

This chapter makes some recommendations how upstream resources can be integrated into the
build process. SCM stands for source control management. git, subversion or CVS are concrete

implementations of an SCM. The OBS itself comes also with an own SCM, but this is only intended to manage the les needed for packaging. However, you can add references to external SCM
systems. The source service system will mirror the sources and provide it to the build systems.

14

Integrating External Source Repositories

OBS makes sure that you can access the sources of all builds also in the future, even when the

upstream server delivers different or no content at all anymore. Using external SCM references
has the following advantages:

It is documented where a source comes from and how to create the archive.
Working on the upstream sources can be done directly in local checkouts and changes can
be tested via local builds before pushing to the SCM server.

The sources can be stored incrementally and need less storage on the server.

2.4.2

Creating an Reference to an External SCM

External references are defined in _service les. The le can look like this:


git://...
git



*.tar
xz




The services do the following:
obs_scm : mirrors the source. It stores it as a cpio archive, but for the build process this

looks like a directory. It also stores additional information from the metadata to a le with
obsinfo suffix.

tar : creates a tar le from the directory
recompress : applies a compression on the tar le
set_version : reads the version from the obsinfo le and adapts the build descriptions

to it.

Note that only the rst service ( obs_scm ) runs on the OBS server. The other services run during

the build process. They can also be replaced by any user by providing alternative implementations of them, or by writing their own service from scratch.

15

Creating an Reference to an External SCM

2.4.3

Working with Local Checkouts

Using osc build in any package with such a definition will do the same process locally. The

only difference is that you get a local subdirectory with the SCM content. You can go inside and
work as you are used to. Any changes inside will be used for your next local build, whether they
were pushed to the upstream server or not. However, you need to push it upstream when you
let the OBS server re-fetch the changes from upstream. The only way out would be to set the
obs_scm service to mode disabled and upload your local archive.

2.4.4

Managing Build Recipes in a SCM

The obs_scm service allows you to export les next to the archive. You can specify one or more
les using the extract parameter. Use it for your build recipe les.

16

Working with Local Checkouts

3 Build Process
Each package build is created in a fresh environment. This is done to ensure that all dependencies
are available and that every later build produces identical results.

3.1 Phases of a Build Process
All sources and binaries which are hosted inside Open Build Service are organized in projects.

Projects host sources inside of OBS packages. The sources are build according to the repository
configuration inside of the project.

3.1.1

Preinstall Phase

This phase depends on the type of the buildroot (building environment). OBS supports three
different types of buildroots:
chroot
Xen
KVM
In the preinstall phase, the OBS Worker creates a small base system (chroot or VM Image)

with manually extracted packages (le system, coreutils, binutils, rpm/debutils, etc.), copies all
necessary build requirements into the base system.

3.1.2

Install Phase

Depending on the chosen build root, the worker starts a Xen or KVM virtual machine or enters

the build root. If this was successful, the install phase reinstalls all base packages from above and

additionally all packages you have defined in your build recipe. After this phase the environment
is ready to process the build recipe.

17

Phases of a Build Process

3.1.3

Package Build

Depending on the type of package, the buildroot executes different build commands:
RPM-based distributions: rpmbuild
Debian-based distributions: dpkg-buildpackage
Arch Linux: pacman .
How the build continues depends on the quality and the type of your build recipe. In most cases,
the source code will be compiled now and then be packed into the chosen package format.

To improve package quality, on RPM-based distributions there are additional security checks
and a linter called rpmlint .

3.1.4

After the Build

The generated packages are taken from the worker, are signed by the OBS signer and are published to the Repository.

3.2 Identify a build
OBS is usally tagging each build with an identifier. This can be used to nd the building OBS

instance, the project, repository and exact source for a binary. This information is stored in
some variable called DISTURL and is specified as obs://$OBS_INSTANCE/$PROJECT/$REPOSI-

TORY/$SOURCE_REVISION-$PACKAGE(:$FLAVOR) . Note that the last $:FLAVOR part is optional

and exists only when the package was build using the multibuild feature. The source specified

via the DISTURL can be accessed by pasting the URL into the search interface of the OBS web
interface. Or use the command line tool to check it out:
# osc checkout $DISTURL

You need to go to the right OBS instance as this is not handled automatically yet.

3.2.1

Read DISTURL from a rpm

Rpm binaries contain the DISTURL as tag. It can be read from the rpm database for installed
rpms and also from the rpm binaries itself.

18

Package Build

# rpm -q --qf '%{DISTRL}\n' $rpm

3.2.2

Read DISTURL from a container

Containers store the DISTURL as label. You will see only the DISTURL from the highest layer via
# docker inspect --format '{{.Config.Labels}}' $image_id

The disturl is always set via the key 'org.openbuildservice.disturl'.

19

Read DISTURL from a container

4 Source Management
4.1 Find Package Sources
OBS is adding information to each created package about the origin of the sources. This information is stored in the DISTURL tag of an rpm, which can be displayed as follows:
rpm -q --queryformat '%{DISTURL}\n' glibc
rpm -q --queryformat '%{DISTURL}\n' -p glibc-2.1.0-1.i586.rpm

The disturl can look like this:

obs://build.opensuse.org/openSUSE:Factory/stan-

dard/80d21fdd2299302358246d757b4d8c4f-glibc It always starts with obs:// . The second

part is the name of the build instance, which usually also hosts the Web UI. Next comes the

project name and the repository name where the binary got built. Last part is the source md5
sum and the package name.

The disturl can also be entered in the search eld of the web interface of the build service.

20

Find Package Sources

5 Request And Review System
The OBS comes with a generic request system where one party can ask another to complete a

certain action. This can be, for example, taking source changes, granting maintainer rights or
deleting a package. Requests are also used deal with more complex workflows.

A request is an object in the database. It can be accessed via the /request API route. osc and
the web interface can show and process these requests. There are also interfaces to show the
requests which should be handled for a certain user.

5.1 What a request looks like
A request is an object in the database. It can be accessed via the /request API route. Main parts
of the request are

state: The state tells if the request still needs to processed or has been handled already
and how.

actions: these are the changes which will be applied when accepting the request.
reviewer: reviewer can be added automatically at request creation time or manually by any
involved party. Usually all of them should approve the request before it will be accepted.
However, the target can ignore that and accept anyway optionally.
description: an explanation of why the actions should be done.
history: a history about state changes of the request.
accept_at: the request will get accepted automatically after the given time. Such a request
can only be created when having write permissions in the target. Automatic cleanup requests created by Admin user are using this.

Requests can only be accepted or rejected in their entirety. Therefore, it can make sense to have
multiple actions in one request if changes should be applied in one transaction. For example,

submitting a new package and removing an old instance: Do either both or nothing. This implies
that the person accepting the request must have write access in all targets or they will not be
allowed to accept the request.

21

What a request looks like

5.1.1

Action Types

Actions always specify some target. This can be either a project or a package. Further information
depend on the action type. The following gives an overview, for details, see the XML schema
for requests.

5.1.1.1

submit

A submit action will transfer sources from one package to another package. Usually a submit
request will refer to a specific revision in the source, but it does not have to. If no revision

is specified, then the current revision at the time of acceptance will be used. This should be

avoided when relying on complex reviews during the request process. Hence, it is recommended
to identify a specific version in your submitrequest ( osc submitrequest -r 42 ... ).

The submit action can support options to update the source or even to remove the source. Tools
like osc are applying the cleanup rule by default when submitting from a default user home
branch project.

5.1.1.2

delete

A delete action can request removal of a project or package instance.

5.1.1.3

add_role

An add_role requests a specific role for a given user or group to the target. For example, one
could use this to ask for maintainer rights, or to become a default reviewer.

5.1.1.4

set_bugowner

set_bugowner is similar to add_role, but removes all other bugowner roles in the target. This
happens to have a unique identifier to be used when assigning bug reports in external tools
like Bugzilla.

5.1.1.5

change_devel

can be used to update the devel package information in the target.

22

Action Types

5.1.1.6

maintenance_incident

Official request to open a maintenance incident for official support products. This create by
developers who want to start an official maintenance process. Find detail in the maintenance
chapter about this. If accepted, a new maintenance incident project is created and package

sources listed are copied there. All sources of all actions in one request will be merged into the
same maintenance incident.

5.1.1.7

maintenance_release

Is used to release a ready maintenance update. Unlike maintenance_incident or submit, sources
and binaries are copied without a rebuild. Details can be found in maintenance chapter.

5.1.1.8

group

Deprecated. Was never in a released OBS version. It is not allowed to be used anymore.

5.1.2

Request states

new: The default value for newly created requests. Everybody involved in the specified
targets can see the request and accept or decline it.

accepted: The request has been accepted and the changes applied. history les have a
reference to this request.

declined: The request has been reviewed and not (yet) been accepted by the target. This is
often used to ask for some more information from the submitter, since declined requests

remain active, returning to the submitter's active request queue (that is, the submitter will
need to take action now).

revoked: The submitter has taken back their request. The request is considered to be inactive now.

superseded: This request is obsolete due to a new request. The request is considered to be
inactive now. The superseding request is linked in this request.

review: There are still open reviews inside of the request. Nobody has declined it yet. The
request is not yet visible to the target by default. The state will change automatically to
new when all reviewers accept.

23

Request states

5.1.3

Reviewers

Reviews can be done by users, groups, projects or packages. Review by project or package means
that any maintainer of them is asked for reviews. This is handy to avoid the need to figure

who actually is a maintainer of a certain package. Also, new maintainers of a package will see
requests in case the old maintainer did not handle them.

5.1.3.1

Manual added reviews

Reviewers can be added manually by anyone involved in a request. This can be used to hand
over a review. In that situation the new reviewer needs to be added and the own review needs

to be accept. The request becomes declined when any of the reviewers are declining the request.

5.1.3.2

Automatic added reviews

Project and package objects can have users or groups with a reviewer role. They are added

automatically to a request as reviewer when a request is created which has them as target. In
case the project and package bother specify reviewer all of them are added to the request.

5.1.4

Request creation

The API is doing a number of checks on request creation time. In case a target is not specified

it tries to set it according to the linked package. If an entire project is specified as source it

expands it to refer all packages inside. This means it is replacing one action with multiple. When
using the addrevision parameter it does also add the current revision of the package source to
the action. This makes it easy to create new requests with little logic in the client.

5.1.5

Request operations

Requests can be modified only in very limited ways after creation. This is to avoid that reviewers
reviewed a request but the nature of the requests is changing afterwards. Valid operations on
a request are:

di: does not modify the request, just shows source modifications wanted by the request
changestate: to change the state of the request, for example to accept it.

24

Reviewers

changereviewstate: to change the state of a review inside of a request.
addreviewer: add further reviewer to a request

25

Request operations

6 Image Templates
Image templates are pre-configured image configurations. The image templates page (https://
build.opensuse.org/image_templates)

provides a list of these templates. Users can clone these

templates and further configure them as they like.

6.1 Structure of Image Templates
As mentioned image templates are essentially pre-configured KIWI (http://opensuse.github.io/kiwi/)

image configurations. As any KIWI configuration they usually contain a tarball containing

image sources, a config.sh le and the KIWI configuration XML le.

In addition, you can define an icon for your image templates by adding graphical image (for
example, PNG, JPG) to your template sources and name it _icon . If that le exists, it will be
used as icon for your image on the image templates page.

Note
For more information about KIWI images, see Book “User Guide”, Chapter 1 “Supported Build
Recipes and Package Formats”, Section 1.5 “KIWI Appliance”.

6.2 Adding Image Templates to/Removing Image
Templates from the Official Image Template Page
The image templates page lists templates per project. New templates get added by setting the

OBS:ImageTemplates attribute to a project. Any package container belonging to a project with

that attribute will be shown on the template page.

Only admins can add / remove the OBS:ImageTemplates attribute from a project.

6.3 Receiving Image Templates via Interconnect
If your OBS instance is connected to a remote instance via interconnect, OBS will fetch image

templates from the remote instance and present it on the image templates page. They appear
below the local templates.

26

Structure of Image Templates

For more information about interconnects, see Book “Administrator Guide”, Chapter 3 “Administration”, Section 3.2 “Managing Build Targets”.

27

Receiving Image Templates via Interconnect

7 Multiple Build Description File Handling
7.1 Overview
A package source may contain multiple build description les. They can be used depending on
the base distribution, the repository name or for different configurations. These mechanics can
be also combined.

The right build description le gets picked by filtering. The build will not start when either no
le matches or multiple candidates exist. The filtering happens with the following steps:

1. Based on the package build format of the based distributions. RPM-based distributions will

use spec les for example.

2. Based on the le name of the le before the suffix. It is not important as long as just one

le exists, but it has to match when multiple les exist. The name is defined by the build
container name, which is either defined in a _multibuild directive le or is the source
package name.

3. Specific les can be created to be built for a specific repository. Append the reposito-

ry name of the build container behind the package name with a -. For example hello-openSUSE_13.2.spec .

7.2 How Multibuild is Defined
Use the _multibuild directive to build the same source in the same repository with different

flavors. This handy to define all flavors in one place without the need to maintain packages with
local links. This allows also to transfer all sources including a possible changed flavor from one
project to another with a standard copy or submit request.

The _multibuild le lists all build container names, each of them will be build as usual for each
defined repository and each scheduler architecture.

For example, inside the kernel source package we can build both kernel-source and kernel-obs-build packages by listing them inside the le.

Multibuild packages are defined with the _multibuild directive le in the package sources.
The _multibuild le is an xml le. For example:


28

Overview

kernel-source
kernel-obs-build


Build description les are needed for each of them for each package (eg. kernel-source.spec or
kernel-obs-build.dsc) inside of the sources. There will be another build in case there is also a
matching le for the source package container name, otherwise it will turn into an “excluded”
state.

29

How Multibuild is Defined

8 Maintenance Support
This chapter explains the setup and workflow of a maintenance update in the openSUSE way.

However, this should not be limited to openSUSE distribution projects but be usable anywhere
(the entire workflow or just parts of it).

The goal of the OBS maintenance process is to publish updates for a frozen project, in this

example an entire distribution. These updates need to be approved by a maintenance team and
the published result must contain documentation about the changes and be applicable in the
easiest way by the users. The result is a package repository with additional information about

the solved problems and defined groups of packages to achieve that. Binary delta data can also
be generated to reduce the needed download size for the clients.

30

8.1 Simple Project Setup

FIGURE 8.1: SIMPLE PROJECT SETUP

31

Simple Project Setup

This figure gives an overview about the project setup and general workflow for a single pack-

age and single maintained distribution. It shows the "openSUSE:11.4" project, which is con-

sidered to be frozen and not changing at all anymore. The "openSUSE:11.4:Update" projects
hosts all officially released updates. It does not build any binary, just gets it sources and bi-

naries from the maintenance incident project via the release process. The incident project is
named "openSUSE:Maintenance:IDxxx" in this example, which is under control of the mainte-

nance team. Official updates get built and reviewed here. QA teams are also testing the binaries
from here. However, a user can prepare it in the same way in their project and start the maintenance process via doing a "maintenance" request.

openSUSE:11.4 is the GA Project in this example. Frozen and not changing anymore.
openSUSE:11.4:Update is the Update Project to release official updates.
openSUSE:Maintenance is the Maintenance Project.
openSUSE:Maintenance:IDxxx is the Incident project.

8.2 Using the Maintenance Process
This describes all required steps by all involved persons from preparing to releasing a maintenance update.

8.2.1 Workflow A: A Maintainer Builds an Entire Update Incident
for Submission
A user is usually starting to prepare an update by creating a maintenance branch. This is typically
done by creating an own maintenance project. Usually multiple released products are affected,
so the server can nd out which one are maintained by a given source package name, in this
example for glibc including checkout via
osc mbranch glibc
osc mbranch --checkout glibc

This is equivalent to the API call /source?cmd=branch&package=glibc .
It is also possible to branch only one defined version, if it is known that only one version is
affected. In this example the openSUSE:12.1 version:
osc branch --maintenance openSUSE:12.1 glibc

32

Using the Maintenance Process

osc branch -M -c openSUSE:12.1 glibc

NOTE: both branch commands do support the --noaccess parameter, which will create a hidden
project. This may be used when a not yet publicly known security issue is get xed.

Afterwards the user needs to do the needed modifications. Packages will be built and can be

tested. Afterwards they may add information about the purpose of this maintenance update via
osc patchinfo

If the source changes contain references to issue trackers (like Bugzilla, CVE or FATE) these will
be added to the _patchinfo le.

The server will create a full maintenance channel now, in case the user wants to test this as

well. After the user has tested, they have to create a maintenancerequest to ask the maintenance
team to accept this as an official update incident:
osc maintenancerequest

On accepting this request all sources of the entire project will get copied to the incident project
and be rebuild. The origin project gets usually removed (based on the request cleanup options).

8.2.2

Workflow B: Submitting a Package Without Branching

You may submit a package source from a project which is not prepared as maintenance project.
That works via the maintenancerequest mechanism by specifying one or more packages from

one project. As a consequence it means also that the rst testable build will happen in the

maintenance incident project. Also, the maintenance team need to write the update information
on their own.

osc maintenancerequest [ SOURCEPROJECT [ SOURCEPACKAGES RELEASEPROJECT ] ]

The following example is submitting two packages (kdelibs4 and kdebase4) from the project
KDE:Devel project as update for openSUSE:12.1

osc maintenancerequest KDE:Devel kdelibs4 kdebase4 openSUSE:12.1

Note: Specifying an Existing Incident
It is also possible to specify an existing incident as target with the --incident parameter.
The packages will then be merged into the existing incident project.

33

Workflow B: Submitting a Package Without Branching

8.2.3

Workflow C: Process Gets Initiated By the Maintenance Team

The maintenance team may start the process (for example because a security issue was reported
and the maintenance team decided that a x is required). In this case the incident gets created
via the Web UI or via the API call:

osc createincident [PROJECT]
osc api /source/PROJECT?cmd=createmaintenanceincident
osc api /source?cmd=createmaintenanceincident&attribute=OBS:Maintenance .

To document the expected work the creation of a patchinfo package is needed. This can be
done via

osc patchinfo [PROJECT]

It is important to add Bugzilla entries inside of the _patchinfo le. As long these are open Bugzilla
entries, the bug assignee will see this patchinfo on their "my work" Web UI and osc views, so
they knows that work is expected from them.

8.2.4

Maintenance Incident Processing

The maintenance incidents are usually managed by a maintenance team. In case the incident

got started by a maintainer a maintenance request is targeted towards the defined maintenance
project, in our example this is openSUSE:Maintenance. The defined maintainer and reviewers

in this project need to decide about this request. In case it gets accepted, the server is creating a
subproject with a unique incident ID and copies the sources and build settings to it. The origin

project will get removed usually via the cleanup option. This maintenance project is used to
build the final packages.

If the maintenance team decides to merge a new maintenance request with an existing incident,
they can run the osc rq setincident $REQUESTID $INCIDENT before accepting the request.

The maintenance team may still modify them or the patchinfo data at this point. An outside

maintainer can still submit changes via standard submit request mechanism, but direct write permissions are not granted. When the maintenance people are satisfied with the update, they can
create a request to release the sources and binaries to the final openSUSE:11.4:Update project.
osc releaserequest

34

Workflow C: Process Gets Initiated By the Maintenance Team

The release request needs to specify the source and target for each package. In case just the

source package or project is specified the api is completing the request on creation time. It is
using this based on the source link target of each package and the release information in the
repository definitions.

8.2.5

Incident Gets Released

The release process gets usually started via creating a release request. This sets all affected

packages to the locked state, which means that all commands for editing the source or triggering
rebuilds are not allowed anymore.

The release request typically needs to be approved by QA and other teams as defined in the

Update project. In case something gets declined, the necessary changes need to be submitted to
the maintenance project and a new release request has to be created.

A unique release ID will be generated and become part of the updateinfo.xml le in the target

project on release event. This ID is different from the incident ID and is usually in the style of

"YEAR-COUNTER". The counter is strictly increasing on each release. In case of a re-release of
the same incident a release counter will be added.

A different naming scheme can be defined via the OBS:MaintenanceIdTemplate attribute value.
The release will move all packages to the update project and extend the target package name

with the incident ID. Binaries will be moved as well without modification. The exception is the
updateinfo.xml which will be modified by replacing its incident id with the release id.

8.2.6

Incident Gets Reopened and Re-Released

An update should not, but may have an undetected regression. In this case the update needs a
re-release. (If another problem shall be xed a new incident should be created instead.)

If the current update harms the systems, the maintenance team may decide to take it back

immediately. It can be done by removing the patchinfo.ID package container in the Update
projects. This will create a new update channel without this update.

To re-open a release incident project, it must get unlocked and marked as open again. Unlocking
can be done either via revoking a release request or via explicit unlocking the incident. The
explicit unlock via osc: osc unlock INCIDENT_PROJECT is also triggering a rebuild to ensure to

35

Incident Gets Released

have higher release numbers and adding the "trigger=maintenance" ags to the release target

definitions. Afterwards the project can be edited again and also gets listed as running incident
again.

8.2.7

Using Custom Update IDs

The used string of update IDs can be defined via the OBS:MaintenanceIdTemplate attribute value
of the master maintenance project.

8.3 OBS Internal Mechanisms
OBS is tracking maintenance work and can be used as a database for future and past updates.

8.3.1

Maintenance Incident Workflow

A maintenance incident is started by creating the incident project, either via a developer request
or by the maintenance team.

1. Incident project container is created. This is always a sub project to the maintenance

project. A unique ID (counter) is used as subproject name. Build is disabled by default
project wide.

2. Default content for an incident is added via branch by attribute call:

Package sources get added based on given package and attribute name from all ex-

isting project instances. The package name is extended by the source project name

to allow multiple instances of same package in one project. Source revision links are
using the xsrcmd5 to avoid that other releases will affect this package instance.

Build repositories are added if missing. All repositories from all projects where the

package sources gets branched from are used. The build ags in the package instances
gets switched on for these.

A release target definition is added to the repository configuration via additional

releasetarget element. The special release condition "maintenance" gets defined for
this.

3. Fixes for the packages need to get submitted now.

36

Using Custom Update IDs

4. A patchinfo le need to get added describing the issue.
5. OBS server is building packages according to the sources and update information according

to the patchinfo data.

6. one or more release requests get created. It does also set the project to "freeze" state by

default, this means no source changes are possible anymore and all running builds get
canceled.

7. Usually the request is in review state with defined reviewers from the release project. All

reviewers need to review the state in the incident project.

8. Request changes into state "new" when all reviewers accepted the release request.
9. The release happens on accepting the request by the maintainers of the release project.

All package sources and binaries get copied into a package container where the package name gets extended by the incident number.

A main package gets created or updated, it just contains a link to the current incident
package. Eg glibc points to glibc.42. The purpose of this main package is to have a
place to refer to the current sources of a package.

The release target condition=maintenance gets removed.
The updateinfo.xml gets updated with the existing or now created unique updateinfo
ID.

The server will update the repository based on all existing binaries.
10. OPTIONAL: A maintenance coordinator may remove the release by removing the package

instances inside the release project. The source link has to be xed manually. (We may
offer a function for this).

11. OPTIONAL: A maintenance incident can be restarted by

Removing the lock ag.
Adding again the condition=maintenance attribute to the release target which requires a re-release.

NOTE: The step 1 and 2 may be done via accepting an incident request instead.

37

Maintenance Incident Workflow

8.3.2

Searching for Incidents

The Web UI shows the running and past incidents when going to the maintenance project
(openSUSE:Maintenance in our example). It shows the open requests either for creating or release an incident. Also, the open incidents, which are not yet released are visible.

All users need usually just to visit their "my work" screen in Web UI or osc to see requests or
patchinfos where actions of them are expected: osc my [work]

The following items list some common ways to search for maintenance incidents via the api:
A developer can see the work to be done by them via searching for patchinfos with open
Bugzilla entries:

/search/package?match=([kind='patchinfo' and issue/[@state='OPEN' and owner/
@login='$USER_LOGIN']])

A maintenance coordinator can see requests for doing a maintenance release via searching

for open requests with maintenance_incident action against the maintenance project. They
are visible in the Web UI request page of that project or via

/search/request?match=(state/@name='new') and action/@type='maintenance_incident'
and action/target/@project='openSUSE:Maintenance')

A maintenance coordinator can see open incidents via searching for incidents project repositories which have a release target with maintenance trigger. Note: this search result is
showing all repositories of a matching project.

/search/project?match=(repository/releasetarget/@trigger='maintenance')

A maintenance coordinator can see updates which currently are reviewed (for example
by a QA team) via

/search/request?match=(state/@name='review') and action/@type='maintenance_release')

A maintenance coordinator can see updates ready to release via searching for open requests
with maintenance_release action.

/search/request?match=(state/@name='new') and action/@type='maintenance_release')

38

Searching for Incidents

8.4 Setting Up Projects for a Maintenance Cycle
8.4.1

Defining a Maintenance Space

An OBS server is using by default a maintenance space defined via the OBS:Maintenance at-

tribute. This must get created on a project where maintenance incident projects should get created below. This project is also defining the default maintenance maintainers and reviewers in
its ACL list.

It is possible to have multiple and independent maintenance name spaces, however the main-

tenance request must be created against this other namespace manually or using a different
attribute.

8.4.2

Maintained Project Setups

Maintained projects must be frozen, this means no changes in sources or binaries. All updates

will be hosted in the defined update project. This project gets defined via the OBS:UpdateProject
attribute which must contain a value with the update project name. In addition to this, an

attribute to define the active maintenance should also be defined, by default the OBS:Maintained
attribute. The osc mbranch command will take packages from this project as a result.

The Update project should be defined as build disabled as well. Also define a project link to the
main project and at least one repository building against the main project.

8.5 Optional Channel Setup
Channels are optional definitions to publish a sub-set of binaries into own repositories. They can
be used to maintain a larger amount of packages in a central place, but defining to published
binaries with an independent workflow which requires an approval for each binary.

8.5.1

Defining a Channel

Channels get defined and maintained in an xml le inside of a package source. The le name
of these lists must be _channel.

The le may contain a list of targets where binaries gets released to.

39

Setting Up Projects for a Maintenance Cycle

8.5.2

Using Channels in Maintenance Workflow

Channel definitions for existing packages do affect incident projects. Matching channel pack-

ages get automatically branched inside and additional repositories for the channels are created.

The server will build the channel package by aggregating the binary packages into the channel
repositories.

The _channel les can be modified inside of the incident project if needed. This can be necessary
when binary packages get renamed or added with this update. The modification will be part of
the maintenance release request as simple submit actions.

40

Using Channels in Maintenance Workflow

41

Using Channels in Maintenance Workflow

This example shows the setup where selected binary packages get released also to a defined

channel. The openSUSE:11.4:SecurityChannel project contains a _channel definition inside of

the channel package. This one gets branched as well into the incident in case a matching channel

does exist. Also, the additional repository gets added. The resulting binaries will be transfer via
a release request to the code stream project (openSUSE:11.4:Update) and the special channel
project.

42

Using Channels in Maintenance Workflow

9 Binary Package Tracking
Products and updates to them are often officially supported by a company. To allow giving

such support, there is binary package tracking. This feature allows checking which exact version
of a package was shipped at what time. This feature is often important for release managers,
maintenance engineers, QA engineers and supporters.

OBS can track these binary packages and offer a database to search them.

9.1 Which Binaries Are Tracked?
All binaries which are released into projects providing kind=maintenance_release are

tracked. In addition to that, the OBS administrator can configure additional projects via the
packtrack setting in BSConfig.pm .

9.2 What Data Is Tracked?
In short the information to identify a binary, its building place and timestamps are tracked. In

addition to that also information about possible successor versions or if the binary got removed
in the meantime. If products do reference the repositories the search interface offers also a listing
of products which are supposed to use it. Either as part of the product media itself or in one
of its update repositories.

9.2.1

Binary Identifier

A binary is identified by the following information which is extracted from components of the
le path of the binary:
Repository:

43

Where is the binary hosted?

Name:

Name of the binary le

Epoch:

The epoch version (optional, usually not used)

Version:

The version

Release:

The release number

Which Binaries Are Tracked?

Architecture:
Medium:

9.2.2

The hardware architecture

Name of the medium (exists only for product builds)

Binary Information

Additional information about a binary is information which gets updated when a binary gets
added or replaced.

operation, got the binary added, removed or modified
publish time, aka the time when the repository gets published by OBS. This is not the same
time as when the release action got invoked.
build time
obsolete time, exists only when a binary gets removed or replaced
supportstatus, meta information about the level of support which is granted for the binary
at the time of releasing it.

updateinfo id from rpm-md repository
maintainer of the binary who has prepared this update
disturl, the exact identifier to the source and build repository

9.2.3

Product information

Additional information about products referencing to this binary.
updatefor: the listed products do reference the repository as update channel.
product: exists when the binary was part of a product medium

9.3 API Search Interface
The search is provided via the generic XPath search interface. It is provided below the paths:
/search/released/binary/id : short form, just listing the matched binary identifiers
/search/released/binary : long form, provides all other tracked information as described
above

44

Binary Information

9.3.1

Examples

To nd the latest version of given glibc-devel binary in all products. Skipping old and revoked
versions:

/search/released/binary?match=@name"=glibc-devel"+and+obsolete[not(@time)]

To nd a specific version by given updateinfo id. This ID is visible in the update tools to the
end user:

/search/released/binary?match=updateinfo/@id="OBS-2014-42"

To nd a specific version by given disturl. Used to nd all affected products by a certain build
of a binary:

/search/released/binary?match=disturl="obs://..."

When got the specific package version got released the rst time:
/search/released/binary?match=@name='kernel-default'+and+@version='1.0'+and
+@release='1'+and+@arch='i586'+and+supportstatus='l3'+and+operation='added'

All binaries in a given repository:
/search/released/binary?match=repository/[@project='BaseDistro3'+and
+@name='BaseDistro3_repo']

All binaries part of a product release:
/search/released/binary?match=product/[@project='openSUSE'+and+@name='openSUSE'+and
+(@arch='x86_64'+or+not(@arch))]

All binaries part of the update repositories of a product:
/search/released/binary?match=updatefor/[@project='openSUSE'+and+@product='openSUSE'+and
+(@arch='x86_64'+or+not(@arch))]

All binaries part of the update repositories of a versioned product:
/search/released/binary?match=updatefor/[@project='openSUSE'+and+@product='openSUSE'+and
+@version='13.2']

All binaries part of the update repositories of a versioned product (enterprise style):
/search/released/binary?match=updatefor/[@project='openSUSE'+and+@product='openSUSE'+and
+@baseversion='12'+and+@patchlevel='1']

45

Examples

10 Administration
This chapter describes the components of an OBS installation and the typical administration
tasks for an OBS administrator.

This chapter is not intended to describe special installation hints for a certain OBS version. Refer
to the OBS download page (http://openbuildservice.org/download/)

for that.

10.1 OBS Components
The OBS is not a monolithic server: it consists of multiple daemons that perform different tasks.

46

OBS Components

FIGURE 10.1: SIMPLIFIED OBS COMPONENT OVERVIEW

47

OBS Components

10.1.1

Front-end

The OBS Front-end is a Ruby on Rails application that manages the access and manipulation

of OBS data. It provides a web user interface and an application programming interface to do

so. Both can be used to create, read, update and delete users, projects, packages, requests and

other objects. It also implements additional sub-systems like authentication, search, and email
notifications.

10.1.2

Back-end

The OBS Back-end is a collection of Perl applications that manage the source les and build
jobs of the OBS.

10.1.2.1

Source Server

Maintains the source repository and project/package configurations. It provides an HTTP interface, which is the only interface to the Front-end. It may forward requests to other back-end

services. Each OBS installation has exactly one Source Server. It maintains the "sources", "trees"
and "projects" directories.

10.1.2.2

Repository Server

A repository server provides access to the binaries via an HTTP interface. It is used by the frontend via the source server only. Workers use the server to register, request the binaries needed
for build jobs, and store the results. Notifications for schedulers are also created by repository

servers. Each OBS installation has at least one repository server. A larger installation using
partitioning has one on each partition.

10.1.2.3

Scheduler

A scheduler calculates the need for build jobs. It detects changes in sources, project configura-

tions or in binaries used in the build environment. It is responsible for starting jobs in the right
order and integrating the built binary packages. Each OBS installation has one scheduler per
available architecture and partition. It maintains the "build" directory.

48

Front-end

10.1.2.4

Dispatcher

The dispatcher takes a job (created by the scheduler) and assigns it to a free worker. It also

checks possible build constraints to verify that the worker qualifies for the job. It only notifies

a worker about a job; the worker itself downloads the required resources. Each OBS installation
has one dispatcher per partition (one of which is the master dispatcher).

10.1.2.5

Publisher

The publisher processes "publish" events from the scheduler for finished repositories. It merges

the build result of all architectures into a defined directory structure, creates the required metadata, and optionally syncs it to a download server. It maintains the "repos" directory on the
back-end. Each OBS installation has one publisher per partition.

10.1.2.6

Worker

The workers register with the repository servers. They receive build jobs from the dispatcher.

Afterwards they download sources from source server and the required binaries from the repository server(s). They build the package using the build script and send the results back to the

repository server. A worker can run on the same host as other services, but most OBS installations have dedicated hardware for the workers.

10.1.2.7

Signer

The signer handles signing events and calls an external tool to execute the signing. Each OBS
installation usually has one signer per partition and one on the source server installation.

10.1.2.8

Warden

The warden monitors the workers and detects crashed or hanging workers. Their build jobs will
be canceled and restarted on another host. Each OBS installation can have one Warden service
running on each partition.

49

Back-end

10.1.2.9

Download on Demand Updater (dodup)

The download on demand updater monitors all external repositories which are defined as "down-

load on demand" resources. It polls for changes in the metadata and re-downloads the metadata

as needed. The scheduler will be notified to recalculate the build jobs depending on these repos-

itories afterwards. Each OBS installation can have one dodup service running on each partition.

10.1.2.10

Delta Store

The delta store daemon maintains the deltas in the source storage. Multiple obscpio archives

can be stored in one deltastore to avoid duplication on disk. This service calculates the delta

and maintains the delta store. Each OBS installation can have one delta store process running
next to the source server.

10.1.3

Command Line Client

The Open Build Service Commander (osc) is a Python application with a Subversion-style com-

mand-line interface. It can be used to manipulate or query data from the OBS through its application programming interface.

10.1.4

Content Delivery Server

The OBS is agnostic about how you serve build results to your users. It will just write repositories
to disk. But many people sync these repositories to some content delivery system like MirrorBrain
(http://mirrorbrain.org/)

10.1.5

.

Requirements

We highly recommend, and in fact only test, installations on the SUSE Linux Enterprise Server
(https://www.suse.com/products/server/)

and openSUSE (http://www.opensuse.org)

systems. However, there also are installations on Debian and Fedora systems.

operating

The OBS also needs a SQL database (MySQL or MariaDB) for persistent and a memcache daemon
for volatile data.

50

Command Line Client

10.2 OBS Appliances
This chapter gives an overview over the different OBS appliances and how to deploy them for
production use.

10.2.1

Server Appliance

The OBS server appliance contains a recent openSUSE distribution with a pre-installed and preconfigured OBS front-end, back-end and worker. The operating system on this appliance adapts
to the hardware on rst boot and defaults to automatic IP and DNS configuration via DHCP.

10.2.2

Worker Appliance

The OBS worker appliance includes a recent openSUSE distribution and the OBS worker component. The operating system on this appliance adapts to the hardware on rst boot, defaults
to automatic IP and DNS configuration via DHCP and OBS server discovery via SLP.

10.2.3

Image Types

There are different types of OBS appliance images.
TABLE 10.1: APPLIANCE TYPES

File Name Suffix

Appliance for

.vdi

VirtualBox (https://www.virtualbox.org/)

.vmdk

VMware (http://www.vmware.com/)

station and Player.

.

Work-

Note
Our VirtualBox images are usually better tested.
.qcow2

QEMU/KVM (http://qemu.org)

.raw

Direct writing to a block device

51

.

OBS Appliances

File Name Suffix

Appliance for

.tgz

Deploying via PXE from a central server

10.2.4

Deployment

To help you deploy the OBS server appliance to a hard disk there is a basic installer that you
can boot from a USB stick. The installer can be found on the OBS Download page (http://openbuildservice.org/download/)

.

The image can be written to a USB stick to boot from it:
xzcat obs-server-install.x86_64.raw.xz > /dev/sdX

Warning
/dev/sdX is the main device of your USB stick. Do NOT put it into a partition like /dev/
sda1. If you use the wrong device, you will destroy all data on it!

How to deploy the other image types deeply depends on your virtualization setup. Describing
this is out of scope for this guide, sorry.

10.2.5

Separating Data from the System

For production use you want to separate the OBS data from operating system of the appliance
so you can re-deploy the appliance without touching your OBS data. This can be achieved by

creating an LVM volume group with the name "OBS". This volume group should be as large as
possible because it is getting used by the OBS back-end for data storage and the OBS workers

for root/swap/cache le systems. To create an LVM volume prepare a partition of type "8e" and
create the LVM via

pvcreate /dev/sdX1
vgcreate "OBS" /dev/sdX1

Additionally, if the OBS volume group contains a logical volume named “server”, it will be used
as the data partition for the server.
lvcreate "OBS" -n "server"

52

Deployment

mkfs.xfs /dev/OBS/server

10.2.6

Updating the Appliance

All images come pre-configured with the right set of repositories and can be updated via the
system tools YaST or zypper at any time. Another way to update is to re-deploy the entire
image.

Warning
If you re-deploy the entire image, keep in mind that you need to have your data directory ( /srv/obs ) on a separate storage (LVM volume, partition etc.) otherwise it will be
deleted!

10.3 Back-end Administration
10.3.1

Services

You can control the different back-end components via systemctl . You can enable/disable the

service during booting the system and start/stop/restart it in a running system. For more information, see man page (https://www.freedesktop.org/software/systemd/man/systemctl.html#Commands)

. For example, to restart the repository server, use:

systemctl restart obsrepserver.service

TABLE 10.2: SERVICE NAMES

Component

Service Name

Repository Server

obsrepserver.service

Source Server

obssrcserver.service

Scheduler

obsscheduler.service

Dispatcher

obsdispatcher.service

Publisher

obspublisher.service

53

Updating the Appliance

Component

Service Name

Worker

obsworker.service

Source Services

obsservice.service

Download On Demand Updates

obsdodup.service

Delta Storage

obsdeltastore.service

Signer

obssigner.service

Warden

obswarden.service

10.3.2

Advanced Setups

It makes sense to run some of the different components of the OBS back-end on isolated hosts.

10.3.2.1

Distributed Workers

OBS workers can be very resource hungry. It all depends on the software that is being built, and
how. Single builds deep down in the dependency chain can also trigger a sea of jobs. It makes
sense to split o workers from all the other services so they do not have to ght for the same

operating system/hardware resources. Here is an example on how to setup a remote OBS worker.
1. Install the worker package called obs-worker
2. Configure the OBS repository server address in the le /etc/sysconfig/obs-server. Change

the variable OBS_REPO_SERVERS to the host name of the machine on which the repository
server is running: OBS_REPO_SERVERS="myreposerver.example:5252"

3. Start the worker

10.4 Front-end Administration
The Ruby on Rails application is run through the Apache web server with mod_passenger
(https://www.phusionpassenger.com/)

. You can control it via systemctl

systemctl {start, stop, restart} apache2

54

Advanced Setups

10.4.1

Delayed Jobs

Another component of the OBS front-end are delayed jobs for asynchronously executing longer
tasks in the background. You can control this service also via systemctl .
systemctl {start, stop, restart} obsapidelayed

10.4.2

Full Text Search

The full-text search for packages and projects is handled by Thinking Sphinx (http://freelancing-gods.com/thinking-sphinx/)

. The delayed job daemon will take care of starting this service.

To control it after boot, use the rake tasks it provides.
rake ts:{start, stop, rebuild, index}

55

Delayed Jobs

11 Scheduling and Dispatching
One of the major functionalities of OBS is to calculate always the current state, based on available
sources, binaries and user configurations. In case a change happened it will trigger builds to

achieve a clean state again. The calculation of the need of a build job is called scheduling here.
The assignment of a build job to a concrete build host (aka worker) is called dispatching.

11.1 Definition of a Build Process
A build process is calculated and executed based on the following
The sources of a package defined which dependencies are required at build time. eg. Buil-

dRequires lines in spec les defined which other packages must get installed to build a

package

The project configuration of the package defines repositories and architectures to build for.
In case other repositories are used as a base the configuration from there is also considered.
Dependencies of packages which are required are considered as well.
Constraints regarding the worker are considered. A package may require certain amount of

resources or specific features to build. Check the constraints chapter for details. However,
apart from this the build should be independent of the specific worker where the job gets
dispatched to.

11.2 Scheduling Strategies
The defaults have the goal of creating an always reproducible state. This may lead to more builds
than practically necessary, but ensures that no hidden incompatibilities exist between packages

and also that the same state can later be achieved again (with a subsequent rebuild of the same
sources and configurations). This can also lead to multiple builds of the same package in the
case of dependency loops.

In some setups this may not be wanted, so each repository can be configured differently. The

usual options to modify the project meta configurations can be used to configure different strategies. For example using osc:

osc meta prj -e YOUR_PROJECT

56

Definition of a Build Process

A repository is configured as following by default, however only the name attribute is required
to be set.

# Example  [...]


11.2.1

Build Trigger Setting

The build trigger setting can be set via the "rebuild" attribute. Possible settings are
transitive

The default behavior, do a clean build of all dependant packages
direct

Just build the package with changed sources and direct dependant packages. But not indirect dependant packages.
local

Just build packages with changed sources.

Note
Note: You can run into dependency problems in case you select direct or local without

noticing this in the build state. Your packages might not even be installable or have

random runtime errors (like not starting up or crashing applications), even when they
claim to be "succeeded". Also, you cannot be sure that you will be able to re-build them

later. So never do an official shipment with this setting of a release. This knob is exposed
to allow deliberate suppression of the strictly reproducible builds (for example, to limit
burning CPU unnecessarily).

11.2.2

Block Mode

Usually the build of a package gets blocked when a package required to build it is still building
at the moment. The "block" attribute can modify this behaviour:
all

57

Build Trigger Setting

The default behavior, do not start the build if a dependant package is currently building.
local

Just care about packages in your project for the block mode.
never

Never set a package to blocked.

Note
When using something other than “all” you will have to deal with the following problems:
Intermediate builds can have dependency and runtime problems.
Your packages will get built more often, take more resources on the server side. As
a result the dispatcher will rate your repository down.

11.2.3

Follow Project Links

off

DEFAULT: do not build packages from project links
localdep

only build project linked packages if they depend on a local package
all

treat packages from project links like local packages

58

Follow Project Links

12 Build Job Constraints
Build job constraints can define requirements for the hardware or software of the build host.
Constraints can be defined per package or for repositories.

The build constraints for an entire project or specific repositories is part of the project config.
For each constraint, it contains a line
Constraint:  

The selector is a colon-separated list.
The build constraints for a package are part of the package sources, as a _constraints XML source
le (validated on submission). The _constraints source le can contain the values listed below.

NOTE: If no build host meets the constraints, the package will stay in state "scheduled" and
never be dispatched.

12.1 hostlabel
The hostlabel is any string which can be assigned to build hosts when starting the bs_worker

process. It can be used to run on specific hosts, which may be used for running benchmarks
in a reproducible way. This constraint can also be defined as a negative definition using the
exclude=true attribute. However, the hostlabel is always specific to one OBS instance. You

should avoid it as much as possible, since building with this constraint in another instance is
usually not possible. Use any of the other constraints if possible.
Example for _constraints le:

benchmark_runner


Example for project configuration:
Constraint: hostlabel benchmark_runner

59

hostlabel

12.2 sandbox
Defines the sandbox which is used for the build job. Sandboxes are chroot, Xen or KVM envi-

ronments. There is also the virtual secure sandbox, which allows building on Xen or KVM. This
constraints may also be defined as a negative definition via the exclude=true attribute.
Example for _constraints le:

secure


Example for project configuration:
Constraint: sandbox secure

12.3 linux
The Linux kernel specific part.

12.3.1

version

To require a specific Linux kernel version.
Example for _constraints le:


3.0
4.0



Example for project configuration:
Constraint: linux:version:min 3.0
Constraint: linux:version:max 4.0

12.3.1.1

min

Minimal kernel version.

60

sandbox

12.3.1.2

max

Maximal kernel version.

12.3.2

flavor

A specific kernel flavor like default or smp (from kernel packages kernel-default or kernel-smp).
Example for _constraints le:


default



Example for project configuration:
Constraint: linux:flavor default

12.4 hardware
To require hardware or build instance features.

12.4.1

cpu

To require a specific Linux kernel version.

12.4.1.1

flag

CPU features which are provided by the hardware. On Linux they can be found in /proc/cpuinfo.
The ag element may be used multiple times to require multiple CPU features.
Example for _constraints le:


mmx
sse2

61

flavor




Example for project configuration:
Constraint: hardware:cpu:flag mmx
Constraint: hardware:cpu:flag sse2

12.4.2

processors

To require a minimal number of processors for the build job.
Example for _constraints le:


4



Example for project configuration:
Constraint: hardware:processors 4

12.4.3

disk

Hard disk specific.

12.4.3.1

size

To require a minimal size of the disk.
Example for _constraints le:



4




62

processors

Example for project configuration:
Constraint: hardware:disk:size unit="G" 4

12.4.4

memory

Memory specific.

12.4.4.1

size

To require a minimal memory size including swap space.
Example for _constraints le:



1400




Example for project configuration:
Constraint: hardware:memory:size unit="M" 1400

12.4.5

physicalmemory

Memory specific.

12.4.5.1

size

To require a minimal memory size. Swap space is not taken into account here.
Example for _constraints le:



1400

63

memory





Example for project configuration:
Constraint: hardware:physicalmemory:size unit="M" 1400

12.5 Constraint Handling
The constraint handling depends on what is met by the restrictions. The handling starts when
there is no worker to fulfill the constraints.

12.5.1

More than half of the workers satisfy the constraints

The job will just stay in state scheduled and no further notification is set.

12.5.2

Less than Half of the Workers Satisfy the Constraints

The job will stay in state scheduled and the dispatch details are set to tell the user that this
job can take a long time to be built. This will be shown in the Web UI on mouse over and the
scheduled state will be highlighted as well.
waiting for 4 compliant workers (4 down)

The (4 down) means that 4 of the 4 compliant workers are down and that someone should
have a look.

12.5.3

No Workers Satisfy the Constraints

If no worker can handle the constraints defined by the package or project the build job fails.
There is also a hint in the build log what has failed.
package build was not possible:
no compliant workers (constraints mismatch hint: hardware:processors sandbox)

64

Constraint Handling

Please adapt your constraints.

12.6 Checking Constraints with osc
You can check the constraints of a project / package with the osc tool. You have to be in an
osc working directory.

osc checkconstraints [OPTS] REPOSITORY ARCH CONSTRAINTSFILE

Either you give a repository and an arch or osc will check the constraints for all repository /
arch pairs for the package. A few examples:
# osc checkconstraints
Repository

Arch

Worker

----------

----

------

openSUSE_Leap_42.2

x86_64

1

openSUSE_Leap_42.1

x86_64

1

If no le is given it takes the local _constraints le. If this le does not exist or the --ignore-le
switch is set only the project constraints are used.

# osc checkconstraints openSUSE_Leap_42.1 x86_64
Worker
-----x86_64:worker:1
x86_64:worker:2

If a repository and an arch is given a list of compliant workers is returned.
Another command to verify a worker and display the worker information is osc workerinfo.

MY_WORKER_LABEL_1
chroot

4.1.34-33
default



fpu
vme
de


65

Checking Constraints with osc

2
1



It returns the information of the desired worker.

66

Checking Constraints with osc

13 Building Preinstall Images
Preinstall images can optionally be used to install a set of packages in one quick step instead

via single package installations. Depending on the build host even snapshots with copy-on-write
support may be used which avoids any IO.

A preinstall image can be used if it provides a subset of packages which is required for the build
job. The largest possible image is taken if multiple are usable.

To use a preinstall image there needs to be a package container inside of the project or in a
repository used by the build job. This package needs a _preinstallimage le. The syntax of it is
spec le like, but just needs a Name: and at least one BuildRequires: line.

To ignore packages despite existing dependencies, use #!BuildIgnore: tags or %if .
Preinstall image build jobs are always preferred to allow the best effect of them. We recommend
defining images for often used standard stacks.

Example _preinstallimage le for a basic preinstall image:
Name: base
BuildRequires: bash
#!BuildIgnore: brp-trim-desktopfiles

67

14 Authorization
14.1 OBS Authorization Methods
Each package is signed with a PGP key to allow checking its integrity on user's machines.

14.1.1

Default Mode

OBS provides its own user database which can also store a password. The authentication to

the API happens via HTTP BASIC AUTH. See the API documentation to nd out how to create,
modify or delete user data. Also a call for changing the password exists.

14.1.2

Proxy Mode

The proxy mode can be used for esp. secured instances, where the OBS web server shall not

get connected to the network directly. There are authentication proxy products out there which
do the authentication and send the user name via an HTTP header to OBS. This also has the
advantage that the user password never reaches OBS.

14.1.3

LDAP Mode

LDAP authentication code is still part of OBS, but due to the lack of any test cases it is currently
not recommended to use it.

14.2 OBS Token Authorization
OBS provides a mechanism to create tokens for specific operations. This can be used to allow

certain operations in the name of a user to others. This is esp. useful when integrating external
infrastructure. The create token should be kept secret by default, but it can also be revoked at
any time if it became obsolete or leaked.

68

OBS Authorization Methods

14.2.1

Managing User Tokens

Tokens always belong to a user. A list of active tokens can be viewed using
osc token
osc token --delete 

14.2.2

Executing a Source Service

A token can be used to execute a source service. The source service has to be setup for the
package rst, check the source service chapter for this. A typical example is to update sources
of a package from git. A source service for that can be setup with:
osc add git://....

The best way to create a token is bind it to a specific package. The advantage is that the operation
is limited to that package, so less bad things can happen when the token leaks.
osc token --create  

Also, you do not need to specify the package at execution time. But keep in mind that such form
only works when you run it on an as checkout of a package. Both commands below do the same
thing but in a different way:

osc token --trigger 
osc api -X POST /trigger/runservice?token=

A token can be registered as generic token, means allowing to execute all source services in

OBS if the user has permissions. You can create such a token by skipping project/package on
creation command:

osc token --create

In this case, you are forced to specify project/package along with the token. On the other hand,
you are not limited from where you execute it. Again, two examples doing same thing:
osc token --trigger   
curl -H "Authorization: Token " -X POST /trigger/runservice?
project=&package=

69

Managing User Tokens

You can also limit the token to a specific package. The advantage is that the operation is limited
to that package, so less bad things can happen when the token leaks. Also you do not need to
specify the package on execution time. Create and execute it with:
osc token --create  
osc token --trigger 
curl -H "Authorization: Token " -X POST /trigger/runservice

70

Executing a Source Service

15 Quality Assurance(QA) Hooks
OBS provides multiple hooks to place automated or manual tests at different points of time.
This chapter describes the different possibilities to provide and execute QA checks. The order of
the items is sorted by the order in a typical development process. It is preferred to add a check
as early as possible in the process to keep turn-around times small.

15.1 Source Related Checks
Things which can be verified based on a given source can be checked even before commit time
on the developers workstation. This is the earliest possible point of time to add a check. But it
can also optionally be enforced on the server side.

Automated source processing is done by source services in OBS world. Check the source service
chapter how to use or write one. It is important to decide if the test case shall output warning
messages and when it shall report an error by exit status.

Test cases in source services get usually applied to all packages of a project. (It is possible to
execute it only for specific packages though.)

15.2 Build Time Checks
15.2.1

In-Package Checks

Checks running during the build of a package are usually test cases provided by the author of a

package. However, the packager can also add simple checks, for example, for code that is known
to break on version updates and might be forgotten when the package is touched the next time.

These test are often specific for a concrete package only. So it is typically executed in %check

section of rpm spec les directly. In case the check can be used with multiple package source, it

is a good idea to package the test case in an own package and just call it from the other packages.
rpm calls %check after %install section and before creating the actual checks.
SUSE distributions also provide build time checks to test the installed les inside of the build

root. It is to be used for test cases which shall run on all packages which are build inside of a
distribution. This hook can be used by installing a le to /usr/lib/rpm/brp-suse.d/ directory.
These scripts also have the power to modify installed les if needed.

71

Source Related Checks

15.2.2

Post Build Checks

The standard tool to test binary packages for RPM-based distributions is rpmlint . DEB-based
distributions use the lintian tool instead.

These checks are executed by the build script after a successful build. Note that these are executed as the standard user by default.

15.2.3

Post Build Root Checks

Files in /usr/lib/build/checks/* are executed as root user. Typical use cases are install tests of
the build packages to ensure that the scripts inside of the packages are working in general.

15.2.4

KIWI Specific Post Build Root Checks

The le /usr/lib/build/kiwi_post_run is executed after KIWI jobs have finished. It can be used
to run the appliance or to modify it. For example to package an appliance into an rpm.

15.3 Workflow Checks
Workflow steps, for example transferring packages from one project to another, are done via

requests in OBS. At least when multiple parties are involved. One or more of these parties can
be automated test cases. Or human manual approval steps.

Default reviews can be defined inside of projects and packages. A new request to a certain

package does get the reviewers added defined in target projects and packages. Reviewers can
be currently users, groups or the maintainers of a specified project or package.

15.3.1

Automated Test Cases

Open requests can be requested in an XML parseable way via the API running
osc api /request?states=review&user=auto-reviewuser&roles=reviewer&reviewstates=new&view=collection

72

Post Build Checks

osc can be used to accept or decline requests after running the automated test. It can also add a

review comment which you can use to give a reason (for example, error messages) for accepting
or declining a request. Requests, which are not tested, for example because they are of a not

matching type (for example, deleting packages) needs to get also a review accept. Otherwise,
this would block the process.

73

Automated Test Cases

16 openSUSE Factory
This chapter describes how the development of the future openSUSE distribution is done within
OBS.

16.1 openSUSE:Factory project
The main project is openSUSE:Factory. This project is controlled by a small group which does
review all submissions according to the policies. Submissions are possible via submit requests,
which are reviewed by default by two groups: The Legal team and the code review team.

16.2 Devel Projects
The goal of openSUSE:Factory is to always have a working state. This is needed to allow all

developer groups to use it as a base for testing their own, possibly experimental work in their
own projects.

74

openSUSE:Factory project

Glossary
AppImage
An application and its dependencies packaged as a single le which can run on many distributions without unpacking or installing.
Appliance
An image built and preconfigured for a specific purpose. Appliances usually consist of a
combination of an application (for example, a Web server), its configuration, and an operating system (for example, SUSE Linux Enterprise Server). Appliances can be copied as-is
onto a hard disk, an SSD, or started as a virtual machine (deployed).
See also Operating System Image, Image (Image File).
Archive (Archive File)
An archive le contains a representation of usually multiple les and directories. Usually,
archive les are also compressed. Archive les are the basis for binary packages (Binary
Package (Binary)).

Attribute
Attributes can be added to projects or packages to add meta information or to trigger actions.
For example, you can use the attribute OBS:AutoCleanup to delete a project after a certain
amount of time.

Binary Package (Binary)
An archive le that contains an installable version of software and metadata. The metadata
includes references to the dependencies of the main software. Dependencies are packaged
as additional binary packages.

Formats of binary packages include RPM and DEB. In the OBS context, binary packages are
sometimes also called binaries.

See also Container, Operating System Image, Source Package, Deb, RPM, KIWI, Archive (Archive
File).

Branch
Personal copy of another repository that lives on your home project. A branch allows you

to make changes without affecting the original repository. You can either delete the branch
or merge it into the original repository with a submit request.
See also Submit Request.

75

Bug
Issue that documents incorrect or undesirable behaviour
Bugowner
In OBS, Bugowner is a user role which can be set for a project or a package. However, ideally,
set this role for individual packages only. Users with this role can only read data but they
are responsible for reacting to bug reports.
See also Maintainer.
Build
Generating ready-to-publish binaries, usually for a specific distribution and architecture.
Build Log
Output of the build process of a certain package.
See also Build.
Build Recipe
Generic term for a recipe le for creating a package. A build recipe includes metadata,
instructions, requirements, and changelogs. For RPM-based systems like SUSE, a .spec le

is used and contains all the previous points. Debian-based systems use a debian directory
which splits all the information.
See also Spec File.
Build Requirement
Package requirements that are needed to create or build a specific package.
See also Installation Requirement, Build Recipe.
Build Result
The current state of a package. Example of a build result could be succeeded, failed, blocked,
etc.

Build Root
Directory where the osc command copies, patches, builds, and create packages. By default,
the build root is located in /var/tmp/build-root/BUILD_TARGET .
See also Build Target.
Build Target
Specific operating systems and architecture to build for.

76

Changelog
Listing of a high-level overview sorted by date. An entry of a changelog can contain infor-

mation about version updates, bug and security fixes, incompatible changes, or changes related to the distribution.
See also .changes File.
.changes File

In OBS, a le with the le extension .changes to store changelog information.
See also Changelog.

Commit
A record of a change to one or more les. Each record contains the revision, the author, the
date and time, a commit checksum, an optional request number, and a log message.
See also Revision.
Container
An image le that contains a deployable version of software and metadata. Dependencies of
the main software are also included, such as additional libraries.

Unlike operating system images, containers do not include an operating system. Unlike bi-

nary packages, containers are deployed and not installed. Formats of containers include AppImage, Docker, Snap, and Flatpak.

See also Binary Package (Binary), Operating System Image, Image (Image File).
Deb
A package format created and used by the Debian distribution.
See also Package, RPM.
Dependency
See Requirement.
Devel Project
A set of related packages that share certain features. For example, the devel project devel:languages:python stores all packages related to the Python programming language.

See also Home Project, Project.
Docker

Docker is a lightweight virtualization solution to run multiple virtual units (containers) simultaneously on a single control host.

77

See also Container.
Download Repository
An area containing built packages available for download and installation through Zypper
or YaST. The download repository belongs to a project and is specific to a distribution. An
example of a download repository could be http://download.opensuse.org/repositories/PROJECT/openSUSE_Tumbleweed/ .

Diff
See Patch.
EULA
End User License Agreement. For software that needs a special license (usually non-open
source) which the user needs to agree to before installing.
Fix
See Patch.
Flags
A set of switches that determine the state of package or repository. This includes building,
publishing, and generating debug information.
GA Project
The GA (general availability) project builds an initial release of a product. It gets frozen after
releasing the product. All further updates get released via the Update Project of this project.
GPG Key
An encryption key pair that in the context of OBS is used to verify the owner of the repository
and packages.
Home Project
Working area in OBS for uploading and building packages. Each home project starts with
home:USERNAME .

See also Project.

Image (Image File)
An image le contains a bit-wise representation of the layout of a block device. Some types
of image les are compressed. OBS allows building multiple types of image:
Operating System Image, Container

78

Image Description
Specification to define an appliance built by KIWI. The image description is a collection
of les directly used by KIWI ( config.xml and *.kiwi ), scripts, or configuration data to
customize certain parts of the KIWI build process.
See also KIWI.
Incident
Describes a specific problem and the required updates. If the problem exists for multiple code
streams, one incident covers all of them. An incident is started by creating a maintenance
incident project and the update get built here.
Installation Requirement
Package requirements that are needed when the package is installed.
KIWI
A tool to build operating system images. It can create images for Linux supported hardware
platforms or for virtualization systems.
See also Image (Image File).
License
Written contract to specify permissions for use and distribution of software.
See also Project.
Link
A concept that defines a relationship between a source and a target repository.
See also Project.
Maintainer
In OBS, Maintainer is a user role which can be set for a project or a package. Users that have

this role in a project can add, modify, and remove packages and subprojects, accept submit
requests, and change metadata.
See also Bugowner.
Maintenance Project
A project without sources and binaries, defined by the maintenance team. Incidents are
created as sub projects of this project.
See also Incident.

79

OBS Package
OBS packages contain the sources that are necessary to build one or more binary packages
or containers. The content of OBS packages varies. In general, there is always a source le
(such as a TAR archive of the upstream sources) and a build recipe.

To build an RPM package in OBS, you need a spec le as your build recipe, for example. An
OBS package can also contain other les, such as a change log and patches.

OBS packages, unlike the name “package” suggests, do not consist of a single le. Instead,

they are directories of a version-controlled repository. However, unlike most directories,
they cannot contain subdirectories. (You can use subdirectories to simplify your work with
the checked-out package but you cannot submit these directories.)
Open Build Service (OBS)
A Web service to build binary packages, containers and operating system images from source.
The term “Open Build Service” is used to speak about the server part of the build service.

Unlike the term openSUSE Build Service, the term Open Build Service refers to all instances.
openSUSE Build Service
A specific Web service instance of Open Build Service (OBS) from the openSUSE project at
http://build.opensuse.org

.

osc

A command line tool to work with OBS instances. The acronym osc stands for openSUSE
commander. osc works similarly to SVN or Git.

See also Open Build Service (OBS), https://github.com/openSUSE/osc .
Operating System Image
An image le that contains an operating system. The operating system can be either instal-

lable or deployable. Depending on their purpose, operating system images are classified into:
Product Image, Appliance, Virtual Machine Image

Formats of operating system images include ISO, Virtual Disk, and PXE Root File System.
See also Binary Package (Binary), Image (Image File), KIWI.
Overlay File
A directory structure with les and subdirectories used by KIWI. This directory structure is
packaged as a le ( root.tar.gz ) or stored below a directory (named root ). The contents

of the directory structure is copied over the existing le system (overlaid) of the appliance
root. This includes permissions and attributes as a supplement.

80

See also Appliance, KIWI.
Package
OBS handles very different types of software package:
Source Package, OBS Package, Binary Package (Binary)

See also Container.

Package Requirement
See Requirement.
Package Repository
A place where installable packages are available. This can be either from a media like CD,
DVD, or from a remote online repository.

Official repositories can divided into oss software (licensed under an open source license)

and non-oss (for software released under other. non-open source licenses). Additionally,
there are update source, and debug repositories as well.
Patch
Textual differences between two versions of a le.
See also Patch File.
Patch File
A le that contains a patch with the le extension .diff or .patch .
See also Patch.
Product Image
An image that allows installing an operating system, usually from a removable medium,
such as a USB disk or a DVD onto a hard disk or SSD.

Live images are a special case of operating system images. They can be run directly a USB
disk or DVD and are often but not always installable.
See also Operating System Image, Image (Image File).
Project
Unit which denies access control, repositories, architectures, and a set of packages containing sources.

Project Configuration
Settings to define the setup of the build system, usually to switch on or o certain features
during the build or to handle circular dependencies.

81

See also Project.
Publishing
Finished process when a package is successfully build and available in the download repository.

See also Download Repository.
Release Project
A release project is hosting a release repository which is not building any packages ever. It
is only used to copy sources and binaries to this project on a release event.
Repository
A distribution-specific area that holds dependencies required for building a package.
See also Download Repository.
Repo File
A le with the name PROJECT.repo . inside the download repository. The le contains in-

formation about the name of the repository, the repository type, and references to the download repository and the GPG key.
See also Download Repository.
Requirement
In the OBS context, package requirements that are needed to create, build, or install a package.

See also Build Requirement, Installation Requirement.
Revision
A unique numeric identifier of a commit.
See also Commit.
RPM
A package format. It stands for recursive acronym RPM Package Manager. Mainly used by
SUSE, Red Hat, u.a.

See also Deb, Package.
Sandbox
Isolated region of a host system which runs either a virtual machine or a change root environment.

See also Build Root.

82

Service File
An XML le that contains metadata required for building a package. This includes version
information, upstream source repository, and actions.
Spec File
A le that contains metadata and build instructions. Metadata includes a general package
description and dependencies required for building and installing the package.
See also Build Recipe, Patch, Source.
Source
Original form, mostly written in a computer language.
See also Package.
Source Link
See Link.
Source Package
Source packages contain content similar to an OBS package but they are packaged in an
archive le. They are also meant to allow building a single binary package or container

format only. However, source packages allow rebuilding outside of an Open Build Service
context.

An example of source packages are SRPMs which contain the source for accompanying RPM
binary packages.

See also Binary Package (Binary), Archive (Archive File).
Source Service
A tool to validate, generate, or modify a source in a trustable way.
See also Source.

SUSE Package Hub
An OBS project reachable under openSUSE:Backports . It is a subset of openSUSE Factory

which does not contain version updates and does not conflict with official packages supported by SUSE Linux Enterprise.
Submit Request
Asking for integrating changes from a branched project.
Subproject
A child of a parent project.

83

See also Devel Project, Home Project, Project.
Target
A specific distribution and architecture, for example, openSUSE Tumbleweed for x86-64.
Also referenced as build target.
Update Project
A project which provides official updates for the products generated in the GA Project. The
update project usually links sources and repositories against the GA Project.
See also Release Project, GA Project.
Virtual Machine Image
An image which is built (and sometimes preconfigured) to be the basis of virtual machines.
Such images can usually be copied to the target computer and run as-is. As such, there is
some overlap between virtual machine images and appliances.
See also Operating System Image, Image (Image File).
Watchlist
A list of repositories that the user is interested in, available in the OBS Web UI.
Working Copy
See Working Directory.
Working Directory
A directory on your local machine as a result from a osc checkout call for working and
building before submitting your changes to an OBS instance.
Zypper
A command line package manager to access repositories, solve dependencies, install packages, and more.

84

A GNU Licenses
This appendix contains the GNU General Public License version 2 and the GNU Free Documentation License version 1.2.

Activities other than copying, distribution and modification are not covered by this License;

they are outside its scope. The act of running the Program is not restricted, and the output
from the Program is covered only if its contents constitute a work based on the Program

(independent of having been made by running the Program). Whether that is true depends
on what the Program does.
1.

You may copy and distribute verbatim copies of the Program’s source code as you receive

GNU General Public License

it, in any medium, provided that you conspicuously and appropriately publish on each copy

Version 2, June 1991

an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that

Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but
changing it is not allowed.

Preamble

refer to this License and to the absence of any warranty; and give any other recipients of the
Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your option
offer warranty protection in exchange for a fee.

You may modify your copy or copies of the Program or any portion of it, thus forming

The licenses for most software are designed to take away your freedom to share and change it.

2.

and change free software--to make sure the software is free for all its users. This General Public

a work based on the Program, and copy and distribute such modifications or work under the

whose authors commit to using it. (Some other Free Software Foundation software is covered

terms of Section 1 above, provided that you also meet all of these conditions:

When we speak of free software, we are referring to freedom, not price. Our General Public

a).

By contrast, the GNU General Public License is intended to guarantee your freedom to share

License applies to most of the Free Software Foundation’s software and to any other program
by the GNU Library General Public License instead.) You can apply it to your programs, too.

Licenses are designed to make sure that you have the freedom to distribute copies of free

software (and charge for this service if you wish), that you receive source code or can get it

if you want it, that you can change the software or use pieces of it in new free programs; and

You must cause the modified les to carry prominent notices stating that you changed

the les and the date of any change.

that you know you can do these things.

You must cause any work that you distribute or publish, that in whole or in part contains

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights

b).

you if you distribute copies of the software, or if you modify it.

or is derived from the Program or any part thereof, to be licensed as a whole at no charge to

or to ask you to surrender the rights. These restrictions translate to certain responsibilities for
For example, if you distribute copies of such a program, whether gratis or for a fee, you must
give the recipients all the rights that you have. You must make sure that they, too, receive or

all third parties under the terms of this License.

can get the source code. And you must show them these terms so they know their rights.

If the modified program normally reads commands interactively when run, you must

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license

c).

Also, for each author’s protection and ours, we want to make certain that everyone under-

cause it, when started running for such interactive use in the most ordinary way, to print or

else and passed on, we want its recipients to know that what they have is not the original, so

display an announcement including an appropriate copyright notice and a notice that there

Finally, any free program is threatened constantly by software patents. We wish to avoid the

is no warranty (or else, saying that you provide a warranty) and that users may redistribute

making the program proprietary. To prevent this, we have made it clear that any patent must

the program under these conditions, and telling the user how to view a copy of this License.

which gives you legal permission to copy, distribute and/or modify the software.

stands that there is no warranty for this free software. If the software is modified by someone
that any problems introduced by others will not reflect on the original authors’ reputations.

danger that redistributors of a free program will individually obtain patent licenses, in effect
be licensed for everyone’s free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR
COPYING, DISTRIBUTION AND MODIFICATION
0.

This License applies to any program or other work which contains a notice placed by the

copyright holder saying it may be distributed under the terms of this General Public License.
The “Program”, below, refers to any such program or work, and a “work based on the Program” means either the Program or any derivative work under copyright law: that is to say,
a work containing the Program or a portion of it, either verbatim or with modifications and/
or translated into another language. (Hereinafter, translation is included without limitation
in the term “modification”.) Each licensee is addressed as “you”.

(Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If identifiable sections of that

work are not derived from the Program, and can be reasonably considered independent and

separate works in themselves, then this License, and its terms, do not apply to those sections
when you distribute them as separate works. But when you distribute the same sections as

part of a whole which is a work based on the Program, the distribution of the whole must be
on the terms of this License, whose permissions for other licensees extend to the entire whole,
and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written
entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program

(or with a work based on the Program) on a volume of a storage or distribution medium does
not bring the other work under the scope of this License.
3.

You may copy and distribute the Program (or a work based on it, under Section 2) in

object code or executable form under the terms of Sections 1 and 2 above provided that you
also do one of the following:

85

Accompany it with the complete corresponding machine-readable source code, which

order, agreement or otherwise) that contradict the conditions of this License, they do not ex-

must be distributed under the terms of Sections 1 and 2 above on a medium customarily used

cuse you from the conditions of this License. If you cannot distribute so as to satisfy simul-

for software interchange; or,

taneously your obligations under this License and any other pertinent obligations, then as a

a).

Accompany it with a written offer, valid for at least three years, to give any third party,

b).

for a charge no more than your cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be distributed under the terms
of Sections 1 and 2 above on a medium customarily used for software interchange; or,
c). Accompany it with the information you received as to the offer to distribute corresponding

source code. (This alternative is allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such an offer, in accord with
Subsection b above.)
The source code for a work means the preferred form of the work for making modifications

to it. For an executable work, complete source code means all the source code for all modules

it contains, plus any associated interface definition les, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code

consequence you may not distribute the Program at all. For example, if a patent license would
not permit royalty-free redistribution of the Program by all those who receive copies directly
or indirectly through you, then the only way you could satisfy both it and this License would
be to refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended
to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property

right claims or to contest validity of any such claims; this section has the sole purpose of
protecting the integrity of the free software distribution system, which is implemented by

public license practices. Many people have made generous contributions to the wide range of
software distributed through that system in reliance on consistent application of that system;

it is up to the author/donor to decide if he or she is willing to distribute software through any
other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of
the rest of this License.

distributed need not include anything that is normally distributed (in either source or binary

8.

which the executable runs, unless that component itself accompanies the executable.

patents or by copyrighted interfaces, the original copyright holder who places the Program

form) with the major components (compiler, kernel, and so on) of the operating system on

If distribution of executable or object code is made by offering access to copy from a designated

If the distribution and/or use of the Program is restricted in certain countries either by

place, then offering equivalent access to copy the source code from the same place counts

under this License may add an explicit geographical distribution limitation excluding those

source along with the object code.

countries, so that distribution is permitted only in or among countries not thus excluded. In

as distribution of the source code, even though third parties are not compelled to copy the

You may not copy, modify, sublicense, or distribute the Program except as expressly

4.

provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute
the Program is void, and will automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this License will not have their
licenses terminated so long as such parties remain in full compliance.

such case, this License incorporates the limitation as if written in the body of this License.

9.

The Free Software Foundation may publish revised and/or new versions of the General

Public License from time to time. Such new versions will be similar in spirit to the present
version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies a version
number of this License which applies to it and “any later version”, you have the option of

5. You are not required to accept this License, since you have not signed it. However, nothing

else grants you permission to modify or distribute the Program or its derivative works. These
actions are prohibited by law if you do not accept this License. Therefore, by modifying or
distributing the Program (or any work based on the Program), you indicate your acceptance
of this License to do so, and all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

6.

Each time you redistribute the Program (or any work based on the Program), the recipient

automatically receives a license from the original licensor to copy, distribute or modify the
Program subject to these terms and conditions. You may not impose any further restrictions
on the recipients’ exercise of the rights granted herein. You are not responsible for enforcing
compliance by third parties to this License.

following the terms and conditions either of that version or of any later version published
by the Free Software Foundation. If the Program does not specify a version number of this
License, you may choose any version ever published by the Free Software Foundation.
10.

If you wish to incorporate parts of the Program into other free programs whose distrib-

ution conditions are different, write to the author to ask for permission. For software which
is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we
sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and
reuse of software generally.

NO WARRANTY
11.

BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRAN-

TY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT

If, as a consequence of a court judgment or allegation of patent infringement or for any

WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER

other reason (not limited to patent issues), conditions are imposed on you (whether by court

PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER

7.

86

EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING

12.

WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH
ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED
OF THE POSSIBILITY OF SUCH DAMAGES.

GNU General Public License for more
details.
You should have received a copy of the
GNU General Public License
along with this program; if not, write
to the Free Software
Foundation, Inc., 59 Temple Place Suite 330, Boston, MA 02111-1307, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C)
year name of author
Gnomovision comes with ABSOLUTELY NO
WARRANTY; for details
type `show w’. This is free software,
and you are welcome

END OF TERMS AND CONDITIONS

to redistribute it under certain
conditions; type `show c’

How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public,
the best way to achieve this is to make it free software which everyone can redistribute and
change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start
of each source le to most effectively convey the exclusion of warranty; and each le should
have at least the “copyright” line and a pointer to where the full notice is found.

one line to give the program’s name and
an idea of what it does.
Copyright (C) yyyy name of author
This program is free software; you can
redistribute it and/or
modify it under the terms of the GNU
General Public License
as published by the Free Software
Foundation; either version 2
of the License, or (at your option) any
later version.

for details.
The hypothetical commands `show w’ and `show c’ should show the appropriate parts of the

General Public License. Of course, the commands you use may be called something other than
`show w’ and `show c’; they could even be mouse-clicks or menu items--whatever suits your
program.

You should also get your employer (if you work as a programmer) or your school, if any, to
sign a “copyright disclaimer” for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all
copyright
interest in the program `Gnomovision’
(which makes passes at compilers)
written
by James Hacker.
signature of Ty Coon, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into proprietary

programs. If your program is a subroutine library, you may consider it more useful to permit
linking proprietary applications with the library. If this is what you want to do, use the GNU
Lesser General Public License (http://www.fsf.org/licenses/lgpl.html)

This program is distributed in the hope
that it will be useful,
but WITHOUT ANY WARRANTY; without even
the implied warranty of
MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the

87

instead of this License.

GNU Free Documentation License
Version 1.2, November 2002
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but
changing it is not allowed.

PREAMBLE

The Document may include Warranty Disclaimers next to the notice which states that this

The purpose of this License is to make a manual, textbook, or other functional and useful

by reference in this License, but only as regards disclaiming warranties: any other implication

and redistribute it, with or without modifying it, either commercially or noncommercially.

License.

work, while not being considered responsible for modifications made by others.

VERBATIM COPYING

document “free” in the sense of freedom: to assure everyone the effective freedom to copy

Secondarily, this License preserves for the author and publisher a way to get credit for their
This License is a kind of “copyleft”, which means that derivative works of the document must

License applies to the Document. These Warranty Disclaimers are considered to be included

that these Warranty Disclaimers may have is void and has no effect on the meaning of this

themselves be free in the same sense. It complements the GNU General Public License, which

You may copy and distribute the Document in any medium, either commercially or noncom-

We have designed this License in order to use it for manuals for free software, because free

License applies to the Document are reproduced in all copies, and that you add no other con-

same freedoms that the software does. But this License is not limited to software manuals; it

or control the reading or further copying of the copies you make or distribute. However, you

printed book. We recommend this License principally for works whose purpose is instruction

copies you must also follow the conditions in section 3.

is a copyleft license designed for free software.

mercially, provided that this License, the copyright notices, and the license notice saying this

software needs free documentation: a free program should come with manuals providing the

ditions whatsoever to those of this License. You may not use technical measures to obstruct

can be used for any textual work, regardless of subject matter or whether it is published as a

may accept compensation in exchange for copies. If you distribute a large enough number of

or reference.

You may also lend copies, under the same conditions stated above, and you may publicly

APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that contains a notice placed

display copies.

COPYING IN QUANTITY

by the copyright holder saying it can be distributed under the terms of this License. Such a

If you publish printed copies (or copies in media that commonly have printed covers) of the

the conditions stated herein. The “Document”, below, refers to any such manual or work. Any

you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts:

notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under
member of the public is a licensee, and is addressed as “you”. You accept the license if you
copy, modify or distribute the work in a way requiring permission under copyright law.

A “Modified Version” of the Document means any work containing the Document or a portion
of it, either copied verbatim, or with modifications and/or translated into another language.

A “Secondary Section” is a named appendix or a front-matter section of the Document that

deals exclusively with the relationship of the publishers or authors of the Document to the

Document, numbering more than 100, and the Document’s license notice requires Cover Texts,
Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers

must also clearly and legibly identify you as the publisher of these copies. The front cover
must present the full title with all words of the title equally prominent and visible. You may
add other material on the covers in addition. Copying with changes limited to the covers, as
long as they preserve the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.

Document’s overall subject (or to related matters) and contains nothing that could fall directly

If the required texts for either cover are too voluminous to t legibly, you should put the

Secondary Section may not explain any mathematics.) The relationship could be a matter

adjacent pages.

philosophical, ethical or political position regarding them.

must either include a machine-readable Transparent copy along with each Opaque copy, or

within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a

rst ones listed (as many as t reasonably) on the actual cover, and continue the rest onto

of historical connection with the subject or with related matters, or of legal, commercial,

If you publish or distribute Opaque copies of the Document numbering more than 100, you

The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being

state in or with each Opaque copy a computer-network location from which the general net-

License. If a section does not t the above definition of Secondary then it is not allowed to be

Transparent copy of the Document, free of added material. If you use the latter option, you

does not identify any Invariant Sections then there are none.

ty, to ensure that this Transparent copy will remain thus accessible at the stated location until

those of Invariant Sections, in the notice that says that the Document is released under this

work-using public has access to download using public-standard network protocols a complete

designated as Invariant. The Document may contain zero Invariant Sections. If the Document

must take reasonably prudent steps, when you begin distribution of Opaque copies in quanti-

The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or

Back-Cover Texts, in the notice that says that the Document is released under this License. A
Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

A “Transparent” copy of the Document means a machine-readable copy, represented in a for-

mat whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic

at least one year after the last time you distribute an Opaque copy (directly or through your
agents or retailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the Document well before

redistributing any large number of copies, to give them a chance to provide you with an
updated version of the Document.

paint programs or (for drawings) some widely available drawing editor, and that is suitable

MODIFICATIONS

input to text formatters. A copy made in an otherwise Transparent le format whose markup,

You may copy and distribute a Modified Version of the Document under the conditions of

by readers is not Transparent. An image format is not Transparent if used for any substantial

License, with the Modified Version filling the role of the Document, thus licensing distribution

for input to text formatters or for automatic translation to a variety of formats suitable for
or absence of markup, has been arranged to thwart or discourage subsequent modification
amount of text. A copy that is not “Transparent” is called “Opaque”.

sections 2 and 3 above, provided that you release the Modified Version under precisely this
and modification of the Modified Version to whoever possesses a copy of it. In addition, you

Examples of suitable formats for Transparent copies include plain ASCII without markup, Tex-

must do these things in the Modified Version:

dard-conforming simple HTML, PostScript or PDF designed for human modification. Examples

A.

formats that can be read and edited only by proprietary word processors, SGML or XML for

and from those of previous versions (which should, if there were any, be listed in the History

ed HTML, PostScript or PDF produced by some word processors for output purposes only.

section of the Document). You may use the same title as a previous version if the original

info input format, LaTeX input format, SGML or XML using a publicly available DTD, and stanof transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary
which the DTD and/or processing tools are not generally available, and the machine-generatThe “Title Page” means, for a printed book, the title page itself, plus such following pages

as are needed to hold, legibly, the material this License requires to appear in the title page.
For works in formats which do not have any title page as such, “Title Page” means the text

near the most prominent appearance of the work’s title, preceding the beginning of the body
of the text.

A section “Entitled XYZ” means a named subunit of the Document whose title either is precise-

ly XYZ or contains XYZ in parentheses following text that translates XYZ in another language.
(Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”,

“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when
you modify the Document means that it remains a section “Entitled XYZ” according to this
definition.

88

Use in the Title Page (and on the covers, if any) a title distinct from that of the Document,

publisher of that version gives permission.

B. List on the Title Page, as authors, one or more persons or entities responsible for authorship

of the modifications in the Modified Version, together with at least ve of the principal authors
of the Document (all of its principal authors, if it has fewer than ve), unless they release
you from this requirement.

C. State on the Title page the name of the publisher of the Modified Version, as the publisher.

Preserve all the copyright notices of the Document.

D.

You may add a section Entitled “Endorsements”, provided it contains nothing but endorse-

ments of your Modified Version by various parties--for example, statements of peer review
or that the text has been approved by an organization as the authoritative definition of a
standard.

You may add a passage of up to ve words as a Front-Cover Text, and a passage of up to 25
E. Add an appropriate copyright notice for your modifications adjacent to the other copyright

notices.

words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only
one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through

arrangements made by) any one entity. If the Document already includes a cover text for the
same cover, previously added by you or by arrangement made by the same entity you are
acting on behalf of, you may not add another; but you may replace the old one, on explicit

Include, immediately after the copyright notices, a license notice giving the public per-

F.

mission to use the Modified Version under the terms of this License, in the form shown in
the Addendum below.
Preserve in that license notice the full lists of Invariant Sections and required Cover Texts

G.

given in the Document’s license notice.
Include an unaltered copy of this License.

H.

permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License give permission to use
their names for publicity for or to assert or imply endorsement of any Modified Version.

COMBINING DOCUMENTS
You may combine the Document with other documents released under this License, under

the terms defined in section 4 above for modified versions, provided that you include in the

combination all of the Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its license notice, and that you
preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with

I.

Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at

least the title, year, new authors, and publisher of the Modified Version as given on the Title
Page. If there is no section Entitled “History” in the Document, create one stating the title,
year, authors, and publisher of the Document as given on its Title Page, then add an item
describing the Modified Version as stated in the previous sentence.

J.

Preserve the network location, if any, given in the Document for public access to a Trans-

parent copy of the Document, and likewise the network locations given in the Document for
previous versions it was based on. These may be placed in the “History” section. You may
omit a network location for a work that was published at least four years before the Document
itself, or if the original publisher of the version it refers to gives permission.

the same name but different contents, make the title of each such section unique by adding

at the end of it, in parentheses, the name of the original author or publisher of that section if

known, or else a unique number. Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled “History” in the various original
documents, forming one section Entitled “History”; likewise combine any sections Entitled

“Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections
Entitled “Endorsements”.

COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents released under

this License, and replace the individual copies of this License in the various documents with a
single copy that is included in the collection, provided that you follow the rules of this License
for verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute it individually under
this License, provided you insert a copy of this License into the extracted document, and follow
this License in all other respects regarding verbatim copying of that document.

AGGREGATION WITH INDEPENDENT WORKS

For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the

A compilation of the Document or its derivatives with other separate and independent docu-

section, and preserve in the section all the substance and tone of each of the contributor

gate” if the copyright resulting from the compilation is not used to limit the legal rights of the

K.

acknowledgements and/or dedications given therein.

L.

Preserve all the Invariant Sections of the Document, unaltered in their text and in their

titles. Section numbers or the equivalent are not considered part of the section titles.

ments or works, in or on a volume of a storage or distribution medium, is called an “aggrecompilation’s users beyond what the individual works permit. When the Document is included

in an aggregate, this License does not apply to the other works in the aggregate which are not
themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then
if the Document is less than one half of the entire aggregate, the Document’s Cover Texts
may be placed on covers that bracket the Document within the aggregate, or the electronic

equivalent of covers if the Document is in electronic form. Otherwise they must appear on
printed covers that bracket the whole aggregate.

M.

Delete any section Entitled “Endorsements”. Such a section may not be included in the

Modified Version.

TRANSLATION
Translation is considered a kind of modification, so you may distribute translations of the

N.

Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title

with any Invariant Section.

Document under the terms of section 4. Replacing Invariant Sections with translations requires
special permission from their copyright holders, but you may include translations of some

or all Invariant Sections in addition to the original versions of these Invariant Sections. You
may include a translation of this License, and all the license notices in the Document, and

any Warranty Disclaimers, provided that you also include the original English version of this
O.

Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or appendices that qualify as Se-

condary Sections and contain no material copied from the Document, you may at your option
designate some or all of these sections as invariant. To do this, add their titles to the list of
Invariant Sections in the Modified Version’s license notice. These titles must be distinct from
any other section titles.

89

License and the original versions of those notices and disclaimers. In case of a disagreement
between the translation and the original version of this License or a notice or disclaimer, the
original version will prevail.

If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”,

the requirement (section 4) to Preserve its Title (section 1) will typically require changing
the actual title.

TERMINATION
You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the

Document is void, and will automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this License will not have their
licenses terminated so long as such parties remain in full compliance.

FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/
copyleft/.

Each version of the License is given a distinguishing version number. If the Document specifies
that a particular numbered version of this License “or any later version” applies to it, you

have the option of following the terms and conditions either of that specified version or of

any later version that has been published (not as a draft) by the Free Software Foundation. If

the Document does not specify a version number of this License, you may choose any version
ever published (not as a draft) by the Free Software Foundation.

ADDENDUM: How to use this License for your documents
To use this License in a document you have written, include a copy of the License in the
document and put the following copyright and license notices just after the title page:

Copyright (c) YEAR YOUR NAME.
Permission is granted to copy,
distribute and/or modify this document
under the terms of the GNU Free
Documentation License, Version 1.2
or any later version published by the
Free Software Foundation;
with no Invariant Sections, no FrontCover Texts, and no Back-Cover Texts.
A copy of the license is included in
the section entitled “GNU
Free Documentation License”.
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the
“with...Texts.” line with this:

with the Invariant Sections being LIST
THEIR TITLES, with the
Front-Cover Texts being LIST, and with
the Back-Cover Texts being LIST.
If you have Invariant Sections without Cover Texts, or some other combination of the three,
merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing

these examples in parallel under your choice of free software license, such as the GNU General
Public License, to permit their use in free software.

90



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
Linearized                      : No
Page Count                      : 101
Profile CMM Type                : Little CMS
Profile Version                 : 2.1.0
Profile Class                   : Display Device Profile
Color Space Data                : RGB
Profile Connection Space        : XYZ
Profile Date Time               : 1998:02:09 06:49:00
Profile File Signature          : acsp
Primary Platform                : Apple Computer Inc.
CMM Flags                       : Not Embedded, Independent
Device Manufacturer             : Hewlett-Packard
Device Model                    : sRGB
Device Attributes               : Reflective, Glossy, Positive, Color
Rendering Intent                : Perceptual
Connection Space Illuminant     : 0.9642 1 0.82491
Profile Creator                 : Little CMS
Profile ID                      : 0
Profile Copyright               : Copyright (c) 1998 Hewlett-Packard Company
Profile Description             : sRGB IEC61966-2.1
Media White Point               : 0.95045 1 1.08905
Media Black Point               : 0 0 0
Red Matrix Column               : 0.43607 0.22249 0.01392
Green Matrix Column             : 0.38515 0.71687 0.09708
Blue Matrix Column              : 0.14307 0.06061 0.7141
Device Mfg Desc                 : IEC http://www.iec.ch
Device Model Desc               : IEC 61966-2.1 Default RGB colour space - sRGB
Viewing Cond Desc               : Reference Viewing Condition in IEC61966-2.1
Viewing Cond Illuminant         : 19.6445 20.3718 16.8089
Viewing Cond Surround           : 3.92889 4.07439 3.36179
Viewing Cond Illuminant Type    : D50
Luminance                       : 76.03647 80 87.12462
Measurement Observer            : CIE 1931
Measurement Backing             : 0 0 0
Measurement Geometry            : Unknown
Measurement Flare               : 0.999%
Measurement Illuminant          : D65
Technology                      : Cathode Ray Tube Display
Red Tone Reproduction Curve     : (Binary data 2060 bytes, use -b option to extract)
Green Tone Reproduction Curve   : (Binary data 2060 bytes, use -b option to extract)
Blue Tone Reproduction Curve    : (Binary data 2060 bytes, use -b option to extract)
Creator                         : Karsten Keil
Format                          : application/pdf
Title                           : Reference Guide
Language                        : en
Date                            : 2019:01:23 16:54:58+01:00
Producer                        : Apache FOP Version 2.1
PDF Version                     : 1.4
Creator Tool                    : DAPS 3.0.0 (https://opensuse.github.io/daps) using SUSE XSL Stylesheets 2.0.13 (based on DocBook XSL Stylesheets snapshot)
Metadata Date                   : 2019:01:23 16:54:58+01:00
Create Date                     : 2019:01:23 16:54:58+01:00
Page Mode                       : UseOutlines
Author                          : Karsten Keil
EXIF Metadata provided by EXIF.tools

Navigation menu