tests: integrate lcitool for generating build env manifests
This introduces https://gitlab.com/libvirt/libvirt-ci as a git submodule at tests/lcitool/libvirt-ci The 'lcitool' program within this submodule will be used to automatically generate build environment manifests from a definition of requirements in tests/lcitool/projects/qemu.yml It will ultimately be capable of generating - Dockerfiles - Package lists for installation in VMs - Variables for configuring Cirrus CI environments When a new build pre-requisite is needed for QEMU, if this package is not currently known to libvirt-ci, it must first be added to the 'mappings.yml' file in the above git repo. Then the submodule can be updated and the build pre-requisite added to the tests/lcitool/projects/qemu.yml file. Now all the build env manifests can be re-generated using 'make lcitool-refresh' This ensures that when a new build pre-requisite is introduced, it is added to all the different OS containers, VMs and Cirrus CI environments consistently. It also facilitates the addition of containers targetting new distros or updating existing containers to new versions of the same distro, where packages might have been renamed. Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20211215141949.3512719-8-berrange@redhat.com> Message-Id: <20220105135009.1584676-8-alex.bennee@linaro.org>
This commit is contained in:
parent
3f4a7a7cfb
commit
4ebb040f1f
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -64,3 +64,6 @@
|
||||
[submodule "roms/vbootrom"]
|
||||
path = roms/vbootrom
|
||||
url = https://gitlab.com/qemu-project/vbootrom.git
|
||||
[submodule "tests/lcitool/libvirt-ci"]
|
||||
path = tests/lcitool/libvirt-ci
|
||||
url = http://gitlab.com/libvirt/libvirt-ci
|
||||
|
2
Makefile
2
Makefile
@ -285,6 +285,7 @@ cscope:
|
||||
# Needed by "meson install"
|
||||
export DESTDIR
|
||||
|
||||
include $(SRC_PATH)/tests/lcitool/Makefile.include
|
||||
include $(SRC_PATH)/tests/docker/Makefile.include
|
||||
include $(SRC_PATH)/tests/vm/Makefile.include
|
||||
|
||||
@ -314,6 +315,7 @@ endif
|
||||
@echo 'Test targets:'
|
||||
$(call print-help,check,Run all tests (check-help for details))
|
||||
$(call print-help,bench,Run all benchmarks)
|
||||
$(call print-help,lcitool-help,Help about targets for managing build environment manifests)
|
||||
$(call print-help,docker-help,Help about targets running tests inside containers)
|
||||
$(call print-help,vm-help,Help about targets running tests inside VM)
|
||||
@echo ''
|
||||
|
@ -382,14 +382,112 @@ Along with many other images, the ``centos8`` image is defined in a Dockerfile
|
||||
in ``tests/docker/dockerfiles/``, called ``centos8.docker``. ``make docker-help``
|
||||
command will list all the available images.
|
||||
|
||||
To add a new image, simply create a new ``.docker`` file under the
|
||||
``tests/docker/dockerfiles/`` directory.
|
||||
|
||||
A ``.pre`` script can be added beside the ``.docker`` file, which will be
|
||||
executed before building the image under the build context directory. This is
|
||||
mainly used to do necessary host side setup. One such setup is ``binfmt_misc``,
|
||||
for example, to make qemu-user powered cross build containers work.
|
||||
|
||||
Most of the existing Dockerfiles were written by hand, simply by creating a
|
||||
a new ``.docker`` file under the ``tests/docker/dockerfiles/`` directory.
|
||||
This has led to an inconsistent set of packages being present across the
|
||||
different containers.
|
||||
|
||||
Thus going forward, QEMU is aiming to automatically generate the Dockerfiles
|
||||
using the ``lcitool`` program provided by the ``libvirt-ci`` project:
|
||||
|
||||
https://gitlab.com/libvirt/libvirt-ci
|
||||
|
||||
In that project, there is a ``mappings.yml`` file defining the distro native
|
||||
package names for a wide variety of third party projects. This is processed
|
||||
in combination with a project defined list of build pre-requisites to determine
|
||||
the list of native packages to install on each distribution. This can be used
|
||||
to generate dockerfiles, VM package lists and Cirrus CI variables needed to
|
||||
setup build environments across OS distributions with a consistent set of
|
||||
packages present.
|
||||
|
||||
When preparing a patch series that adds a new build pre-requisite to QEMU,
|
||||
updates to various lcitool data files may be required.
|
||||
|
||||
|
||||
Adding new build pre-requisites
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
In the simple case where the pre-requisite is already known to ``libvirt-ci``
|
||||
the following steps are needed
|
||||
|
||||
* Edit ``tests/lcitool/projects/qemu.yml`` and add the pre-requisite
|
||||
|
||||
* Run ``make lcitool-refresh`` to re-generate all relevant build environment
|
||||
manifests
|
||||
|
||||
In some cases ``libvirt-ci`` will not know about the build pre-requisite and
|
||||
thus some extra preparation steps will be required first
|
||||
|
||||
* Fork the ``libvirt-ci`` project on gitlab
|
||||
|
||||
* Edit the ``mappings.yml`` change to add an entry for the new build
|
||||
prerequisite, listing its native package name on as many OS distros
|
||||
as practical.
|
||||
|
||||
* Commit the ``mappings.yml`` change and submit a merge request to
|
||||
the ``libvirt-ci`` project, noting in the description that this
|
||||
is a new build pre-requisite desired for use with QEMU
|
||||
|
||||
* CI pipeline will run to validate that the changes to ``mappings.yml``
|
||||
are correct, by attempting to install the newly listed package on
|
||||
all OS distributions supported by ``libvirt-ci``.
|
||||
|
||||
* Once the merge request is accepted, go back to QEMU and update
|
||||
the ``libvirt-ci`` submodule to point to a commit that contains
|
||||
the ``mappings.yml`` update.
|
||||
|
||||
|
||||
Adding new OS distros
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
In some cases ``libvirt-ci`` will not know about the OS distro that is
|
||||
desired to be tested. Before adding a new OS distro, discuss the proposed
|
||||
addition:
|
||||
|
||||
* Send a mail to qemu-devel, copying people listed in the
|
||||
MAINTAINERS file for ``Build and test automation``.
|
||||
|
||||
There are limited CI compute resources available to QEMU, so the
|
||||
cost/benefit tradeoff of adding new OS distros needs to be considered.
|
||||
|
||||
* File an issue at https://gitlab.com/libvirt/libvirt-ci/-/issues
|
||||
pointing to the qemu-devel mail thread in the archives.
|
||||
|
||||
This alerts other people who might be interested in the work
|
||||
to avoid duplication, as well as to get feedback from libvirt-ci
|
||||
maintainers on any tips to ease the addition
|
||||
|
||||
Assuming there is agreement to add a new OS distro then
|
||||
|
||||
* Fork the ``libvirt-ci`` project on gitlab
|
||||
|
||||
* Add metadata under ``guests/lcitool/lcitool/ansible/group_vars/``
|
||||
for the new OS distro. There might be code changes required if
|
||||
the OS distro uses a package format not currently known. The
|
||||
``libvirt-ci`` maintainers can advise on this when the issue
|
||||
is file.
|
||||
|
||||
* Edit the ``mappings.yml`` change to update all the existing package
|
||||
entries, providing details of the new OS distro
|
||||
|
||||
* Commit the ``mappings.yml`` change and submit a merge request to
|
||||
the ``libvirt-ci`` project, noting in the description that this
|
||||
is a new build pre-requisite desired for use with QEMU
|
||||
|
||||
* CI pipeline will run to validate that the changes to ``mappings.yml``
|
||||
are correct, by attempting to install the newly listed package on
|
||||
all OS distributions supported by ``libvirt-ci``.
|
||||
|
||||
* Once the merge request is accepted, go back to QEMU and update
|
||||
the ``libvirt-ci`` submodule to point to a commit that contains
|
||||
the ``mappings.yml`` update.
|
||||
|
||||
|
||||
Tests
|
||||
~~~~~
|
||||
|
||||
|
17
tests/lcitool/Makefile.include
Normal file
17
tests/lcitool/Makefile.include
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
LCITOOL_REFRESH = $(SRC_PATH)/tests/lcitool/refresh
|
||||
|
||||
lcitool:
|
||||
@echo 'Manage build environment manifests'
|
||||
@echo
|
||||
@echo 'Available targets:'
|
||||
@echo
|
||||
@echo ' lcitool: Print this help.'
|
||||
@echo ' lcitool-refresh: Re-generate all build environment manifests.'
|
||||
@echo
|
||||
|
||||
lcitool-help: lcitool
|
||||
|
||||
lcitool-refresh:
|
||||
$(call quiet-command, git submodule update --init $(SRC_PATH)/tests/lcitool/libvirt-ci)
|
||||
$(call quiet-command, $(LCITOOL_REFRESH))
|
1
tests/lcitool/libvirt-ci
Submodule
1
tests/lcitool/libvirt-ci
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 29cec2153b9a4dbb2e66f1cbc9866a4eff519cfd
|
115
tests/lcitool/projects/qemu.yml
Normal file
115
tests/lcitool/projects/qemu.yml
Normal file
@ -0,0 +1,115 @@
|
||||
---
|
||||
packages:
|
||||
- alsa
|
||||
- bash
|
||||
- bc
|
||||
- brlapi
|
||||
- bzip2
|
||||
- bzip2-libs
|
||||
- capstone
|
||||
- ccache
|
||||
- clang
|
||||
- column
|
||||
- ctags
|
||||
- cyrus-sasl
|
||||
- daxctl
|
||||
- dbus-daemon
|
||||
- device-mapper-multipath
|
||||
- diffutils
|
||||
- dtrace
|
||||
- findutils
|
||||
- g++
|
||||
- gcc
|
||||
- gcovr
|
||||
- gettext
|
||||
- genisoimage
|
||||
- glib2
|
||||
- glib2-static
|
||||
- glibc-static
|
||||
- glusterfs
|
||||
- gnutls
|
||||
- gtk3
|
||||
- hostname
|
||||
- libaio
|
||||
- libattr
|
||||
- libasan
|
||||
- libbpf
|
||||
- libcacard
|
||||
- libcap-ng
|
||||
- libcurl
|
||||
- libdrm
|
||||
- libepoxy
|
||||
- libfdt
|
||||
- libffi
|
||||
- libgcrypt
|
||||
- libibverbs
|
||||
- libiscsi
|
||||
- libjemalloc
|
||||
- libjpeg
|
||||
- libnfs
|
||||
- libnuma
|
||||
- libpmem
|
||||
- libpng
|
||||
- librbd
|
||||
- librdmacm
|
||||
- libseccomp
|
||||
- libselinux
|
||||
- libslirp
|
||||
- libssh
|
||||
- libtasn1
|
||||
- libubsan
|
||||
- libudev
|
||||
- liburing
|
||||
- libusbx
|
||||
- libvdeplug
|
||||
- libxml2
|
||||
- libzstd
|
||||
- llvm
|
||||
- lttng-ust
|
||||
- lzo
|
||||
- netcat
|
||||
- nettle
|
||||
- ninja
|
||||
- nsis
|
||||
- make
|
||||
- mesa-libgbm
|
||||
- meson
|
||||
- ncursesw
|
||||
- pam
|
||||
- pcre-static
|
||||
- perl
|
||||
- perl-Test-Harness
|
||||
- pixman
|
||||
- pkg-config
|
||||
- pulseaudio
|
||||
- python3
|
||||
- python3-PyYAML
|
||||
- python3-numpy
|
||||
- python3-opencv
|
||||
- python3-pillow
|
||||
- python3-pip
|
||||
- python3-sphinx
|
||||
- python3-sphinx-rtd-theme
|
||||
- python3-virtualenv
|
||||
- rpm2cpio
|
||||
- sdl2
|
||||
- sdl2-image
|
||||
- sed
|
||||
- snappy
|
||||
- sparse
|
||||
- spice-protocol
|
||||
- spice-server
|
||||
- ssh-client
|
||||
- systemd
|
||||
- tar
|
||||
- tesseract
|
||||
- tesseract-eng
|
||||
- texinfo
|
||||
- usbredir
|
||||
- virglrenderer
|
||||
- vte
|
||||
- which
|
||||
- xen
|
||||
- xfsprogs
|
||||
- zlib
|
||||
- zlib-static
|
67
tests/lcitool/refresh
Executable file
67
tests/lcitool/refresh
Executable file
@ -0,0 +1,67 @@
|
||||
#!/usr/bin/python3
|
||||
#
|
||||
# Re-generate container recipes
|
||||
#
|
||||
# This script uses the "lcitool" available from
|
||||
#
|
||||
# https://gitlab.com/libvirt/libvirt-ci
|
||||
#
|
||||
# Copyright (c) 2020 Red Hat Inc.
|
||||
#
|
||||
# This work is licensed under the terms of the GNU GPL, version 2
|
||||
# or (at your option) any later version. See the COPYING file in
|
||||
# the top-level directory.
|
||||
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
if len(sys.argv) != 1:
|
||||
print("syntax: %s" % sys.argv[0], file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
self_dir = Path(__file__).parent
|
||||
src_dir = self_dir.parent.parent
|
||||
dockerfiles_dir = Path(src_dir, "tests", "docker", "dockerfiles")
|
||||
|
||||
lcitool_path = Path(self_dir, "libvirt-ci", "lcitool")
|
||||
|
||||
lcitool_cmd = [lcitool_path, "--data-dir", self_dir]
|
||||
|
||||
def atomic_write(filename, content):
|
||||
tmp = filename.with_suffix(filename.suffix + ".tmp")
|
||||
try:
|
||||
with tmp.open("w") as fp:
|
||||
print(content, file=fp, end="")
|
||||
tmp.rename(filename)
|
||||
except Exception as ex:
|
||||
tmp.unlink()
|
||||
raise
|
||||
|
||||
def generate(filename, cmd, trailer):
|
||||
print("Generate %s" % filename)
|
||||
lcitool=subprocess.run(cmd, capture_output=True)
|
||||
|
||||
if lcitool.returncode != 0:
|
||||
raise Exception("Failed to generate %s: %s" % (filename, lcitool.stderr))
|
||||
|
||||
content = lcitool.stdout.decode("utf8")
|
||||
if trailer is not None:
|
||||
content += trailer
|
||||
atomic_write(filename, content)
|
||||
|
||||
def generate_dockerfile(host, target, cross=None, trailer=None):
|
||||
filename = Path(src_dir, "tests", "docker", "dockerfiles", host + ".docker")
|
||||
cmd = lcitool_cmd + ["dockerfile"]
|
||||
if cross is not None:
|
||||
cmd.extend(["--cross", cross])
|
||||
cmd.extend([target, "qemu"])
|
||||
generate(filename, cmd, trailer)
|
||||
|
||||
try:
|
||||
sys.exit(0)
|
||||
except Exception as ex:
|
||||
print(str(ex), file=sys.stderr)
|
||||
sys.exit(1)
|
Loading…
Reference in New Issue
Block a user