aboutsummaryrefslogtreecommitdiff
path: root/scripts/ci
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ci')
-rwxr-xr-xscripts/ci/gitlab-failure-analysis117
-rw-r--r--scripts/ci/setup/gitlab-runner.yml12
-rw-r--r--scripts/ci/setup/ubuntu/build-environment.yml12
-rw-r--r--scripts/ci/setup/ubuntu/ubuntu-2404-aarch64.yaml (renamed from scripts/ci/setup/ubuntu/ubuntu-2204-aarch64.yaml)9
-rw-r--r--scripts/ci/setup/ubuntu/ubuntu-2404-s390x.yaml (renamed from scripts/ci/setup/ubuntu/ubuntu-2204-s390x.yaml)9
-rw-r--r--scripts/ci/setup/vars.yml.template5
6 files changed, 142 insertions, 22 deletions
diff --git a/scripts/ci/gitlab-failure-analysis b/scripts/ci/gitlab-failure-analysis
new file mode 100755
index 0000000..906725b
--- /dev/null
+++ b/scripts/ci/gitlab-failure-analysis
@@ -0,0 +1,117 @@
+#!/usr/bin/env python3
+#
+# A script to analyse failures in the gitlab pipelines. It requires an
+# API key from gitlab with the following permissions:
+# - api
+# - read_repository
+# - read_user
+#
+
+import argparse
+import gitlab
+import os
+
+#
+# Arguments
+#
+class NoneForEmptyStringAction(argparse.Action):
+ def __call__(self, parser, namespace, value, option_string=None):
+ if value == '':
+ setattr(namespace, self.dest, None)
+ else:
+ setattr(namespace, self.dest, value)
+
+
+parser = argparse.ArgumentParser(description="Analyse failed GitLab CI runs.")
+
+parser.add_argument("--gitlab",
+ default="https://gitlab.com",
+ help="GitLab instance URL (default: https://gitlab.com).")
+parser.add_argument("--id", default=11167699,
+ type=int,
+ help="GitLab project id (default: 11167699 for qemu-project/qemu)")
+parser.add_argument("--token",
+ default=os.getenv("GITLAB_TOKEN"),
+ help="Your personal access token with 'api' scope.")
+parser.add_argument("--branch",
+ type=str,
+ default="staging",
+ action=NoneForEmptyStringAction,
+ help="The name of the branch (default: 'staging')")
+parser.add_argument("--status",
+ type=str,
+ action=NoneForEmptyStringAction,
+ default="failed",
+ help="Filter by branch status (default: 'failed')")
+parser.add_argument("--count", type=int,
+ default=3,
+ help="The number of failed runs to fetch.")
+parser.add_argument("--skip-jobs",
+ default=False,
+ action='store_true',
+ help="Skip dumping the job info")
+parser.add_argument("--pipeline", type=int,
+ nargs="+",
+ default=None,
+ help="Explicit pipeline ID(s) to fetch.")
+
+
+if __name__ == "__main__":
+ args = parser.parse_args()
+
+ gl = gitlab.Gitlab(url=args.gitlab, private_token=args.token)
+ project = gl.projects.get(args.id)
+
+
+ pipelines_to_process = []
+
+ # Use explicit pipeline IDs if provided, otherwise fetch a list
+ if args.pipeline:
+ args.count = len(args.pipeline)
+ for p_id in args.pipeline:
+ pipelines_to_process.append(project.pipelines.get(p_id))
+ else:
+ # Use an iterator to fetch the pipelines
+ pipe_iter = project.pipelines.list(iterator=True,
+ status=args.status,
+ ref=args.branch)
+ # Check each failed pipeline
+ pipelines_to_process = [next(pipe_iter) for _ in range(args.count)]
+
+ # Check each pipeline
+ for p in pipelines_to_process:
+
+ jobs = p.jobs.list(get_all=True)
+ failed_jobs = [j for j in jobs if j.status == "failed"]
+ skipped_jobs = [j for j in jobs if j.status == "skipped"]
+ manual_jobs = [j for j in jobs if j.status == "manual"]
+
+ trs = p.test_report_summary.get()
+ total = trs.total["count"]
+ skipped = trs.total["skipped"]
+ failed = trs.total["failed"]
+
+ print(f"{p.status} pipeline {p.id}, total jobs {len(jobs)}, "
+ f"skipped {len(skipped_jobs)}, "
+ f"failed {len(failed_jobs)}, ",
+ f"{total} tests, "
+ f"{skipped} skipped tests, "
+ f"{failed} failed tests")
+
+ if not args.skip_jobs:
+ for j in failed_jobs:
+ print(f" Failed job {j.id}, {j.name}, {j.web_url}")
+
+ # It seems we can only extract failing tests from the full
+ # test report, maybe there is some way to filter it.
+
+ if failed > 0:
+ ftr = p.test_report.get()
+ failed_suites = [s for s in ftr.test_suites if
+ s["failed_count"] > 0]
+ for fs in failed_suites:
+ name = fs["name"]
+ tests = fs["test_cases"]
+ failed_tests = [t for t in tests if t["status"] == 'failed']
+ for t in failed_tests:
+ print(f" Failed test {t["classname"]}, {name}, {t["name"]}")
diff --git a/scripts/ci/setup/gitlab-runner.yml b/scripts/ci/setup/gitlab-runner.yml
index 57e7fae..7025935 100644
--- a/scripts/ci/setup/gitlab-runner.yml
+++ b/scripts/ci/setup/gitlab-runner.yml
@@ -16,7 +16,7 @@
tasks:
- debug:
msg: 'Checking for a valid GitLab registration token'
- failed_when: "gitlab_runner_registration_token == 'PLEASE_PROVIDE_A_VALID_TOKEN'"
+ failed_when: "gitlab_runner_authentication_token == 'PLEASE_PROVIDE_A_VALID_TOKEN'"
- name: Create a group for the gitlab-runner service
group:
@@ -95,15 +95,7 @@
# Register Runners
- name: Register the gitlab-runner
- command: "/usr/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\"] }})'"
-
- # The secondary runner will still run under the single gitlab-runner service
- - name: Register secondary gitlab-runner
- command: "/usr/bin/gitlab-runner register --non-interactive --url {{ gitlab_runner_server_url }} --registration-token {{ gitlab_runner_registration_token }} --executor shell --tag-list aarch32,{{ ansible_facts[\"distribution\"]|lower }}_{{ ansible_facts[\"distribution_version\"] }} --description '{{ ansible_facts[\"distribution\"] }} {{ ansible_facts[\"distribution_version\"] }} {{ ansible_facts[\"architecture\"] }} ({{ ansible_facts[\"os_family\"] }})'"
- when:
- - ansible_facts['distribution'] == 'Ubuntu'
- - ansible_facts['architecture'] == 'aarch64'
- - ansible_facts['distribution_version'] == '22.04'
+ command: "/usr/bin/gitlab-runner register --non-interactive --url {{ gitlab_runner_server_url }} --token {{ gitlab_runner_authentication_token }} --executor shell"
- name: Install the gitlab-runner service using its own functionality
command: "/usr/bin/gitlab-runner install --user gitlab-runner --working-directory /home/gitlab-runner"
diff --git a/scripts/ci/setup/ubuntu/build-environment.yml b/scripts/ci/setup/ubuntu/build-environment.yml
index 56b5160..6042750 100644
--- a/scripts/ci/setup/ubuntu/build-environment.yml
+++ b/scripts/ci/setup/ubuntu/build-environment.yml
@@ -35,19 +35,19 @@
# the package lists are updated by "make lcitool-refresh"
- name: Include package lists based on OS and architecture
include_vars:
- file: "ubuntu-2204-{{ ansible_facts['architecture'] }}.yaml"
+ file: "ubuntu-2404-{{ ansible_facts['architecture'] }}.yaml"
when:
- ansible_facts['distribution'] == 'Ubuntu'
- - ansible_facts['distribution_version'] == '22.04'
+ - ansible_facts['distribution_version'] == '24.04'
- - name: Install packages for QEMU on Ubuntu 22.04
+ - name: Install packages for QEMU on Ubuntu 24.04
package:
name: "{{ packages }}"
when:
- ansible_facts['distribution'] == 'Ubuntu'
- - ansible_facts['distribution_version'] == '22.04'
+ - ansible_facts['distribution_version'] == '24.04'
- - name: Install armhf cross-compile packages to build QEMU on AArch64 Ubuntu 22.04
+ - name: Install armhf cross-compile packages to build QEMU on AArch64 Ubuntu 24.04
package:
name:
- binutils-arm-linux-gnueabihf
@@ -62,6 +62,6 @@
- zlib1g-dev:armhf
when:
- ansible_facts['distribution'] == 'Ubuntu'
- - ansible_facts['distribution_version'] == '22.04'
+ - ansible_facts['distribution_version'] == '24.04'
- ansible_facts['architecture'] == 'aarch64'
diff --git a/scripts/ci/setup/ubuntu/ubuntu-2204-aarch64.yaml b/scripts/ci/setup/ubuntu/ubuntu-2404-aarch64.yaml
index f11e980..ce632d9 100644
--- a/scripts/ci/setup/ubuntu/ubuntu-2204-aarch64.yaml
+++ b/scripts/ci/setup/ubuntu/ubuntu-2404-aarch64.yaml
@@ -1,12 +1,13 @@
# THIS FILE WAS AUTO-GENERATED
#
-# $ lcitool variables --host-arch aarch64 ubuntu-2204 qemu
+# $ lcitool variables --host-arch aarch64 ubuntu-2404 qemu
#
# https://gitlab.com/libvirt/libvirt-ci
packages:
- bash
- bc
+ - bindgen
- bison
- bsdextrautils
- bzip2
@@ -36,6 +37,7 @@ packages:
- libcap-ng-dev
- libcapstone-dev
- libcbor-dev
+ - libclang-dev
- libcmocka-dev
- libcurl4-gnutls-dev
- libdaxctl-dev
@@ -80,6 +82,7 @@ packages:
- libspice-protocol-dev
- libspice-server-dev
- libssh-dev
+ - libstd-rust-dev
- libsystemd-dev
- libtasn1-6-dev
- libubsan1
@@ -90,12 +93,12 @@ packages:
- libvdeplug-dev
- libvirglrenderer-dev
- libvte-2.91-dev
+ - libxdp-dev
- libxen-dev
- libzstd-dev
- llvm
- locales
- make
- - meson
- mtools
- multipath-tools
- ncat
@@ -108,10 +111,12 @@ packages:
- python3-opencv
- python3-pillow
- python3-pip
+ - python3-setuptools
- python3-sphinx
- python3-sphinx-rtd-theme
- python3-tomli
- python3-venv
+ - python3-wheel
- python3-yaml
- rpm2cpio
- rustc-1.77
diff --git a/scripts/ci/setup/ubuntu/ubuntu-2204-s390x.yaml b/scripts/ci/setup/ubuntu/ubuntu-2404-s390x.yaml
index 6559cb2..f45f75c 100644
--- a/scripts/ci/setup/ubuntu/ubuntu-2204-s390x.yaml
+++ b/scripts/ci/setup/ubuntu/ubuntu-2404-s390x.yaml
@@ -1,12 +1,13 @@
# THIS FILE WAS AUTO-GENERATED
#
-# $ lcitool variables --host-arch s390x ubuntu-2204 qemu
+# $ lcitool variables --host-arch s390x ubuntu-2404 qemu
#
# https://gitlab.com/libvirt/libvirt-ci
packages:
- bash
- bc
+ - bindgen
- bison
- bsdextrautils
- bzip2
@@ -36,6 +37,7 @@ packages:
- libcap-ng-dev
- libcapstone-dev
- libcbor-dev
+ - libclang-dev
- libcmocka-dev
- libcurl4-gnutls-dev
- libdaxctl-dev
@@ -79,6 +81,7 @@ packages:
- libsndio-dev
- libspice-protocol-dev
- libssh-dev
+ - libstd-rust-dev
- libsystemd-dev
- libtasn1-6-dev
- libubsan1
@@ -89,11 +92,11 @@ packages:
- libvdeplug-dev
- libvirglrenderer-dev
- libvte-2.91-dev
+ - libxdp-dev
- libzstd-dev
- llvm
- locales
- make
- - meson
- mtools
- multipath-tools
- ncat
@@ -106,10 +109,12 @@ packages:
- python3-opencv
- python3-pillow
- python3-pip
+ - python3-setuptools
- python3-sphinx
- python3-sphinx-rtd-theme
- python3-tomli
- python3-venv
+ - python3-wheel
- python3-yaml
- rpm2cpio
- rustc-1.77
diff --git a/scripts/ci/setup/vars.yml.template b/scripts/ci/setup/vars.yml.template
index 4b355fb..e9ddc05 100644
--- a/scripts/ci/setup/vars.yml.template
+++ b/scripts/ci/setup/vars.yml.template
@@ -6,5 +6,6 @@ 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
+# A unique token made obtained from GitLab for each runner
+# see: https://gitlab.com/PROJECT/REPO/-/runners/new
+gitlab_runner_authentication_token: PLEASE_PROVIDE_A_VALID_TOKEN