Browse Source

.gitlab-ci.d: Make separate collapsible log sections for build and test

GitLab lets a CI job create its own collapsible log sections by
emitting special escape codes, as documented here:

https://docs.gitlab.com/ee/ci/yaml/script.html#expand-and-collapse-job-log-sections

Use these to make "configure", "build" and "test" separate
collapsible stages.

As recommended by the GitLab docs, we use some shell which is
sourced in the CI job to define functions to emit the magic
lines that start and end sections, to hide the ugliness of
the printf lines from the log.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-ID: <20240918125449.3125571-3-peter.maydell@linaro.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Peter Maydell 11 tháng trước cách đây
mục cha
commit
dc05b2628e

+ 14 - 0
.gitlab-ci.d/buildtest-template.yml

@@ -8,8 +8,11 @@
     key: "$CI_JOB_NAME"
     key: "$CI_JOB_NAME"
     when: always
     when: always
   before_script:
   before_script:
+    - source scripts/ci/gitlab-ci-section
+    - section_start setup "Pre-script setup"
     - JOBS=$(expr $(nproc) + 1)
     - JOBS=$(expr $(nproc) + 1)
     - cat /packages.txt
     - cat /packages.txt
+    - section_end setup
   script:
   script:
     - export CCACHE_BASEDIR="$(pwd)"
     - export CCACHE_BASEDIR="$(pwd)"
     - export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
     - export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
@@ -19,6 +22,7 @@
     - mkdir build
     - mkdir build
     - cd build
     - cd build
     - ccache --zero-stats
     - ccache --zero-stats
+    - section_start configure "Running configure"
     - ../configure --enable-werror --disable-docs --enable-fdt=system
     - ../configure --enable-werror --disable-docs --enable-fdt=system
           ${TARGETS:+--target-list="$TARGETS"}
           ${TARGETS:+--target-list="$TARGETS"}
           $CONFIGURE_ARGS ||
           $CONFIGURE_ARGS ||
@@ -27,11 +31,16 @@
       then
       then
         pyvenv/bin/meson configure . -Dbackend_max_links="$LD_JOBS" ;
         pyvenv/bin/meson configure . -Dbackend_max_links="$LD_JOBS" ;
       fi || exit 1;
       fi || exit 1;
+    - section_end configure
+    - section_start build "Building QEMU"
     - $MAKE -j"$JOBS"
     - $MAKE -j"$JOBS"
+    - section_end build
+    - section_start test "Running tests"
     - if test -n "$MAKE_CHECK_ARGS";
     - if test -n "$MAKE_CHECK_ARGS";
       then
       then
         $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
         $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
       fi
       fi
+    - section_end test
     - ccache --show-stats
     - ccache --show-stats
 
 
 # We jump some hoops in common_test_job_template to avoid
 # We jump some hoops in common_test_job_template to avoid
@@ -54,6 +63,8 @@
   stage: test
   stage: test
   image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
   image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
   script:
   script:
+    - source scripts/ci/gitlab-ci-section
+    - section_start buildenv "Setting up to run tests"
     - scripts/git-submodule.sh update roms/SLOF
     - scripts/git-submodule.sh update roms/SLOF
     - meson subprojects download $(cd build/subprojects && echo *)
     - meson subprojects download $(cd build/subprojects && echo *)
     - cd build
     - cd build
@@ -63,7 +74,10 @@
     - if [ "x${QEMU_TEST_CACHE_DIR}" != "x" ]; then
     - if [ "x${QEMU_TEST_CACHE_DIR}" != "x" ]; then
         $MAKE precache-functional ;
         $MAKE precache-functional ;
       fi
       fi
+    - section_end buildenv
+    - section_start test "Running tests"
     - $MAKE NINJA=":" $MAKE_CHECK_ARGS
     - $MAKE NINJA=":" $MAKE_CHECK_ARGS
+    - section_end test
 
 
 .native_test_job_template:
 .native_test_job_template:
   extends: .common_test_job_template
   extends: .common_test_job_template

+ 1 - 0
.gitlab-ci.d/buildtest.yml

