At this point we have a large number of jobs, all of which are specified to be built on various "Platforms". However we have yet to define what a Platform is.
A Platform for the purpose of the CI system is a set of machines which have the exact same operating system, default compiler and version of Qt and other dependencies installed. It is not permitted for a builder to have any software which is hosted on KDE Infrastructure installed on it as it may interfere with the process of performing builds or executing tests.
It should be noted that the CI setup itself does not require any particular form of name to be used for a Platform and names do not have to be entered anywhere before they can be used. Jobs are allocated to machines by matching the label they're requesting with the machines available to Jenkins. Machines have the appropriate labels (being the Platform names) assigned to them when they are registered with Jenkins.
All Linux builds are run effectively on bare metal, inside Docker containers. These containers are provisioned by Jenkins automatically when they're needed for a job with a maximum of 10 containers being able to run at any given time. These containers are spread equally across the build hosts we have available to us using Docker Swarm. Upon completion of a build containers are shutdown and then destroyed ensuring each build starts with a completely clean slate.
At the moment we have three Linux based images available:
- Ubuntu Xenial (16.04) with Qt 5.7 (Neon)
- OpenSUSE Tumbleweed with Qt 5.9 Beta (KDE:Unstable:Qt)
- Fedora 25 with Qt 5.9 Beta (kdesig/qt-5.9)
The Dockerfile scripts which are used by the CI system to create the images can be found within the system-images folder. These images can be regenerated by running the Docker Generate $platform Image jobs on the CI system. It should be noted that changes to these images will not trigger these jobs to be run automatically.
If your jobs require additional dependencies to be installed please feel free to submit patches which amend the Dockerfile scripts to install the necessary packages.
FreeBSD Builds are performed within statically provisioned virtual machines, with 2 being hosted by our own build servers, and the other by Digital Ocean. These run FreeBSD 11 and use Clang as their default compiler. Jobs are allocated to these by Jenkins normal logic for static build machines. Currently Qt 5.7 is the version being provided by these machines.
At the moment builds are only being enabled for projects at the request of the KDE FreeBSD team, so please consult with them if you are interested in FreeBSD CI coverage for your project.
The steps for setting up a FreeBSD build node can be found at doc/FreeBSD Slave.txt for those interested. If your jobs require additional dependencies to be installed please file a Sysadmin ticket, ideally supplying the name of the FreeBSD package which needs to be installed.
Windows Builds are also performed within statically provisioned virtual machines, with both being hosted by our own build servers. They run Windows 10 Enterprise (version 15063.332) and use MSVC 2017 Enterprise (v15.0.26430.12) as their compiler. Currently Qt 5.7 is the version being provided by these machines, using binaries downloaded from the Qt Project. For all other external dependencies (including CMake), Craft is used to provision those to the machines.
At the moment due to breakages in the Threadweaver framework, Windows builds are not being offered outside of Frameworks.
The steps for setting up a Windows build node can be found at doc/Windows Slave.txt for those interested. If your jobs require additional dependencies to be installed, please check to see if they can be provided by Craft then file a Sysadmin ticket, providing the name of the Craft packages which need to be installed.
At this time due to a lack of people familiar with Mac native packaging we are not providing macOS builds on the CI system. Should you be interested in working on this please contact Sysadmin. Note that builds should be targeting an environment which is similar to that which would be present on normal end-user systems (ie. without Macports, Fink or similar setups)