# Continuous Integration By using CI, builds are exercised across a variety of environments attempting to maximize code coverage. For every commit or pull request 6 builds are performed: ## Fedora (x86_64) * A fully packaged RPM build with all plugins enabled * Compiled under gcc with AddressSanitizer * Tests with -Werror enabled * Tests with the built in local test suite for all plugins. * All packages are installed * An installed testing run with the "test" plugin and pulling from LVFS. * With modem manager disabled ## Debian testing (x86_64) * A fully packaged DEB build with all plugins enabled * Compiled under gcc * Tests with -Werror enabled * Tests with the built in local test suite for all plugins. * All packages are installed * An installed testing run with the "test" plugin and pulling from LVFS. * All packages are removed ## Debian testing (i386) * A fully packaged DEB build with all plugins enabled * Compiled under gcc * Tests with -Werror enabled * Tests with the built in local test suite for all plugins. * All packages are installed * An installed testing run with the "test" plugin and pulling from LVFS. * All packages are removed ## Ubuntu devel release (x86_64) * A fully packaged DEB build with all plugins enabled * Compiled under clang * Tests without -Werror enabled * Tests with the built in local test suite for all plugins. * All packages are installed * An installed testing run with the "test" plugin and pulling from LVFS. * All packages are removed ## Debian testing (cross compile s390x) * Not packaged * Tests for missing translation files * No redfish support * Compiled under gcc * Tests with -Werror enabled * Runs local test suite using qemu-user * Modem manager disabled ## Arch Linux (x86_64) * A fully packaged pkg build with all plugins enabled * Compiled under gcc * Tests with -Werror enabled * Compile with the deprecated USB plugin enabled * Tests with the built in local test suite for all plugins. * All packages are installed ## Flatpak * A flatpak bundle with all plugins enabled * Compiled under gcc with the org.gnome.Sdk/x86_64/3.28 runtime * Builds without the daemon, so only fwupdtool is available * No GPG, PKCS-7, GObjectIntrospection, systemd or ConsoleKit support * No tests ## Adding a new target Dockerfiles are generated dynamically by the python script ```generate_dockerfile.py```. The python script will recognize the environment variable `OS` to determine what target to generate a Dockerfile for. ### dependencies.xml Initially the python script will read in `dependencies.xml` to generate a dependency list for that target. The XML is organized by a top level element representing the dependencies needed for building fwupd. The child elements represent individual dependencies for all distributions. * This element has an attribute `id` that represents the most common package name used by distributions * This element has an attribute `type` that represents if the package is needed at build time or runtime. Each dependency then has a mapping to individual distributions (`distro`). * This element has an attribute `id` that represents the distribution. Each distribution will have `package` elements and `control` elements. `Package` elements represent the name of the package needed for the distribution. * An optional attribute `variant` represents one deviation of that distribution. For example building a specific architecture or with a different compiler. * If the `package` element is empty the `id` of the `dependency` element will be used. * `Control` elements represent specific requirements associated to a dependency. They will contain elements with individual details. * `version` elements represent a minimum version to be installed * `inclusive` elements represent an inclusive list of architectures to be installed on * `exclusive` elements represent an exclusive list of architectures to not be installed on For convenience there is also a helper script `./contrib/ci/fwupd_setup_helpers.p install-dependencies` that parses `dependencies.xml`. ### Dockerfile.in The `Dockerfile.in` file will be used as a template to build the container. No hardcoded dependencies should be put in this file. They should be stored in `dependencies.xml`.