@@ -188,6 +188,7 @@ build-previous-qemu:
     # Override the default flags as we need more to grab the old version
     # Override the default flags as we need more to grab the old version
     GIT_FETCH_EXTRA_FLAGS: --prune --quiet
     GIT_FETCH_EXTRA_FLAGS: --prune --quiet
   before_script:
   before_script:
+    - source scripts/ci/gitlab-ci-section
     - export QEMU_PREV_VERSION="$(sed 's/\([0-9.]*\)\.[0-9]*/v\1.0/' VERSION)"
     - export QEMU_PREV_VERSION="$(sed 's/\([0-9.]*\)\.[0-9]*/v\1.0/' VERSION)"
     - git remote add upstream https://gitlab.com/qemu-project/qemu
     - git remote add upstream https://gitlab.com/qemu-project/qemu
     - git fetch upstream refs/tags/$QEMU_PREV_VERSION:refs/tags/$QEMU_PREV_VERSION
     - git fetch upstream refs/tags/$QEMU_PREV_VERSION:refs/tags/$QEMU_PREV_VERSION

+ 25 - 0
.gitlab-ci.d/crossbuild-template.yml

@@ -9,8 +9,11 @@
     when: always
     when: always
   timeout: 80m
   timeout: 80m
   before_script:
   before_script:
+    - source scripts/ci/gitlab-ci-section
+    - section_start setup "Pre-script setup"
     - JOBS=$(expr $(nproc) + 1)
     - JOBS=$(expr $(nproc) + 1)
     - cat /packages.txt
     - cat /packages.txt
+    - section_end setup
   script:
   script:
     - export CCACHE_BASEDIR="$(pwd)"
     - export CCACHE_BASEDIR="$(pwd)"
     - export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
     - export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
@@ -19,22 +22,30 @@
     - mkdir build
     - mkdir build
     - cd build
     - cd build
     - ccache --zero-stats
     - ccache --zero-stats
+    - section_start configure "Running configure"
     - ../configure --enable-werror --disable-docs --enable-fdt=system
     - ../configure --enable-werror --disable-docs --enable-fdt=system
         --disable-user $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS
         --disable-user $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS
         --target-list-exclude="arm-softmmu
         --target-list-exclude="arm-softmmu
           i386-softmmu microblaze-softmmu mips-softmmu mipsel-softmmu
           i386-softmmu microblaze-softmmu mips-softmmu mipsel-softmmu
           mips64-softmmu ppc-softmmu riscv32-softmmu sh4-softmmu
           mips64-softmmu ppc-softmmu riscv32-softmmu sh4-softmmu
           sparc-softmmu xtensa-softmmu $CROSS_SKIP_TARGETS"
           sparc-softmmu xtensa-softmmu $CROSS_SKIP_TARGETS"
+    - section_end configure
+    - section_start build "Building QEMU"
     - make -j"$JOBS" all check-build
     - make -j"$JOBS" all check-build
+    - section_end build
+    - section_start test "Running tests"
     - if test -n "$MAKE_CHECK_ARGS";
     - if test -n "$MAKE_CHECK_ARGS";
       then
       then
         $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
         $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
       fi
       fi
+    - section_end test
+    - section_start installer "Building the installer"
     - if grep -q "EXESUF=.exe" config-host.mak;
     - if grep -q "EXESUF=.exe" config-host.mak;
       then make installer;
       then make installer;
       version="$(git describe --match v[0-9]* 2>/dev/null || git rev-parse --short HEAD)";
       version="$(git describe --match v[0-9]* 2>/dev/null || git rev-parse --short HEAD)";
       mv -v qemu-setup*.exe qemu-setup-${version}.exe;
       mv -v qemu-setup*.exe qemu-setup-${version}.exe;
       fi
       fi
+    - section_end installer
     - ccache --show-stats
     - ccache --show-stats
 
 
 # Job to cross-build specific accelerators.
 # Job to cross-build specific accelerators.
@@ -52,6 +63,7 @@
       - ccache/
       - ccache/
     key: "$CI_JOB_NAME"
     key: "$CI_JOB_NAME"
   before_script:
   before_script:
+    - source scripts/ci/gitlab-ci-section
     - JOBS=$(expr $(nproc) + 1)
     - JOBS=$(expr $(nproc) + 1)
   script:
   script:
     - export CCACHE_BASEDIR="$(pwd)"
     - export CCACHE_BASEDIR="$(pwd)"
