[PATCH v2] automation: test.yaml: Introduce templates to reduce the overhead

Michal Orzel posted 1 patch 1 year, 6 months ago
Failed in applying to current master (apply log)
automation/gitlab-ci/test.yaml | 270 ++++++++++-----------------------
1 file changed, 83 insertions(+), 187 deletions(-)
[PATCH v2] automation: test.yaml: Introduce templates to reduce the overhead
Posted by Michal Orzel 1 year, 6 months ago
At the moment, we define lots of test jobs in test.yaml, that make use
of the same configuration sections like variables, tags, artifacts.
Introduce templates (hidden jobs whose names start with a dot) to
reduce the overhead and simplify the file (more than 100 lines saved).
This way, the actual jobs can only specify sections that are unique
to them.

Most of the test jobs specify the same set of prerequisite jobs under
needs property with just one additional being unique to the job itself.
Introduce YAML anchors for that purpose, because when using extends, the
needs property is not being merged (the parent property overwrites the
child one).

Signed-off-by: Michal Orzel <michal.orzel@amd.com>
---
Changes in v2:
 - carve out anchors from extend jobs and use better naming

This patch is based on the CI next branch where we already have several
patches (already acked) to be merged into staging after the release:
https://gitlab.com/xen-project/people/sstabellini/xen/-/tree/next
---
 automation/gitlab-ci/test.yaml | 270 ++++++++++-----------------------
 1 file changed, 83 insertions(+), 187 deletions(-)

diff --git a/automation/gitlab-ci/test.yaml b/automation/gitlab-ci/test.yaml
index 92e0a1f7c510..c7e0078e04f1 100644
--- a/automation/gitlab-ci/test.yaml
+++ b/automation/gitlab-ci/test.yaml
@@ -7,35 +7,32 @@
     - /^coverity-tested\/.*/
     - /^stable-.*/
 
-# Test jobs
-build-each-commit-gcc:
+.arm64-test-needs: &arm64-test-needs
+  - alpine-3.12-arm64-rootfs-export
+  - kernel-5.19-arm64-export
+  - qemu-system-aarch64-6.0.0-arm64-export
+
+.arm32-test-needs: &arm32-test-needs
+  - qemu-system-aarch64-6.0.0-arm32-export
+
+.qemu-arm64:
   extends: .test-jobs-common
   variables:
-    CONTAINER: debian:stretch
-    XEN_TARGET_ARCH: x86_64
-    CC: gcc
-  script:
-    - BASE=${BASE_SHA:-${CI_COMMIT_BEFORE_SHA}} TIP=${TIP_SHA:-${CI_COMMIT_SHA}} ./automation/gitlab-ci/build-each-commit.sh 2>&1 | tee ../build-each-commit-gcc.log
-    - mv ../build-each-commit-gcc.log .
+    CONTAINER: debian:unstable-arm64v8
+    LOGFILE: qemu-smoke-arm64.log
   artifacts:
     paths:
+      - smoke.serial
       - '*.log'
     when: always
-  needs: []
   tags:
-    - x86_64
+    - arm64
 
-qemu-smoke-dom0-arm64-gcc:
+.qemu-arm32:
   extends: .test-jobs-common
   variables:
     CONTAINER: debian:unstable-arm64v8
-  script:
-    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee qemu-smoke-arm64.log
-  needs:
-    - alpine-3.12-gcc-arm64
-    - alpine-3.12-arm64-rootfs-export
-    - kernel-5.19-arm64-export
-    - qemu-system-aarch64-6.0.0-arm64-export
+    LOGFILE: qemu-smoke-arm32.log
   artifacts:
     paths:
       - smoke.serial
@@ -44,251 +41,150 @@ qemu-smoke-dom0-arm64-gcc:
   tags:
     - arm64
 
-qemu-smoke-dom0-arm64-gcc-debug:
+.qemu-x86-64:
   extends: .test-jobs-common
   variables:
