summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels De Graef <nielsdegraef@gmail.com>2021-09-30 16:04:39 +0200
committerNiels De Graef <nielsdegraef@gmail.com>2021-09-30 16:04:39 +0200
commita6fc41cf799d71bdf0d42bff98f964f60b2e566e (patch)
tree13337e0af280a8165d8751733484bc0b84a3798c
parenta1f28ba0c90128e0c6b53674452a1624724b786c (diff)
downloadfolks-a6fc41cf799d71bdf0d42bff98f964f60b2e566e.tar.gz
ci: Expose meson's Junit test results to gitlab
Meson has been generating Junit XML files of its test results since 0.55, so no need for us to maintain a custom script anymore.
-rw-r--r--.gitlab-ci.yml7
-rwxr-xr-x.gitlab/ci/meson-junit-report.py109
-rwxr-xr-x.gitlab/ci/run-tests.sh15
3 files changed, 3 insertions, 128 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1e8a4452..e4f56b1e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -32,20 +32,19 @@ build-folks:
dbus-daemon # FIXME: dbus-broker breaks the CI, see https://github.com/bus1/dbus-broker/issues/145
script:
- meson _build -Ddocs=true
- - ninja -C _build
+ - meson compile -C _build
# Multiply the Meson test timeout by 3 (mostly for the stress tests)
# For most tests it doesn't matter anyway, since we internally use
# TestUtils.loop_run_with_timeout()
- - bash +x ./.gitlab/ci/run-tests.sh -t 3
+ - meson test -C _build -t 3
artifacts:
reports:
- junit: "_build/${CI_JOB_NAME}-report.xml"
+ junit: "_build/meson-logs/testlog.junit.xml"
name: "folks-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
when: always
paths:
- "_build/config.h"
- "_build/meson-logs"
- - "_build/${CI_JOB_NAME}-report.xml"
- "_build/docs"
pages:
diff --git a/.gitlab/ci/meson-junit-report.py b/.gitlab/ci/meson-junit-report.py
deleted file mode 100755
index 248ef6e2..00000000
--- a/.gitlab/ci/meson-junit-report.py
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/env python3
-
-# Turns a Meson testlog.json file into a JUnit XML report
-#
-# Copyright 2019 GNOME Foundation
-#
-# SPDX-License-Identifier: LGPL-2.1-or-later
-#
-# Original author: Emmanuele Bassi
-
-import argparse
-import datetime
-import json
-import os
-import sys
-import xml.etree.ElementTree as ET
-
-aparser = argparse.ArgumentParser(description='Turns a Meson test log into a JUnit report')
-aparser.add_argument('--project-name', metavar='NAME',
- help='The project name',
- default='unknown')
-aparser.add_argument('--job-id', metavar='ID',
- help='The job ID for the report',
- default='Unknown')
-aparser.add_argument('--branch', metavar='NAME',
- help='Branch of the project being tested',
- default='master')
-aparser.add_argument('--output', metavar='FILE',
- help='The output file, stdout by default',
- type=argparse.FileType('w', encoding='UTF-8'),
- default=sys.stdout)
-aparser.add_argument('infile', metavar='FILE',
- help='The input testlog.json, stdin by default',
- type=argparse.FileType('r', encoding='UTF-8'),
- default=sys.stdin)
-
-args = aparser.parse_args()
-
-outfile = args.output
-
-testsuites = ET.Element('testsuites')
-testsuites.set('id', '{}/{}'.format(args.job_id, args.branch))
-testsuites.set('package', args.project_name)
-testsuites.set('timestamp', datetime.datetime.utcnow().isoformat(timespec='minutes'))
-
-suites = {}
-for line in args.infile:
- data = json.loads(line)
- (full_suite, unit_name) = data['name'].split(' / ')
- (project_name, suite_name) = full_suite.split(':')
-
- duration = data['duration']
- return_code = data['returncode']
- log = data['stdout']
-
- unit = {
- 'suite': suite_name,
- 'name': unit_name,
- 'duration': duration,
- 'returncode': return_code,
- 'stdout': log,
- }
-
- units = suites.setdefault(suite_name, [])
- units.append(unit)
-
-for name, units in suites.items():
- print('Processing suite {} (units: {})'.format(name, len(units)))
-
- def if_failed(unit):
- if unit['returncode'] != 0:
- return True
- return False
-
- def if_succeded(unit):
- if unit['returncode'] == 0:
- return True
- return False
-
- successes = list(filter(if_succeded, units))
- failures = list(filter(if_failed, units))
- print(' - {}: {} pass, {} fail'.format(name, len(successes), len(failures)))
-
- testsuite = ET.SubElement(testsuites, 'testsuite')
- testsuite.set('name', '{}/{}'.format(args.project_name, name))
- testsuite.set('tests', str(len(units)))
- testsuite.set('errors', str(len(failures)))
- testsuite.set('failures', str(len(failures)))
-
- for unit in successes:
- testcase = ET.SubElement(testsuite, 'testcase')
- testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
- testcase.set('name', unit['name'])
- testcase.set('time', str(unit['duration']))
-
- for unit in failures:
- testcase = ET.SubElement(testsuite, 'testcase')
- testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
- testcase.set('name', unit['name'])
- testcase.set('time', str(unit['duration']))
-
- failure = ET.SubElement(testcase, 'failure')
- failure.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
- failure.set('name', unit['name'])
- failure.set('type', 'error')
- failure.text = unit['stdout']
-
-output = ET.tostring(testsuites, encoding='unicode')
-outfile.write(output)
diff --git a/.gitlab/ci/run-tests.sh b/.gitlab/ci/run-tests.sh
deleted file mode 100755
index c66e344e..00000000
--- a/.gitlab/ci/run-tests.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-set +e
-
-meson test -C _build $*
-
-exit_code=$?
-
-python3 .gitlab/ci/meson-junit-report.py \
- --project-name=folks \
- --job-id "${CI_JOB_NAME}" \
- --output "_build/${CI_JOB_NAME}-report.xml" \
- _build/meson-logs/testlog.json
-
-exit $exit_code