gitlab CI: hook up qemu
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 18 Feb 2020 10:22:12 +0000 (20:22 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 18 Feb 2020 22:49:02 +0000 (08:49 +1000)
This is mostly copied from libinput's qemu setup with a few minor renames.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
.gitlab-ci.yml
.gitlab-ci/gitlab-ci.tmpl
.gitlab-ci/meson-build.sh [new file with mode: 0755]

index 98575706af46c0a2edc9645d824f7b3ab91efbef..81d072b7806bdb649cbaa59fa3ea344ebdb79a6f 100644 (file)
@@ -2,7 +2,7 @@
 #
 # THIS FILE IS GENERATED, DO NOT EDIT
 
-.templates_sha: &template_sha 01f2a6a8ab5cd31000c1c14a1acfff68ea98b59e # see https://docs.gitlab.com/ee/ci/yaml/#includefile
+.templates_sha: &template_sha b7030c2cd0d6ccc5f6d4f8299bafa4daa9240d71 # see https://docs.gitlab.com/ee/ci/yaml/#includefile
 
 include:
   # Alpine container builder template
@@ -63,6 +63,7 @@ variables:
   UBUNTU_TAG: '2020-02-17.1'
   ARCH_TAG:   '2020-02-17.1'
   ALPINE_TAG: '2020-02-17.1'
+  QEMU_TAG:   'qemu-2020-02-18.0'
 
   UPSTREAM_REPO: libevdev/libevdev
   BUILDAH_IMAGE: $CI_REGISTRY/wayland/ci-templates/buildah:latest
@@ -72,6 +73,7 @@ variables:
   DEBIAN_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/debian/$DEBIAN_VERSION:$DEBIAN_TAG
   ARCH_CONTAINER_IMAGE:   $CI_REGISTRY_IMAGE/archlinux/rolling:$ARCH_TAG
   ALPINE_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/alpine/latest:$ALPINE_TAG
+  QEMU_CONTAINER_IMAGE:   $CI_REGISTRY_IMAGE/fedora/$FEDORA_VERSION:$QEMU_TAG
 
   LIBEVDEV_SKIP_ROOT_TESTS: 1
   GIT_DEPTH: 1
@@ -172,6 +174,22 @@ check-commit:
         skopeo inspect docker://$CI_REGISTRY_IMAGE/$IMAGE > /dev/null && exit 0 || true ;
       fi
 
+fedora:31@qemu-prep:
+  extends:
+    - .fedora@qemu-build
+    - .pull_upstream_or_rebuild
+  stage: prep
+  tags:
+    - kvm
+  variables:
+    GIT_STRATEGY: none
+    FEDORA_VERSION: 31
+    FEDORA_TAG: $QEMU_TAG
+    DISTRIB_FLAVOR: fedora
+    DISTRIB_VERSION: $FEDORA_VERSION
+    TAG: $QEMU_TAG
+  allow_failure: true
+
 
 ### fedora 30
 fedora:30@container-prep:
@@ -755,11 +773,6 @@ enable-gcov:meson:
   variables:
     MESON_ARGS: '-Dcoverity=true'
 
-valgrind:meson:
-  extends: .fedora-custom-build@meson-template
-  variables:
-    MESON_TEST_ARGS: '--setup=valgrind'
-
 soname:
   stage: build
   image: $FEDORA_CONTAINER_IMAGE
@@ -774,6 +787,77 @@ soname:
     FEDORA_VERSION: 31
   needs: ['fedora:31@container-prep']
 
+#################################################################
+#                                                               #
+#                          VM stage                             #
+#                                                               #
+#################################################################
+
+.check_tainted: &check_tainted |
+  # make sure the kernel is not tainted
+  if [[ "$(ssh localhost -p 5555 cat /proc/sys/kernel/tainted)" -gt 0 ]];
+  then
+    echo tainted kernel ;
+    exit 1 ;
+  fi
+
+.qemu@fedora:31:
+  stage: VM
+  image: $QEMU_CONTAINER_IMAGE
+  tags:
+    - kvm
+  variables:
+    FEDORA_VERSION: 31
+    MESON_BUILDDIR: build_dir
+  script:
+    # start our vm, no args required
+    - /app/start_vm.sh
+
+    - *check_tainted
+
+    - "scp -P 5555 -r $PWD localhost:"
+    - echo "CI_JOB_ID=\"$CI_JOB_ID\"" > sshenv
+    - echo "CI_JOB_NAME=\"$CI_JOB_NAME\"" >> sshenv
+    - echo "MESON_BUILDDIR=\"$MESON_BUILDDIR\"" >> sshenv
+    - echo "MESON_TEST_ARGS=\"$MESON_TEST_ARGS\"" >> sshenv
+    - echo "NINJA_ARGS=\"$NINJA_ARGS\"" >> sshenv
+    - "scp -P 5555 sshenv localhost:~/$CI_PROJECT_NAME/.meson_environment"
+    - ssh localhost -p 5555 "cd $CI_PROJECT_NAME ; .gitlab-ci/meson-build.sh" && touch .success || true
+    # no matter the results of the tests, we want to fetch the logs
+    - scp -P 5555 -r localhost:$CI_PROJECT_NAME/"$MESON_BUILDDIR" .
+
+    - *check_tainted
+
+    - ssh localhost -p 5555 halt || true
+    - sleep 2
+    - pkill qemu || true
+
+    - if [[ ! -e .success ]] ;
+      then
+        exit 1 ;
+      fi
+  artifacts:
+    name: "qemu-meson-logs-$CI_JOB_NAME"
+    when: always
+    expire_in: 1 week
+    paths:
+      - $MESON_BUILDDIR/meson-logs
+      - console.out
+
+  allow_failure: true
+  retry:
+    max: 2
+    when: script_failure
+  needs: ['fedora:31@qemu-prep']
+
+qemu:meson:
+  extends: .qemu@fedora:31
+
+qemu:meson:valgrind:
+  extends: .qemu@fedora:31
+  variables:
+    MESON_TEST_ARGS: '--setup=valgrind'
+
 meson-from-tarball:
   stage: tarballs
   image: $FEDORA_CONTAINER_IMAGE
index 903126f8995f59562bb067d2271b835298c70647..c54eb06fdcb2a9e93faaffce7198b820d8c99bfb 100644 (file)
@@ -2,7 +2,7 @@
 #
 # THIS FILE IS GENERATED, DO NOT EDIT
 
-.templates_sha: &template_sha 01f2a6a8ab5cd31000c1c14a1acfff68ea98b59e # see https://docs.gitlab.com/ee/ci/yaml/#includefile
+.templates_sha: &template_sha b7030c2cd0d6ccc5f6d4f8299bafa4daa9240d71 # see https://docs.gitlab.com/ee/ci/yaml/#includefile
 
 include:
   # Alpine container builder template
@@ -63,6 +63,7 @@ variables:
   UBUNTU_TAG: '2020-02-17.1'
   ARCH_TAG:   '2020-02-17.1'
   ALPINE_TAG: '2020-02-17.1'
+  QEMU_TAG:   'qemu-2020-02-18.0'
 
   UPSTREAM_REPO: libevdev/libevdev
   BUILDAH_IMAGE: $CI_REGISTRY/wayland/ci-templates/buildah:latest
@@ -72,6 +73,7 @@ variables:
   DEBIAN_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/debian/$DEBIAN_VERSION:$DEBIAN_TAG
   ARCH_CONTAINER_IMAGE:   $CI_REGISTRY_IMAGE/archlinux/rolling:$ARCH_TAG
   ALPINE_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/alpine/latest:$ALPINE_TAG
+  QEMU_CONTAINER_IMAGE:   $CI_REGISTRY_IMAGE/fedora/$FEDORA_VERSION:$QEMU_TAG
 
   LIBEVDEV_SKIP_ROOT_TESTS: 1
   GIT_DEPTH: 1
@@ -172,6 +174,22 @@ check-commit:
         skopeo inspect docker://$CI_REGISTRY_IMAGE/$IMAGE > /dev/null && exit 0 || true ;
       fi
 
+fedora:31@qemu-prep:
+  extends:
+    - .fedora@qemu-build
+    - .pull_upstream_or_rebuild
+  stage: prep
+  tags:
+    - kvm
+  variables:
+    GIT_STRATEGY: none
+    FEDORA_VERSION: 31
+    FEDORA_TAG: $QEMU_TAG
+    DISTRIB_FLAVOR: fedora
+    DISTRIB_VERSION: $FEDORA_VERSION
+    TAG: $QEMU_TAG
+  allow_failure: true
+
 {% for distro in distributions %}
 
 ### {{ distro.name }} {{ distro.version }}
@@ -427,11 +445,6 @@ enable-gcov:meson:
   variables:
     MESON_ARGS: '-Dcoverity=true'
 
-valgrind:meson:
-  extends: .fedora-custom-build@meson-template
-  variables:
-    MESON_TEST_ARGS: '--setup=valgrind'
-
 soname:
   stage: build
   image: $FEDORA_CONTAINER_IMAGE
@@ -446,6 +459,77 @@ soname:
     FEDORA_VERSION: 31
   needs: ['fedora:31@container-prep']
 
+#################################################################
+#                                                               #
+#                          VM stage                             #
+#                                                               #
+#################################################################
+
+.check_tainted: &check_tainted |
+  # make sure the kernel is not tainted
+  if [[ "$(ssh localhost -p 5555 cat /proc/sys/kernel/tainted)" -gt 0 ]];
+  then
+    echo tainted kernel ;
+    exit 1 ;
+  fi
+
+.qemu@fedora:31:
+  stage: VM
+  image: $QEMU_CONTAINER_IMAGE
+  tags:
+    - kvm
+  variables:
+    FEDORA_VERSION: 31
+    MESON_BUILDDIR: build_dir
+  script:
+    # start our vm, no args required
+    - /app/start_vm.sh
+
+    - *check_tainted
+
+    - "scp -P 5555 -r $PWD localhost:"
+    - echo "CI_JOB_ID=\"$CI_JOB_ID\"" > sshenv
+    - echo "CI_JOB_NAME=\"$CI_JOB_NAME\"" >> sshenv
+    - echo "MESON_BUILDDIR=\"$MESON_BUILDDIR\"" >> sshenv
+    - echo "MESON_TEST_ARGS=\"$MESON_TEST_ARGS\"" >> sshenv
+    - echo "NINJA_ARGS=\"$NINJA_ARGS\"" >> sshenv
+    - "scp -P 5555 sshenv localhost:~/$CI_PROJECT_NAME/.meson_environment"
+    - ssh localhost -p 5555 "cd $CI_PROJECT_NAME ; .gitlab-ci/meson-build.sh" && touch .success || true
+    # no matter the results of the tests, we want to fetch the logs
+    - scp -P 5555 -r localhost:$CI_PROJECT_NAME/"$MESON_BUILDDIR" .
+
+    - *check_tainted
+
+    - ssh localhost -p 5555 halt || true
+    - sleep 2
+    - pkill qemu || true
+
+    - if [[ ! -e .success ]] ;
+      then
+        exit 1 ;
+      fi
+  artifacts:
+    name: "qemu-meson-logs-$CI_JOB_NAME"
+    when: always
+    expire_in: 1 week
+    paths:
+      - $MESON_BUILDDIR/meson-logs
+      - console.out
+
+  allow_failure: true
+  retry:
+    max: 2
+    when: script_failure
+  needs: ['fedora:31@qemu-prep']
+
+qemu:meson:
+  extends: .qemu@fedora:31
+
+qemu:meson:valgrind:
+  extends: .qemu@fedora:31
+  variables:
+    MESON_TEST_ARGS: '--setup=valgrind'
+
 meson-from-tarball:
   stage: tarballs
   image: $FEDORA_CONTAINER_IMAGE
diff --git a/.gitlab-ci/meson-build.sh b/.gitlab-ci/meson-build.sh
new file mode 100755 (executable)
index 0000000..8fcbe3a
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+if [[ -f .meson_environment ]]; then
+       . .meson_environment
+fi
+
+if [[ -z "$MESON_BUILDDIR" ]]; then
+       echo "\$MESON_BUILDDIR undefined."
+       exit 1
+fi
+
+# emulate a few gitlab variables to make it easier to
+# run and debug locally.
+if [[ -z "$CI_JOB_ID" ]] || [[ -z "$CI_JOB_NAME" ]]; then
+       echo "Missing \$CI_JOB_ID or \$CI_JOB_NAME".
+       CI_JOB_ID=$(date +%s)
+       CI_JOB_NAME='libevdev-job-local'
+       echo "Simulating gitlab environment: "
+       echo " CI_JOB_ID=$CI_JOB_ID"
+       echo " CI_JOB_NAME=$CI_JOB_NAME"
+fi
+
+
+echo "*************************************************"
+echo "builddir: $MESON_BUILDDIR"
+echo "meson args: $MESON_ARGS"
+echo "ninja args: $NINJA_ARGS"
+echo "meson test args: $MESON_TEST_ARGS"
+echo "*************************************************"
+
+set -e
+
+rm -rf "$MESON_BUILDDIR"
+meson "$MESON_BUILDDIR" $MESON_ARGS
+meson configure "$MESON_BUILDDIR"
+ninja -C "$MESON_BUILDDIR" $NINJA_ARGS
+
+# we still want to generate the reports, even if meson test fails
+set +e
+meson test -C "$MESON_BUILDDIR" $MESON_TEST_ARGS --print-errorlogs
+exit_code=$?
+set -e
+
+exit $exit_code