-    CONTAINER: debian:unstable-arm64v8
-  script:
-    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee qemu-smoke-arm64.log
-  needs:
-    - alpine-3.12-gcc-debug-arm64
-    - alpine-3.12-arm64-rootfs-export
-    - kernel-5.19-arm64-export
-    - qemu-system-aarch64-6.0.0-arm64-export
+    CONTAINER: debian:stretch
+    LOGFILE: qemu-smoke-x86-64.log
   artifacts:
     paths:
       - smoke.serial
       - '*.log'
     when: always
   tags:
-    - arm64
+    - x86_64
 
-qemu-alpine-x86_64-gcc:
+# Test jobs
+build-each-commit-gcc:
   extends: .test-jobs-common
   variables:
     CONTAINER: debian:stretch
+    XEN_TARGET_ARCH: x86_64
+    CC: gcc
   script:
-    - ./automation/scripts/qemu-alpine-x86_64.sh 2>&1 | tee qemu-smoke-x86_64.log
-  needs:
-    - alpine-3.12-gcc
-    - alpine-3.12-rootfs-export
-    - kernel-5.10.74-export
+    - BASE=${BASE_SHA:-${CI_COMMIT_BEFORE_SHA}} TIP=${TIP_SHA:-${CI_COMMIT_SHA}} ./automation/gitlab-ci/build-each-commit.sh 2>&1 | tee ../build-each-commit-gcc.log
+    - mv ../build-each-commit-gcc.log .
   artifacts:
     paths:
-      - smoke.serial
       - '*.log'
     when: always
+  needs: []
   tags:
     - x86_64
 
+qemu-smoke-dom0-arm64-gcc:
+  extends: .qemu-arm64
+  script:
+    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee ${LOGFILE}
+  needs:
+    - *arm64-test-needs
+    - alpine-3.12-gcc-arm64
+
+qemu-smoke-dom0-arm64-gcc-debug:
+  extends: .qemu-arm64
+  script:
+    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee ${LOGFILE}
+  needs:
+    - *arm64-test-needs
+    - alpine-3.12-gcc-debug-arm64
+
 qemu-smoke-dom0less-arm64-gcc:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:unstable-arm64v8
+  extends: .qemu-arm64
   script:
-    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee qemu-smoke-arm64.log
+    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee ${LOGFILE}
   needs:
+    - *arm64-test-needs
     - alpine-3.12-gcc-arm64
-    - alpine-3.12-arm64-rootfs-export
-    - kernel-5.19-arm64-export
-    - qemu-system-aarch64-6.0.0-arm64-export
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
-  tags:
-    - arm64
 
 qemu-smoke-dom0less-arm64-gcc-debug:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:unstable-arm64v8
+  extends: .qemu-arm64
   script:
-    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee qemu-smoke-arm64.log
+    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee ${LOGFILE}
   needs:
+    - *arm64-test-needs
     - alpine-3.12-gcc-debug-arm64
-    - alpine-3.12-arm64-rootfs-export
-    - kernel-5.19-arm64-export
-    - qemu-system-aarch64-6.0.0-arm64-export
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
-  tags:
-    - arm64
 
 qemu-smoke-dom0less-arm64-gcc-staticmem:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:unstable-arm64v8
+  extends: .qemu-arm64
   script:
-    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee qemu-smoke-arm64.log
+    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee ${LOGFILE}
   needs:
+    - *arm64-test-needs
     - alpine-3.12-gcc-arm64-staticmem
-    - alpine-3.12-arm64-rootfs-export
-    - kernel-5.19-arm64-export
-    - qemu-system-aarch64-6.0.0-arm64-export
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
-  tags:
-    - arm64
 
 qemu-smoke-dom0less-arm64-gcc-debug-staticmem:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:unstable-arm64v8
+  extends: .qemu-arm64
   script:
-    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee qemu-smoke-arm64.log
+    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee ${LOGFILE}
   needs:
+    - *arm64-test-needs
     - alpine-3.12-gcc-debug-arm64-staticmem