@@ -60,13 +72,19 @@
     - export PATH="$CCACHE_WRAPPERSDIR:$PATH"
     - export PATH="$CCACHE_WRAPPERSDIR:$PATH"
     - mkdir build
     - mkdir build
     - cd build
     - cd build
+    - section_start configure "Running configure"
     - ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
     - ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
         --disable-tools --enable-${ACCEL:-kvm} $EXTRA_CONFIGURE_OPTS
         --disable-tools --enable-${ACCEL:-kvm} $EXTRA_CONFIGURE_OPTS
+    - section_end configure
+    - section_start build "Building QEMU"
     - make -j"$JOBS" all check-build
     - make -j"$JOBS" all check-build
+    - section_end build
+    - section_start test "Running tests"
     - if test -n "$MAKE_CHECK_ARGS";
     - if test -n "$MAKE_CHECK_ARGS";
       then
       then
         $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
         $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
       fi
       fi
+    - section_end test
 
 
 .cross_user_build_job:
 .cross_user_build_job:
   extends: .base_job_template
   extends: .base_job_template
@@ -77,6 +95,7 @@
       - ccache/
       - ccache/
     key: "$CI_JOB_NAME"
     key: "$CI_JOB_NAME"
   before_script:
   before_script:
+    - source scripts/ci/gitlab-ci-section
     - JOBS=$(expr $(nproc) + 1)
     - JOBS=$(expr $(nproc) + 1)
   script:
   script:
     - export CCACHE_BASEDIR="$(pwd)"
     - export CCACHE_BASEDIR="$(pwd)"
@@ -84,16 +103,22 @@
     - export CCACHE_MAXSIZE="500M"
     - export CCACHE_MAXSIZE="500M"
     - mkdir build
     - mkdir build
     - cd build
     - cd build
+    - section_start configure "Running configure"
     - ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
     - ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
         --disable-system --target-list-exclude="aarch64_be-linux-user
         --disable-system --target-list-exclude="aarch64_be-linux-user
           alpha-linux-user m68k-linux-user microblazeel-linux-user
           alpha-linux-user m68k-linux-user microblazeel-linux-user
           or1k-linux-user ppc-linux-user sparc-linux-user
           or1k-linux-user ppc-linux-user sparc-linux-user
           xtensa-linux-user $CROSS_SKIP_TARGETS"
           xtensa-linux-user $CROSS_SKIP_TARGETS"
+    - section_end configure
+    - section_start build "Building QEMU"
     - make -j"$JOBS" all check-build
     - make -j"$JOBS" all check-build
+    - section_end build
+    - section_start test "Running tests"
     - if test -n "$MAKE_CHECK_ARGS";
     - if test -n "$MAKE_CHECK_ARGS";
       then
       then
         $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
         $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
       fi
       fi
+    - section_end test
 
 
 # We can still run some tests on some of our cross build jobs. They can add this
 # We can still run some tests on some of our cross build jobs. They can add this
 # template to their extends to save the build logs and test results
 # template to their extends to save the build logs and test results

+ 29 - 0
scripts/ci/gitlab-ci-section

@@ -0,0 +1,29 @@
+# Copyright (c) 2024 Linaro Ltd
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+# gitlab-ci-section: This is a shell script fragment which defines
+# functions section_start and section_end which will emit marker lines
+# that GitLab will interpret as the beginning or end of a "collapsible
+# section" in a CI job log. See
+# https://docs.gitlab.com/ee/ci/yaml/script.html#expand-and-collapse-job-log-sections
+#
+# This is intended to be sourced in the before_script section of
+# a CI config; the section_start and section_end functions will
+# then be available for use in the before_script and script sections.
+
+# Section names are [-_.A-Za-z0-9] and the section_start pairs with
+# a section_end with the same section name.
+# The description can be any printable text without newlines; this is
+# what will appear in the log.
+
+# Usage:
+# section_start section_name "Description of the section"
+section_start () {
+    printf "section_start:%s:%s\r\e[0K%s\n" "$(date +%s)" "$1" "$2"
+}
+
+# Usage:
+# section_end section_name
+section_end () {
+    printf "section_end:%s:%s\r\e[0K\n" "$(date +%s)" "$1"
+}