summaryrefslogtreecommitdiff
path: root/ci/integration-template.yml
blob: 2e7802dbe045f481ac9877c039a795d9fedc5993 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
.qemu-build-template: &qemu-build-template
  - git clone --depth 1 https://gitlab.com/qemu-project/qemu.git
  - cd qemu
  #
  # inspired by upstream QEMU's buildtest-template.yml
  - export JOBS="$(expr $(nproc) + 1)"
  - mkdir build
  - cd build
  - ../configure --prefix=/usr
                 --enable-werror
                 --disable-tcg
                 --disable-docs
                 --target-list=x86_64-softmmu || (cat config.log meson-logs/meson-log.txt && exit 1)
  - make -j"$JOBS"
  - if test -n "$MAKE_CHECK_ARGS";
    then
      make -j"$JOBS" check-build;
    fi

  # we need the following since the fix for CVE-2022-24765 now causes a fatal
  # error if a user issues a git command from within a directory owned by some
  # other user
  - sudo git config --global --add safe.directory "$SCRATCH_DIR/qemu"
  - sudo make install


.install-deps: &install-deps
  - sudo dnf install -y libvirt-rpms/* libvirt-perl-rpms/* libvirt-python-rpms/*
  - sudo pip3 install --prefix=/usr avocado-framework


.enable-core-dumps: &enable-core-dumps
  - sudo sh -c "echo DefaultLimitCORE=infinity >> /etc/systemd/system.conf" # Explicitly allow storing cores globally
  - sudo systemctl daemon-reexec # need to reexec systemd after changing config


.enable-libvirt-debugging: &enable-libvirt-debugging
  - source /etc/os-release  # in order to query the vendor-provided variables
  - if test "$ID" = "centos" && test "$VERSION_ID" -lt 9 ||
       test "$ID" = "fedora" && test "$VERSION_ID" -lt 35;
    then
      DAEMONS="libvirtd virtlockd virtlogd";
    else
      DAEMONS="virtinterfaced virtlockd virtlogd virtnetworkd virtnodedevd virtnwfilterd virtproxyd virtqemud virtsecretd virtstoraged";
    fi
  - for daemon in $DAEMONS;
    do
      LOG_OUTPUTS="1:file:/var/log/libvirt/${daemon}.log";
      LOG_FILTERS="3:remote 4:event 3:util.json 3:util.object 3:util.dbus 3:util.netlink 3:node_device 3:rpc 3:access 1:*";
      sudo augtool set /files/etc/libvirt/${daemon}.conf/log_filters "'$LOG_FILTERS'" &>/dev/null;
      sudo augtool set /files/etc/libvirt/${daemon}.conf/log_outputs "'$LOG_OUTPUTS'" &>/dev/null;
      sudo systemctl --quiet stop ${daemon}.service;
      sudo systemctl restart ${daemon}.socket;
    done


.collect-logs: &collect-logs
  - mkdir logs
  - test -d "$SCRATCH_DIR"/avocado && sudo mv "$SCRATCH_DIR"/avocado/latest/test-results logs/avocado;
  - sudo coredumpctl info --no-pager > logs/coredumpctl.txt
  - sudo mv /var/log/libvirt logs/libvirt
  - sudo chown -R $(whoami):$(whoami) logs
    # rename all Avocado stderr/stdout logs to *.log so that GitLab's web UI doesn't mangle the MIME type
  - find logs/avocado/ -type f ! -name "*.log" -exec
      sh -c 'DIR=$(dirname {}); NAME=$(basename {}); mv $DIR/$NAME{,.log}' \;


.integration_tests:
  stage: integration_tests
  before_script:
    - mkdir "$SCRATCH_DIR"
    - *install-deps
    - *enable-core-dumps
    - *enable-libvirt-debugging
    - sudo virsh net-start default &>/dev/null || true;
  script:
    - cd "$SCRATCH_DIR"
    - git clone --depth 1 https://gitlab.com/libvirt/libvirt-tck.git
    - cd libvirt-tck
    - sudo avocado --config avocado.config run --job-results-dir "$SCRATCH_DIR"/avocado
  after_script:
    - test "$CI_JOB_STATUS" = "success" && exit 0;
    - *collect-logs
  variables:
    SCRATCH_DIR: "/tmp/scratch"
  artifacts:
    name: logs
    paths:
      - logs
    when: on_failure

.integration_tests_prebuilt_env:
  extends: .integration_tests
  rules:
    - if: '$LIBVIRT_CI_INTEGRATION == null'
      when: never
    - !reference [.gitlab_native_build_job_prebuilt_env, rules]

.integration_tests_local_env:
  extends: .integration_tests
  rules:
    - if: '$LIBVIRT_CI_INTEGRATION == null'
      when: never
    - !reference [.gitlab_native_build_job_local_env, rules]


# YAML anchors don't work with Shell conditions so we can't use a variable
# to conditionally build+install QEMU from source.
# Instead, create a new test job template for this scenario.
.integration_tests_upstream_qemu:
  before_script:
    - !reference [.integration_tests, before_script]
    - cd "$SCRATCH_DIR"
    - *qemu-build-template
    - sudo restorecon -R /usr

.integration_tests_upstream_qemu_prebuilt_env:
  extends:
    - .integration_tests_prebuilt_env
    - .integration_tests_upstream_qemu

.integration_tests_upstream_qemu_local_env:
  extends:
    - .integration_tests_local_env
    - .integration_tests_upstream_qemu