-    - alpine-3.12-arm64-rootfs-export
-    - kernel-5.19-arm64-export
-    - qemu-system-aarch64-6.0.0-arm64-export
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
-  tags:
-    - arm64
 
 qemu-smoke-dom0less-arm64-gcc-boot-cpupools:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:unstable-arm64v8
+  extends: .qemu-arm64
   script:
-    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee qemu-smoke-arm64.log
+    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee ${LOGFILE}
   needs:
+    - *arm64-test-needs
     - alpine-3.12-gcc-arm64-boot-cpupools
-    - alpine-3.12-arm64-rootfs-export
-    - kernel-5.19-arm64-export
-    - qemu-system-aarch64-6.0.0-arm64-export
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
-  tags:
-    - arm64
 
 qemu-smoke-dom0less-arm64-gcc-debug-boot-cpupools:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:unstable-arm64v8
+  extends: .qemu-arm64
   script:
-    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee qemu-smoke-arm64.log
+    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee ${LOGFILE}
   needs:
+    - *arm64-test-needs
     - alpine-3.12-gcc-debug-arm64-boot-cpupools
-    - alpine-3.12-arm64-rootfs-export
-    - kernel-5.19-arm64-export
-    - qemu-system-aarch64-6.0.0-arm64-export
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
-  tags:
-    - arm64
 
 qemu-smoke-dom0-arm32-gcc:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:unstable-arm64v8
+  extends: .qemu-arm32
   script:
-    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee qemu-smoke-arm32.log
+    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee ${LOGFILE}
   needs:
+    - *arm32-test-needs
     - debian-unstable-gcc-arm32
-    - qemu-system-aarch64-6.0.0-arm32-export
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
-  tags:
-    - arm64
 
 qemu-smoke-dom0-arm32-gcc-debug:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:unstable-arm64v8
+  extends: .qemu-arm32
   script:
-    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee qemu-smoke-arm32.log
+    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee ${LOGFILE}
   needs:
+    - *arm32-test-needs
     - debian-unstable-gcc-arm32-debug
-    - qemu-system-aarch64-6.0.0-arm32-export
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
-  tags:
-    - arm64
+
+qemu-alpine-x86_64-gcc:
+  extends: .qemu-x86-64
+  script:
+    - ./automation/scripts/qemu-alpine-x86_64.sh 2>&1 | tee ${LOGFILE}
+  needs:
+    - alpine-3.12-gcc
+    - alpine-3.12-rootfs-export
+    - kernel-5.10.74-export
 
 qemu-smoke-x86-64-gcc:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:stretch
+  extends: .qemu-x86-64
   script:
-    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee qemu-smoke-x86-64.log
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
+    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee ${LOGFILE}
   needs:
     - debian-stretch-gcc-debug
-  tags:
-    - x86_64
 
 qemu-smoke-x86-64-clang:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:stretch
+  extends: .qemu-x86-64
   script:
-    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee qemu-smoke-x86-64.log
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
+    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee ${LOGFILE}
   needs:
     - debian-unstable-clang-debug
-  tags:
-    - x86_64
 
 qemu-smoke-x86-64-gcc-pvh:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:stretch
+  extends: .qemu-x86-64
   script:
-    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee qemu-smoke-x86-64.log
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
+    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee ${LOGFILE}
   needs:
     - debian-stretch-gcc-debug
-  tags:
-    - x86_64
 
 qemu-smoke-x86-64-clang-pvh:
-  extends: .test-jobs-common
-  variables:
-    CONTAINER: debian:stretch
+  extends: .qemu-x86-64
   script:
-    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee qemu-smoke-x86-64.log
-  artifacts:
-    paths:
-      - smoke.serial
-      - '*.log'
-    when: always
+    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee ${LOGFILE}
   needs:
     - debian-unstable-clang-debug
