aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/ci
diff options
context:
space:
mode:
authorTimos Ampelikiotis <t.ampelikiotis@virtualopensystems.com>2023-10-10 11:40:56 +0000
committerTimos Ampelikiotis <t.ampelikiotis@virtualopensystems.com>2023-10-10 11:40:56 +0000
commite02cda008591317b1625707ff8e115a4841aa889 (patch)
treeaee302e3cf8b59ec2d32ec481be3d1afddfc8968 /scripts/ci
parentcc668e6b7e0ffd8c9d130513d12053cf5eda1d3b (diff)
Introduce Virtio-loopback epsilon release:
Epsilon release introduces a new compatibility layer which make virtio-loopback design to work with QEMU and rust-vmm vhost-user backend without require any changes. Signed-off-by: Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com> Change-Id: I52e57563e08a7d0bdc002f8e928ee61ba0c53dd9
Diffstat (limited to 'scripts/ci')
-rwxr-xr-xscripts/ci/coverage-summary.sh27
-rwxr-xr-xscripts/ci/gitlab-pipeline-status195
-rw-r--r--scripts/ci/org.centos/stream/8/build-environment.yml51
-rwxr-xr-xscripts/ci/org.centos/stream/8/x86_64/configure208
-rwxr-xr-xscripts/ci/org.centos/stream/8/x86_64/test-avocado70
-rw-r--r--scripts/ci/org.centos/stream/README17
-rw-r--r--scripts/ci/setup/.gitignore2
-rw-r--r--scripts/ci/setup/build-environment.yml154
-rw-r--r--scripts/ci/setup/gitlab-runner.yml71
-rw-r--r--scripts/ci/setup/inventory.template1
-rw-r--r--scripts/ci/setup/vars.yml.template12
11 files changed, 808 insertions, 0 deletions
diff --git a/scripts/ci/coverage-summary.sh b/scripts/ci/coverage-summary.sh
new file mode 100755
index 000000000..8d9fb4de4
--- /dev/null
+++ b/scripts/ci/coverage-summary.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Author: Alex Bennée <alex.bennee@linaro.org>
+#
+# Summerise the state of code coverage with gcovr and tweak the output
+# to be more sane on CI runner. As we expect to be executed on a
+# throw away CI instance we do spam temp files all over the shop. You
+# most likely don't want to execute this script but just call gcovr
+# directly. See also "make coverage-report"
+#
+# This code is licensed under the GPL version 2 or later. See
+# the COPYING file in the top-level directory.
+
+# first generate the coverage report
+gcovr -p -o raw-report.txt
+
+# strip the full-path and line markers
+sed s@$PWD\/@@ raw-report.txt | sed s/[0-9]\*[,-]//g > simplified.txt
+
+# reflow lines that got split
+awk '/.[ch]$/ { printf("%s", $0); next } 1' simplified.txt > rejoined.txt
+
+# columnify
+column -t rejoined.txt > final.txt
+
+# and dump, stripping out 0% coverage
+grep -v "0%" final.txt
diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status
new file mode 100755
index 000000000..924db327f
--- /dev/null
+++ b/scripts/ci/gitlab-pipeline-status
@@ -0,0 +1,195 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2019-2020 Red Hat, Inc.
+#
+# Author:
+# Cleber Rosa <crosa@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+"""
+Checks the GitLab pipeline status for a given commit ID
+"""
+
+# pylint: disable=C0103
+
+import argparse
+import http.client
+import json
+import os
+import subprocess
+import time
+import sys
+
+
+class CommunicationFailure(Exception):
+ """Failed to communicate to gitlab.com APIs."""
+
+
+class NoPipelineFound(Exception):
+ """Communication is successfull but pipeline is not found."""
+
+
+def get_local_branch_commit(branch):
+ """
+ Returns the commit sha1 for the *local* branch named "staging"
+ """
+ result = subprocess.run(['git', 'rev-parse', branch],
+ stdin=subprocess.DEVNULL,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.DEVNULL,
+ cwd=os.path.dirname(__file__),
+ universal_newlines=True).stdout.strip()
+ if result == branch:
+ raise ValueError("There's no local branch named '%s'" % branch)
+ if len(result) != 40:
+ raise ValueError("Branch '%s' HEAD doesn't look like a sha1" % branch)
+ return result
+
+
+def get_json_http_response(url):
+ """
+ Returns the JSON content of an HTTP GET request to gitlab.com
+ """
+ connection = http.client.HTTPSConnection('gitlab.com')
+ connection.request('GET', url=url)
+ response = connection.getresponse()
+ if response.code != http.HTTPStatus.OK:
+ msg = "Received unsuccessful response: %s (%s)" % (response.code,
+ response.reason)
+ raise CommunicationFailure(msg)
+ return json.loads(response.read())
+
+
+def get_pipeline_status(project_id, commit_sha1):
+ """
+ Returns the JSON content of the pipeline status API response
+ """
+ url = '/api/v4/projects/{}/pipelines?sha={}'.format(project_id,
+ commit_sha1)
+ json_response = get_json_http_response(url)
+
+ # As far as I can tell, there should be only one pipeline for the same
+ # project + commit. If this assumption is false, we can add further
+ # filters to the url, such as username, and order_by.
+ if not json_response:
+ msg = "No pipeline found for project %s and commit %s" % (project_id,
+ commit_sha1)
+ raise NoPipelineFound(msg)
+ return json_response[0]
+
+
+def wait_on_pipeline_success(timeout, interval,
+ project_id, commit_sha):
+ """
+ Waits for the pipeline to finish within the given timeout
+ """
+ start = time.time()
+ while True:
+ if time.time() >= (start + timeout):
+ msg = ("Timeout (-t/--timeout) of %i seconds reached, "
+ "won't wait any longer for the pipeline to complete")
+ msg %= timeout
+ print(msg)
+ return False
+
+ try:
+ status = get_pipeline_status(project_id, commit_sha)
+ except NoPipelineFound:
+ print('Pipeline has not been found, it may not have been created yet.')
+ time.sleep(1)
+ continue
+
+ pipeline_status = status['status']
+ status_to_wait = ('created', 'waiting_for_resource', 'preparing',
+ 'pending', 'running')
+ if pipeline_status in status_to_wait:
+ print('%s...' % pipeline_status)
+ time.sleep(interval)
+ continue
+
+ if pipeline_status == 'success':
+ return True
+
+ msg = "Pipeline failed, check: %s" % status['web_url']
+ print(msg)
+ return False
+
+
+def create_parser():
+ parser = argparse.ArgumentParser(
+ prog='pipeline-status',
+ description='check or wait on a pipeline status')
+
+ parser.add_argument('-t', '--timeout', type=int, default=7200,
+ help=('Amount of time (in seconds) to wait for the '
+ 'pipeline to complete. Defaults to '
+ '%(default)s'))
+ parser.add_argument('-i', '--interval', type=int, default=60,
+ help=('Amount of time (in seconds) to wait between '
+ 'checks of the pipeline status. Defaults '
+ 'to %(default)s'))
+ parser.add_argument('-w', '--wait', action='store_true', default=False,
+ help=('Wether to wait, instead of checking only once '
+ 'the status of a pipeline'))
+ parser.add_argument('-p', '--project-id', type=int, default=11167699,
+ help=('The GitLab project ID. Defaults to the project '
+ 'for https://gitlab.com/qemu-project/qemu, that '
+ 'is, "%(default)s"'))
+ parser.add_argument('-b', '--branch', type=str, default="staging",
+ help=('Specify the branch to check. '
+ 'Use HEAD for your current branch. '
+ 'Otherwise looks at "%(default)s"'))
+ parser.add_argument('-c', '--commit',
+ default=None,
+ help=('Look for a pipeline associated with the given '
+ 'commit. If one is not explicitly given, the '
+ 'commit associated with the default branch '
+ 'is used.'))
+ parser.add_argument('--verbose', action='store_true', default=False,
+ help=('A minimal verbosity level that prints the '
+ 'overall result of the check/wait'))
+ return parser
+
+def main():
+ """
+ Script entry point
+ """
+ parser = create_parser()
+ args = parser.parse_args()
+
+ if not args.commit:
+ args.commit = get_local_branch_commit(args.branch)
+
+ success = False
+ try:
+ if args.wait:
+ success = wait_on_pipeline_success(
+ args.timeout,
+ args.interval,
+ args.project_id,
+ args.commit)
+ else:
+ status = get_pipeline_status(args.project_id,
+ args.commit)
+ success = status['status'] == 'success'
+ except Exception as error: # pylint: disable=W0703
+ if args.verbose:
+ print("ERROR: %s" % error.args[0])
+ except KeyboardInterrupt:
+ if args.verbose:
+ print("Exiting on user's request")
+
+ if success:
+ if args.verbose:
+ print('success')
+ sys.exit(0)
+ else:
+ if args.verbose:
+ print('failure')
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/ci/org.centos/stream/8/build-environment.yml b/scripts/ci/org.centos/stream/8/build-environment.yml
new file mode 100644
index 000000000..42b047163
--- /dev/null
+++ b/scripts/ci/org.centos/stream/8/build-environment.yml
@@ -0,0 +1,51 @@
+---
+- name: Installation of extra packages to build QEMU
+ hosts: all
+ tasks:
+ - name: Extra check for CentOS Stream 8
+ lineinfile:
+ path: /etc/redhat-release
+ line: CentOS Stream release 8
+ state: present
+ check_mode: yes
+ register: centos_stream_8
+
+ - name: Enable PowerTools repo on CentOS Stream 8
+ ini_file:
+ path: /etc/yum.repos.d/CentOS-Stream-PowerTools.repo
+ section: powertools
+ option: enabled
+ value: "1"
+ when:
+ - ansible_facts['distribution'] == 'CentOS'
+ - ansible_facts['distribution_major_version'] == '8'
+ - centos_stream_8
+
+ - name: Install basic packages to build QEMU on CentOS Stream 8
+ dnf:
+ name:
+ - device-mapper-multipath-devel
+ - glusterfs-api-devel
+ - gnutls-devel
+ - libcap-ng-devel
+ - libcurl-devel
+ - libfdt-devel
+ - libiscsi-devel
+ - libpmem-devel
+ - librados-devel
+ - librbd-devel
+ - libseccomp-devel
+ - libssh-devel
+ - libxkbcommon-devel
+ - ninja-build
+ - numactl-devel
+ - python3-sphinx
+ - redhat-rpm-config
+ - snappy-devel
+ - spice-server-devel
+ - systemd-devel
+ state: present
+ when:
+ - ansible_facts['distribution'] == 'CentOS'
+ - ansible_facts['distribution_major_version'] == '8'
+ - centos_stream_8
diff --git a/scripts/ci/org.centos/stream/8/x86_64/configure b/scripts/ci/org.centos/stream/8/x86_64/configure
new file mode 100755
index 000000000..048e80dc4
--- /dev/null
+++ b/scripts/ci/org.centos/stream/8/x86_64/configure
@@ -0,0 +1,208 @@
+#!/bin/sh -e
+#
+# Configuration for QEMU based on CentOS Stream 8 x86_64 builds
+#
+# The "configure" command line is based on:
+#
+# https://git.centos.org/rpms/qemu-kvm/blob/c8s-stream-rhel/f/SPECS/qemu-kvm.spec
+#
+# But, because the SPEC file contains a number of conditionals and
+# variable and expansions only available at RPM build time, this version
+# was initially generated from an actual RPM build on an x86_64 platform.
+#
+# From that initial version, options that are required or are a
+# consequence of non-upstream patches have been adapted. One example
+# is "--without-default-devices" which is *not* present here, given
+# that patches adding downstream specific devices are not available.
+#
+../configure \
+--prefix="/usr" \
+--libdir="/usr/lib64" \
+--datadir="/usr/share" \
+--sysconfdir="/etc" \
+--interp-prefix=/usr/qemu-%M \
+--localstatedir="/var" \
+--docdir="/usr/share/doc" \
+--libexecdir="/usr/libexec" \
+--extra-ldflags="-Wl,--build-id -Wl,-z,relro -Wl,-z,now" \
+--extra-cflags="-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection" \
+--with-suffix="qemu-kvm" \
+--firmwarepath=/usr/share/qemu-firmware \
+--with-git=meson \
+--with-git-submodules=update \
+--target-list="x86_64-softmmu" \
+--block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \
+--audio-drv-list="" \
+--block-drv-ro-whitelist="vmdk,vhdx,vpc,https,ssh" \
+--with-coroutine=ucontext \
+--with-git=git \
+--tls-priority=@QEMU,SYSTEM \
+--disable-attr \
+--disable-auth-pam \
+--disable-avx2 \
+--disable-avx512f \
+--disable-bochs \
+--disable-bpf \
+--disable-brlapi \
+--disable-bsd-user \
+--disable-bzip2 \
+--disable-cap-ng \
+--disable-capstone \
+--disable-cfi \
+--disable-cfi-debug \
+--disable-cloop \
+--disable-cocoa \
+--disable-coroutine-pool \
+--disable-crypto-afalg \
+--disable-curl \
+--disable-curses \
+--disable-debug-info \
+--disable-debug-mutex \
+--disable-debug-tcg \
+--disable-dmg \
+--disable-docs \
+--disable-fuse \
+--disable-fuse-lseek \
+--disable-gcrypt \
+--disable-gio \
+--disable-glusterfs \
+--disable-gnutls \
+--disable-gtk \
+--disable-guest-agent \
+--disable-guest-agent-msi \
+--disable-hax \
+--disable-hvf \
+--disable-iconv \
+--disable-kvm \
+--disable-libdaxctl \
+--disable-libiscsi \
+--disable-libnfs \
+--disable-libpmem \
+--disable-libssh \
+--disable-libudev \
+--disable-libusb \
+--disable-libxml2 \
+--disable-linux-aio \
+--disable-linux-io-uring \
+--disable-linux-user \
+--disable-live-block-migration \
+--disable-lto \
+--disable-lzfse \
+--disable-lzo \
+--disable-malloc-trim \
+--disable-membarrier \
+--disable-modules \
+--disable-module-upgrades \
+--disable-mpath \
+--disable-multiprocess \
+--disable-netmap \
+--disable-nettle \
+--disable-numa \
+--disable-nvmm \
+--disable-opengl \
+--disable-parallels \
+--disable-pie \
+--disable-pvrdma \
+--disable-qcow1 \
+--disable-qed \
+--disable-qom-cast-debug \
+--disable-rbd \
+--disable-rdma \
+--disable-replication \
+--disable-rng-none \
+--disable-safe-stack \
+--disable-sanitizers \
+--disable-sdl \
+--disable-sdl-image \
+--disable-seccomp \
+--disable-slirp-smbd \
+--disable-smartcard \
+--disable-snappy \
+--disable-sparse \
+--disable-spice \
+--disable-strip \
+--disable-system \
+--disable-tcg \
+--disable-tools \
+--disable-tpm \
+--disable-u2f \
+--disable-usb-redir \
+--disable-user \
+--disable-vde \
+--disable-vdi \
+--disable-vhost-crypto \
+--disable-vhost-kernel \
+--disable-vhost-net \
+--disable-vhost-scsi \
+--disable-vhost-user \
+--disable-vhost-user-blk-server \
+--disable-vhost-vdpa \
+--disable-vhost-vsock \
+--disable-virglrenderer \
+--disable-virtfs \
+--disable-virtiofsd \
+--disable-vnc \
+--disable-vnc-jpeg \
+--disable-vnc-png \
+--disable-vnc-sasl \
+--disable-vte \
+--disable-vvfat \
+--disable-werror \
+--disable-whpx \
+--disable-xen \
+--disable-xen-pci-passthrough \
+--disable-xfsctl \
+--disable-xkbcommon \
+--disable-zstd \
+--enable-attr \
+--enable-avx2 \
+--enable-cap-ng \
+--enable-capstone \
+--enable-coroutine-pool \
+--enable-curl \
+--enable-debug-info \
+--enable-docs \
+--enable-fdt \
+--enable-gcrypt \
+--enable-glusterfs \
+--enable-gnutls \
+--enable-guest-agent \
+--enable-iconv \
+--enable-kvm \
+--enable-libiscsi \
+--enable-libpmem \
+--enable-libssh \
+--enable-libusb \
+--enable-libudev \
+--enable-linux-aio \
+--enable-lzo \
+--enable-malloc-trim \
+--enable-modules \
+--enable-mpath \
+--enable-numa \
+--enable-opengl \
+--enable-pie \
+--enable-rbd \
+--enable-rdma \
+--enable-seccomp \
+--enable-snappy \
+--enable-smartcard \
+--enable-spice \
+--enable-system \
+--enable-tcg \
+--enable-tools \
+--enable-tpm \
+--enable-trace-backend=dtrace \
+--enable-usb-redir \
+--enable-virtiofsd \
+--enable-vhost-kernel \
+--enable-vhost-net \
+--enable-vhost-user \
+--enable-vhost-user-blk-server \
+--enable-vhost-vdpa \
+--enable-vhost-vsock \
+--enable-vnc \
+--enable-vnc-png \
+--enable-vnc-sasl \
+--enable-werror \
+--enable-xkbcommon
diff --git a/scripts/ci/org.centos/stream/8/x86_64/test-avocado b/scripts/ci/org.centos/stream/8/x86_64/test-avocado
new file mode 100755
index 000000000..7aeecbcfb
--- /dev/null
+++ b/scripts/ci/org.centos/stream/8/x86_64/test-avocado
@@ -0,0 +1,70 @@
+#!/bin/sh -e
+#
+# Runs a previously vetted list of tests, either marked explicitly for
+# KVM and x86_64, or tests that are generic enough to be valid for all
+# targets. Such a test list can be generated with:
+#
+# ./tests/venv/bin/avocado list --filter-by-tags-include-empty \
+# --filter-by-tags-include-empty-key -t accel:kvm,arch:x86_64 \
+# tests/avocado/
+#
+# This is almost the complete list of avocado based tests available at
+# the time this was compile, with the following exceptions:
+#
+# * Require machine type "x-remote":
+# - tests/avocado/multiprocess.py:Multiprocess.test_multiprocess_x86_64
+#
+# * Needs superuser privileges:
+# - tests/avocado/virtiofs_submounts.py:VirtiofsSubmountsTest.test_pre_virtiofsd_set_up
+# - tests/avocado/virtiofs_submounts.py:VirtiofsSubmountsTest.test_pre_launch_set_up
+# - tests/avocado/virtiofs_submounts.py:VirtiofsSubmountsTest.test_post_launch_set_up
+# - tests/avocado/virtiofs_submounts.py:VirtiofsSubmountsTest.test_post_mount_set_up
+# - tests/avocado/virtiofs_submounts.py:VirtiofsSubmountsTest.test_two_runs
+#
+# * Requires display type "egl-headless":
+# - tests/avocado/virtio-gpu.py:VirtioGPUx86.test_virtio_vga_virgl
+# - tests/avocado/virtio-gpu.py:VirtioGPUx86.test_vhost_user_vga_virgl
+#
+# * Test is marked (unconditionally) to be skipped:
+# - tests/avocado/virtio_check_params.py:VirtioMaxSegSettingsCheck.test_machine_types
+#
+make get-vm-images
+./tests/venv/bin/avocado run \
+ --job-results-dir=tests/results/ \
+ tests/avocado/boot_linux.py:BootLinuxX8664.test_pc_i440fx_kvm \
+ tests/avocado/boot_linux.py:BootLinuxX8664.test_pc_q35_kvm \
+ tests/avocado/boot_linux_console.py:BootLinuxConsole.test_x86_64_pc \
+ tests/avocado/cpu_queries.py:QueryCPUModelExpansion.test \
+ tests/avocado/empty_cpu_model.py:EmptyCPUModel.test \
+ tests/avocado/hotplug_cpu.py:HotPlugCPU.test \
+ tests/avocado/info_usernet.py:InfoUsernet.test_hostfwd \
+ tests/avocado/intel_iommu.py:IntelIOMMU.test_intel_iommu \
+ tests/avocado/intel_iommu.py:IntelIOMMU.test_intel_iommu_pt \
+ tests/avocado/intel_iommu.py:IntelIOMMU.test_intel_iommu_strict \
+ tests/avocado/intel_iommu.py:IntelIOMMU.test_intel_iommu_strict_cm \
+ tests/avocado/linux_initrd.py:LinuxInitrd.test_with_2gib_file_should_exit_error_msg_with_linux_v3_6 \
+ tests/avocado/linux_initrd.py:LinuxInitrd.test_with_2gib_file_should_work_with_linux_v4_16 \
+ tests/avocado/migration.py:Migration.test_migration_with_exec \
+ tests/avocado/migration.py:Migration.test_migration_with_tcp_localhost \
+ tests/avocado/migration.py:Migration.test_migration_with_unix \
+ tests/avocado/pc_cpu_hotplug_props.py:OmittedCPUProps.test_no_die_id \
+ tests/avocado/replay_kernel.py:ReplayKernelNormal.test_x86_64_pc \
+ tests/avocado/reverse_debugging.py:ReverseDebugging_X86_64.test_x86_64_pc \
+ tests/avocado/version.py:Version.test_qmp_human_info_version \
+ tests/avocado/virtio_version.py:VirtioVersionCheck.test_conventional_devs \
+ tests/avocado/virtio_version.py:VirtioVersionCheck.test_modern_only_devs \
+ tests/avocado/vnc.py:Vnc.test_change_password \
+ tests/avocado/vnc.py:Vnc.test_change_password_requires_a_password \
+ tests/avocado/vnc.py:Vnc.test_no_vnc \
+ tests/avocado/vnc.py:Vnc.test_no_vnc_change_password \
+ tests/avocado/x86_cpu_model_versions.py:CascadelakeArchCapabilities.test_4_0 \
+ tests/avocado/x86_cpu_model_versions.py:CascadelakeArchCapabilities.test_4_1 \
+ tests/avocado/x86_cpu_model_versions.py:CascadelakeArchCapabilities.test_set_4_0 \
+ tests/avocado/x86_cpu_model_versions.py:CascadelakeArchCapabilities.test_unset_4_1 \
+ tests/avocado/x86_cpu_model_versions.py:CascadelakeArchCapabilities.test_v1_4_0 \
+ tests/avocado/x86_cpu_model_versions.py:CascadelakeArchCapabilities.test_v1_set_4_0 \
+ tests/avocado/x86_cpu_model_versions.py:CascadelakeArchCapabilities.test_v2_4_0 \
+ tests/avocado/x86_cpu_model_versions.py:CascadelakeArchCapabilities.test_v2_unset_4_1 \
+ tests/avocado/x86_cpu_model_versions.py:X86CPUModelAliases.test_4_0_alias_compatibility \
+ tests/avocado/x86_cpu_model_versions.py:X86CPUModelAliases.test_4_1_alias \
+ tests/avocado/x86_cpu_model_versions.py:X86CPUModelAliases.test_none_alias
diff --git a/scripts/ci/org.centos/stream/README b/scripts/ci/org.centos/stream/README
new file mode 100644
index 000000000..e3eadfe3e
--- /dev/null
+++ b/scripts/ci/org.centos/stream/README
@@ -0,0 +1,17 @@
+This directory contains scripts for generating a build of QEMU that
+closely matches the CentOS Stream[1] builds of the qemu-kvm package.
+
+To have the environment ready to configure, build QEMU and run tests,
+please start with a CentOS Stream machine and:
+
+ * apply the generic "build-environment.yml" playbook located at
+ scripts/ci/setup
+
+ * apply the "build-environment.yml" in the directory following the
+ CentOS Stream version (such as "8").
+
+This currently only covers CentOS Stream 8 environments and
+packages[2].
+
+[1] https://www.centos.org/centos-stream/
+[2] https://git.centos.org/rpms/qemu-kvm/commits/c8s-stream-rhel
diff --git a/scripts/ci/setup/.gitignore b/scripts/ci/setup/.gitignore
new file mode 100644
index 000000000..f4a6183f1
--- /dev/null
+++ b/scripts/ci/setup/.gitignore
@@ -0,0 +1,2 @@
+inventory
+vars.yml
diff --git a/scripts/ci/setup/build-environment.yml b/scripts/ci/setup/build-environment.yml
new file mode 100644
index 000000000..599896cc5
--- /dev/null
+++ b/scripts/ci/setup/build-environment.yml
@@ -0,0 +1,154 @@
+# Copyright (c) 2021 Red Hat, Inc.
+#
+# Author:
+# Cleber Rosa <crosa@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+#
+# This is an ansible playbook file. Run it to set up systems with the
+# environment needed to build QEMU.
+---
+- name: Installation of basic packages to build QEMU
+ hosts: all
+ tasks:
+ - name: Check for suitable ansible version
+ delegate_to: localhost
+ assert:
+ that:
+ - '((ansible_version.major == 2) and (ansible_version.minor >= 8)) or (ansible_version.major >= 3)'
+ msg: "Unsuitable ansible version, please use version 2.8.0 or later"
+
+ - name: Update apt cache / upgrade packages via apt
+ apt:
+ update_cache: yes
+ upgrade: yes
+ when:
+ - ansible_facts['distribution'] == 'Ubuntu'
+
+ - name: Install basic packages to build QEMU on Ubuntu 18.04/20.04
+ package:
+ name:
+ # Originally from tests/docker/dockerfiles/ubuntu1804.docker
+ - ccache
+ - gcc
+ - gettext
+ - git
+ - glusterfs-common
+ - libaio-dev
+ - libattr1-dev
+ - libbrlapi-dev
+ - libbz2-dev
+ - libcacard-dev
+ - libcap-ng-dev
+ - libcurl4-gnutls-dev
+ - libdrm-dev
+ - libepoxy-dev
+ - libfdt-dev
+ - libgbm-dev
+ - libgtk-3-dev
+ - libibverbs-dev
+ - libiscsi-dev
+ - libjemalloc-dev
+ - libjpeg-turbo8-dev
+ - liblzo2-dev
+ - libncurses5-dev
+ - libncursesw5-dev
+ - libnfs-dev
+ - libnss3-dev
+ - libnuma-dev
+ - libpixman-1-dev
+ - librados-dev
+ - librbd-dev
+ - librdmacm-dev
+ - libsasl2-dev
+ - libsdl2-dev
+ - libseccomp-dev
+ - libsnappy-dev
+ - libspice-protocol-dev
+ - libssh-dev
+ - libusb-1.0-0-dev
+ - libusbredirhost-dev
+ - libvdeplug-dev
+ - libvte-2.91-dev
+ - libzstd-dev
+ - make
+ - python3-yaml
+ - python3-sphinx
+ - python3-sphinx-rtd-theme
+ - ninja-build
+ - sparse
+ - xfslibs-dev
+ state: present
+ when:
+ - ansible_facts['distribution'] == 'Ubuntu'
+
+ - name: Install packages to build QEMU on Ubuntu 18.04/20.04 on non-s390x
+ package:
+ name:
+ - libspice-server-dev
+ - libxen-dev
+ state: present
+ when:
+ - ansible_facts['distribution'] == 'Ubuntu'
+ - ansible_facts['architecture'] != 's390x'
+
+ - name: Install basic packages to build QEMU on Ubuntu 18.04
+ package:
+ name:
+ # Originally from tests/docker/dockerfiles/ubuntu1804.docker
+ - clang
+ when:
+ - ansible_facts['distribution'] == 'Ubuntu'
+ - ansible_facts['distribution_version'] == '18.04'
+
+ - name: Install basic packages to build QEMU on Ubuntu 20.04
+ package:
+ name:
+ # Originally from tests/docker/dockerfiles/ubuntu2004.docker
+ - clang-10
+ - genisoimage
+ - liblttng-ust-dev
+ - libslirp-dev
+ - netcat-openbsd
+ when:
+ - ansible_facts['distribution'] == 'Ubuntu'
+ - ansible_facts['distribution_version'] == '20.04'
+
+ - name: Install basic packages to build QEMU on EL8
+ dnf:
+ # This list of packages start with tests/docker/dockerfiles/centos8.docker
+ # but only include files that are common to all distro variants and present
+ # in the standard repos (no add-ons)
+ name:
+ - bzip2
+ - bzip2-devel
+ - dbus-daemon
+ - diffutils
+ - gcc
+ - gcc-c++
+ - genisoimage
+ - gettext
+ - git
+ - glib2-devel
+ - libaio-devel
+ - libepoxy-devel
+ - libgcrypt-devel
+ - lzo-devel
+ - make
+ - mesa-libEGL-devel
+ - nettle-devel
+ - nmap-ncat
+ - perl-Test-Harness
+ - pixman-devel
+ - python36
+ - rdma-core-devel
+ - spice-glib-devel
+ - spice-server
+ - systemtap-sdt-devel
+ - tar
+ - zlib-devel
+ state: present
+ when:
+ - ansible_facts['distribution_file_variety'] == 'RedHat'
+ - ansible_facts['distribution_version'] == '8'
diff --git a/scripts/ci/setup/gitlab-runner.yml b/scripts/ci/setup/gitlab-runner.yml
new file mode 100644
index 000000000..1127db516
--- /dev/null
+++ b/scripts/ci/setup/gitlab-runner.yml
@@ -0,0 +1,71 @@
+# Copyright (c) 2021 Red Hat, Inc.
+#
+# Author:
+# Cleber Rosa <crosa@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+#
+# This is an ansible playbook file. Run it to set up systems with the
+# gitlab-runner agent.
+---
+- name: Installation of gitlab-runner
+ hosts: all
+ vars_files:
+ - vars.yml
+ tasks:
+ - debug:
+ msg: 'Checking for a valid GitLab registration token'
+ failed_when: "gitlab_runner_registration_token == 'PLEASE_PROVIDE_A_VALID_TOKEN'"
+
+ - name: Create a group for the gitlab-runner service
+ group:
+ name: gitlab-runner
+
+ - name: Create a user for the gitlab-runner service
+ user:
+ user: gitlab-runner
+ group: gitlab-runner
+ comment: GitLab Runner
+ home: /home/gitlab-runner
+ shell: /bin/bash
+
+ - name: Remove the .bash_logout file when on Ubuntu systems
+ file:
+ path: /home/gitlab-runner/.bash_logout
+ state: absent
+ when: "ansible_facts['distribution'] == 'Ubuntu'"
+
+ - name: Set the Operating System for gitlab-runner
+ set_fact:
+ gitlab_runner_os: "{{ ansible_facts[\"system\"]|lower }}"
+ - debug:
+ msg: gitlab-runner OS is {{ gitlab_runner_os }}
+
+ - name: Set the architecture for gitlab-runner
+ set_fact:
+ gitlab_runner_arch: "{{ ansible_to_gitlab_arch[ansible_facts[\"architecture\"]] }}"
+ - debug:
+ msg: gitlab-runner arch is {{ gitlab_runner_arch }}
+
+ - name: Download the matching gitlab-runner
+ get_url:
+ dest: /usr/local/bin/gitlab-runner
+ url: "https://s3.amazonaws.com/gitlab-runner-downloads/v{{ gitlab_runner_version }}/binaries/gitlab-runner-{{ gitlab_runner_os }}-{{ gitlab_runner_arch }}"
+ owner: gitlab-runner
+ group: gitlab-runner
+ mode: u=rwx,g=rwx,o=rx
+
+ - name: Register the gitlab-runner
+ command: "/usr/local/bin/gitlab-runner register --non-interactive --url {{ gitlab_runner_server_url }} --registration-token {{ gitlab_runner_registration_token }} --executor shell --tag-list {{ ansible_facts[\"architecture\"] }},{{ ansible_facts[\"distribution\"]|lower }}_{{ ansible_facts[\"distribution_version\"] }} --description '{{ ansible_facts[\"distribution\"] }} {{ ansible_facts[\"distribution_version\"] }} {{ ansible_facts[\"architecture\"] }} ({{ ansible_facts[\"os_family\"] }})'"
+
+ - name: Install the gitlab-runner service using its own functionality
+ command: /usr/local/bin/gitlab-runner install --user gitlab-runner --working-directory /home/gitlab-runner
+ register: gitlab_runner_install_service_result
+ failed_when: "gitlab_runner_install_service_result.rc != 0 and \"already exists\" not in gitlab_runner_install_service_result.stderr"
+
+ - name: Enable the gitlab-runner service
+ service:
+ name: gitlab-runner
+ state: started
+ enabled: yes
diff --git a/scripts/ci/setup/inventory.template b/scripts/ci/setup/inventory.template
new file mode 100644
index 000000000..2fbb50c4a
--- /dev/null
+++ b/scripts/ci/setup/inventory.template
@@ -0,0 +1 @@
+localhost
diff --git a/scripts/ci/setup/vars.yml.template b/scripts/ci/setup/vars.yml.template
new file mode 100644
index 000000000..e48089761
--- /dev/null
+++ b/scripts/ci/setup/vars.yml.template
@@ -0,0 +1,12 @@
+# The version of the gitlab-runner to use
+gitlab_runner_version: 13.12.0
+# The URL of the gitlab server to use, usually https://gitlab.com unless you're
+# using a private GitLab instance
+gitlab_runner_server_url: https://gitlab.com
+# A mapping of the ansible to gitlab architecture nomenclature
+ansible_to_gitlab_arch:
+ x86_64: amd64
+ aarch64: arm64
+ s390x: s390x
+# A unique token made available by GitLab to your project for registering runners
+gitlab_runner_registration_token: PLEASE_PROVIDE_A_VALID_TOKEN