-  tags:
-    - x86_64
-- 
2.25.1
Re: [PATCH v2] automation: test.yaml: Introduce templates to reduce the overhead
Posted by Stefano Stabellini 1 year, 6 months ago
On Tue, 25 Oct 2022, Michal Orzel wrote:
> At the moment, we define lots of test jobs in test.yaml, that make use
> of the same configuration sections like variables, tags, artifacts.
> Introduce templates (hidden jobs whose names start with a dot) to
> reduce the overhead and simplify the file (more than 100 lines saved).
> This way, the actual jobs can only specify sections that are unique
> to them.
> 
> Most of the test jobs specify the same set of prerequisite jobs under
> needs property with just one additional being unique to the job itself.
> Introduce YAML anchors for that purpose, because when using extends, the
> needs property is not being merged (the parent property overwrites the
> child one).
> 
> Signed-off-by: Michal Orzel <michal.orzel@amd.com>

Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>


> ---
> Changes in v2:
>  - carve out anchors from extend jobs and use better naming
> 
> This patch is based on the CI next branch where we already have several
> patches (already acked) to be merged into staging after the release:
> https://gitlab.com/xen-project/people/sstabellini/xen/-/tree/next
> ---
>  automation/gitlab-ci/test.yaml | 270 ++++++++++-----------------------
>  1 file changed, 83 insertions(+), 187 deletions(-)
> 
> diff --git a/automation/gitlab-ci/test.yaml b/automation/gitlab-ci/test.yaml
> index 92e0a1f7c510..c7e0078e04f1 100644
> --- a/automation/gitlab-ci/test.yaml
> +++ b/automation/gitlab-ci/test.yaml
> @@ -7,35 +7,32 @@
>      - /^coverity-tested\/.*/
>      - /^stable-.*/
>  
> -# Test jobs
> -build-each-commit-gcc:
> +.arm64-test-needs: &arm64-test-needs
> +  - alpine-3.12-arm64-rootfs-export
> +  - kernel-5.19-arm64-export
> +  - qemu-system-aarch64-6.0.0-arm64-export
> +
> +.arm32-test-needs: &arm32-test-needs
> +  - qemu-system-aarch64-6.0.0-arm32-export
> +
> +.qemu-arm64:
>    extends: .test-jobs-common
>    variables:
> -    CONTAINER: debian:stretch
> -    XEN_TARGET_ARCH: x86_64
> -    CC: gcc
> -  script:
> -    - BASE=${BASE_SHA:-${CI_COMMIT_BEFORE_SHA}} TIP=${TIP_SHA:-${CI_COMMIT_SHA}} ./automation/gitlab-ci/build-each-commit.sh 2>&1 | tee ../build-each-commit-gcc.log
> -    - mv ../build-each-commit-gcc.log .
> +    CONTAINER: debian:unstable-arm64v8
> +    LOGFILE: qemu-smoke-arm64.log
>    artifacts:
>      paths:
> +      - smoke.serial
>        - '*.log'
>      when: always
> -  needs: []
>    tags:
> -    - x86_64
> +    - arm64
>  
> -qemu-smoke-dom0-arm64-gcc:
> +.qemu-arm32:
>    extends: .test-jobs-common
>    variables:
>      CONTAINER: debian:unstable-arm64v8
> -  script:
> -    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee qemu-smoke-arm64.log
> -  needs:
> -    - alpine-3.12-gcc-arm64
> -    - alpine-3.12-arm64-rootfs-export
> -    - kernel-5.19-arm64-export
> -    - qemu-system-aarch64-6.0.0-arm64-export
> +    LOGFILE: qemu-smoke-arm32.log
>    artifacts:
>      paths:
>        - smoke.serial
> @@ -44,251 +41,150 @@ qemu-smoke-dom0-arm64-gcc:
>    tags:
>      - arm64
>  
> -qemu-smoke-dom0-arm64-gcc-debug:
> +.qemu-x86-64:
>    extends: .test-jobs-common
>    variables:
> -    CONTAINER: debian:unstable-arm64v8
> -  script:
> -    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee qemu-smoke-arm64.log
> -  needs:
> -    - alpine-3.12-gcc-debug-arm64
> -    - alpine-3.12-arm64-rootfs-export
> -    - kernel-5.19-arm64-export
> -    - qemu-system-aarch64-6.0.0-arm64-export
> +    CONTAINER: debian:stretch
> +    LOGFILE: qemu-smoke-x86-64.log
>    artifacts:
>      paths:
>        - smoke.serial
>        - '*.log'
>      when: always
>    tags:
> -    - arm64
> +    - x86_64
>  
> -qemu-alpine-x86_64-gcc:
> +# Test jobs
> +build-each-commit-gcc:
>    extends: .test-jobs-common
>    variables:
>      CONTAINER: debian:stretch
> +    XEN_TARGET_ARCH: x86_64
> +    CC: gcc
>    script:
> -    - ./automation/scripts/qemu-alpine-x86_64.sh 2>&1 | tee qemu-smoke-x86_64.log
> -  needs:
> -    - alpine-3.12-gcc
> -    - alpine-3.12-rootfs-export
> -    - kernel-5.10.74-export
> +    - BASE=${BASE_SHA:-${CI_COMMIT_BEFORE_SHA}} TIP=${TIP_SHA:-${CI_COMMIT_SHA}} ./automation/gitlab-ci/build-each-commit.sh 2>&1 | tee ../build-each-commit-gcc.log
> +    - mv ../build-each-commit-gcc.log .
>    artifacts:
>      paths:
> -      - smoke.serial
>        - '*.log'
>      when: always
> +  needs: []
>    tags:
>      - x86_64
>  
> +qemu-smoke-dom0-arm64-gcc:
> +  extends: .qemu-arm64
> +  script:
> +    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee ${LOGFILE}
> +  needs:
> +    - *arm64-test-needs
> +    - alpine-3.12-gcc-arm64
> +
> +qemu-smoke-dom0-arm64-gcc-debug:
> +  extends: .qemu-arm64
> +  script:
> +    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee ${LOGFILE}
> +  needs:
> +    - *arm64-test-needs
> +    - alpine-3.12-gcc-debug-arm64
> +
>  qemu-smoke-dom0less-arm64-gcc:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:unstable-arm64v8
> +  extends: .qemu-arm64
>    script:
> -    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee qemu-smoke-arm64.log
> +    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee ${LOGFILE}
>    needs:
> +    - *arm64-test-needs
>      - alpine-3.12-gcc-arm64
> -    - alpine-3.12-arm64-rootfs-export
> -    - kernel-5.19-arm64-export
> -    - qemu-system-aarch64-6.0.0-arm64-export
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> -  tags:
> -    - arm64
>  
>  qemu-smoke-dom0less-arm64-gcc-debug:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:unstable-arm64v8
> +  extends: .qemu-arm64
>    script:
> -    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee qemu-smoke-arm64.log
> +    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee ${LOGFILE}
>    needs:
> +    - *arm64-test-needs
>      - alpine-3.12-gcc-debug-arm64
> -    - alpine-3.12-arm64-rootfs-export
> -    - kernel-5.19-arm64-export
> -    - qemu-system-aarch64-6.0.0-arm64-export
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> -  tags:
> -    - arm64
>  
>  qemu-smoke-dom0less-arm64-gcc-staticmem:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:unstable-arm64v8
> +  extends: .qemu-arm64
>    script:
> -    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee qemu-smoke-arm64.log
> +    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee ${LOGFILE}
>    needs:
> +    - *arm64-test-needs
>      - alpine-3.12-gcc-arm64-staticmem
> -    - alpine-3.12-arm64-rootfs-export
> -    - kernel-5.19-arm64-export
> -    - qemu-system-aarch64-6.0.0-arm64-export
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> -  tags:
> -    - arm64
>  
>  qemu-smoke-dom0less-arm64-gcc-debug-staticmem:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:unstable-arm64v8
> +  extends: .qemu-arm64
>    script:
> -    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee qemu-smoke-arm64.log
> +    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee ${LOGFILE}
>    needs:
> +    - *arm64-test-needs
>      - alpine-3.12-gcc-debug-arm64-staticmem
> -    - alpine-3.12-arm64-rootfs-export
> -    - kernel-5.19-arm64-export
> -    - qemu-system-aarch64-6.0.0-arm64-export
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> -  tags:
> -    - arm64
>  
>  qemu-smoke-dom0less-arm64-gcc-boot-cpupools:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:unstable-arm64v8
> +  extends: .qemu-arm64
>    script:
> -    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee qemu-smoke-arm64.log
> +    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee ${LOGFILE}
>    needs:
> +    - *arm64-test-needs
>      - alpine-3.12-gcc-arm64-boot-cpupools
> -    - alpine-3.12-arm64-rootfs-export
> -    - kernel-5.19-arm64-export
> -    - qemu-system-aarch64-6.0.0-arm64-export
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> -  tags:
> -    - arm64
>  
>  qemu-smoke-dom0less-arm64-gcc-debug-boot-cpupools:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:unstable-arm64v8
> +  extends: .qemu-arm64
>    script:
> -    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee qemu-smoke-arm64.log
> +    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee ${LOGFILE}
>    needs:
> +    - *arm64-test-needs
>      - alpine-3.12-gcc-debug-arm64-boot-cpupools
> -    - alpine-3.12-arm64-rootfs-export
> -    - kernel-5.19-arm64-export
> -    - qemu-system-aarch64-6.0.0-arm64-export
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> -  tags:
> -    - arm64
>  
>  qemu-smoke-dom0-arm32-gcc:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:unstable-arm64v8
> +  extends: .qemu-arm32
>    script:
> -    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee qemu-smoke-arm32.log
> +    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee ${LOGFILE}
>    needs:
> +    - *arm32-test-needs
>      - debian-unstable-gcc-arm32
> -    - qemu-system-aarch64-6.0.0-arm32-export
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> -  tags:
> -    - arm64
>  
>  qemu-smoke-dom0-arm32-gcc-debug:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:unstable-arm64v8
> +  extends: .qemu-arm32
>    script:
> -    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee qemu-smoke-arm32.log
> +    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee ${LOGFILE}
>    needs:
> +    - *arm32-test-needs
>      - debian-unstable-gcc-arm32-debug
> -    - qemu-system-aarch64-6.0.0-arm32-export
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> -  tags:
> -    - arm64
> +
> +qemu-alpine-x86_64-gcc:
> +  extends: .qemu-x86-64
> +  script:
> +    - ./automation/scripts/qemu-alpine-x86_64.sh 2>&1 | tee ${LOGFILE}
> +  needs:
> +    - alpine-3.12-gcc
> +    - alpine-3.12-rootfs-export
> +    - kernel-5.10.74-export
>  
>  qemu-smoke-x86-64-gcc:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:stretch
> +  extends: .qemu-x86-64
>    script:
> -    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee qemu-smoke-x86-64.log
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> +    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee ${LOGFILE}
>    needs:
>      - debian-stretch-gcc-debug
> -  tags:
> -    - x86_64
>  
>  qemu-smoke-x86-64-clang:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:stretch
> +  extends: .qemu-x86-64
>    script:
> -    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee qemu-smoke-x86-64.log
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> +    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee ${LOGFILE}
>    needs:
>      - debian-unstable-clang-debug
> -  tags:
> -    - x86_64
>  
>  qemu-smoke-x86-64-gcc-pvh:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:stretch
> +  extends: .qemu-x86-64
>    script:
> -    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee qemu-smoke-x86-64.log
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> +    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee ${LOGFILE}
>    needs:
>      - debian-stretch-gcc-debug
> -  tags:
> -    - x86_64
>  
>  qemu-smoke-x86-64-clang-pvh:
> -  extends: .test-jobs-common
> -  variables:
> -    CONTAINER: debian:stretch
> +  extends: .qemu-x86-64
>    script:
> -    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee qemu-smoke-x86-64.log
> -  artifacts:
> -    paths:
> -      - smoke.serial
> -      - '*.log'
> -    when: always
> +    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee ${LOGFILE}
>    needs:
>      - debian-unstable-clang-debug
> -  tags:
> -    - x86_64
> -- 
> 2.25.1
>