mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-08 10:18:02 +02:00
Merge branch 'coverage' into 'master'
Add CI jobs for static analysis and a test coverage report See merge request cairo/cairo!574
This commit is contained in:
commit
39ba22d7e6
7 changed files with 220 additions and 1 deletions
|
|
@ -16,7 +16,7 @@ workflow:
|
|||
variables:
|
||||
FDO_UPSTREAM_REPO: 'cairo/cairo'
|
||||
FDO_DISTRIBUTION_VERSION: '40'
|
||||
FDO_DISTRIBUTION_TAG: '2024-06-06.0'
|
||||
FDO_DISTRIBUTION_TAG: '2024-07-26-coverage.0'
|
||||
|
||||
# TODO: should probably get its own image at some point instead of reusing the GStreamer one
|
||||
# See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/.gitlab-image-tags.yml for latest
|
||||
|
|
@ -26,10 +26,16 @@ variables:
|
|||
DEFAULT_MESON_ARGS: >
|
||||
--default-library=both
|
||||
|
||||
RUST_STABLE: "1.80.0"
|
||||
RUSTUP_VERSION: "1.27.1"
|
||||
|
||||
stages:
|
||||
- prep
|
||||
- analysis
|
||||
- build
|
||||
- test
|
||||
- analysis
|
||||
- deploy
|
||||
|
||||
# Global CI policy: This can be used to configure global behaviour our our jobs
|
||||
default:
|
||||
|
|
@ -97,6 +103,20 @@ fedora image:
|
|||
util-linux
|
||||
poppler-utils
|
||||
clang
|
||||
clang-analyzer
|
||||
clang-tools-extra
|
||||
compiler-rt
|
||||
libasan
|
||||
libubsan
|
||||
llvm
|
||||
wget
|
||||
FDO_DISTRIBUTION_EXEC: >-
|
||||
bash .gitlab-ci/install-rust.sh --rustup-version ${RUSTUP_VERSION} \
|
||||
--stable ${RUST_STABLE} \
|
||||
--arch x86_64-unknown-linux-gnu &&
|
||||
bash .gitlab-ci/install-rust-tools.sh &&
|
||||
bash .gitlab-ci/install-grcov.sh &&
|
||||
rm -rf /root/.cargo /root/.cache # cleanup compilation dirs; binaries are installed now
|
||||
|
||||
.build fedora:
|
||||
extends:
|
||||
|
|
@ -460,3 +480,58 @@ macOS x86 host:
|
|||
- export CAIRO_TEST_IGNORE_quartz_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-quartz-rgb24.txt)
|
||||
- export CAIRO_TEST_TARGET=quartz
|
||||
- (cd build/test && srcdir=../../test ./cairo-test-suite)
|
||||
|
||||
# Run static analysis.
|
||||
static-scan:
|
||||
stage: 'analysis'
|
||||
extends:
|
||||
- '.fdo.distribution-image@fedora'
|
||||
variables:
|
||||
MESON_ARGS: >
|
||||
--buildtype=debug
|
||||
script:
|
||||
- meson setup ${MESON_ARGS} _scan_build .
|
||||
- ninja -C _scan_build scan-build
|
||||
artifacts:
|
||||
name: "cairo-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
|
||||
when: always
|
||||
paths:
|
||||
- "_scan_build/meson-logs/scanbuild"
|
||||
|
||||
coverage:
|
||||
stage: 'analysis'
|
||||
extends:
|
||||
- '.fdo.distribution-image@fedora'
|
||||
needs:
|
||||
- job: 'fedora image'
|
||||
artifacts: false
|
||||
script:
|
||||
- source ./.gitlab-ci/env.sh
|
||||
- bash -x ./.gitlab-ci/build-with-coverage.sh
|
||||
- bash -x ./.gitlab-ci/gen-coverage.sh
|
||||
coverage: '/Coverage: \d+\.\d+/'
|
||||
artifacts:
|
||||
name: "cairo-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
|
||||
expire_in: 2 days
|
||||
when: always
|
||||
reports:
|
||||
coverage_report:
|
||||
coverage_format: cobertura
|
||||
path: public/coverage.xml
|
||||
paths:
|
||||
- "_build/meson-logs"
|
||||
- public
|
||||
|
||||
pages:
|
||||
stage: 'deploy'
|
||||
needs: [ coverage ]
|
||||
script:
|
||||
# No-op, just to gitlab thinks there's something to do.
|
||||
# The jobs that this job depends on have already populated public/
|
||||
- echo
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
rules:
|
||||
# Restrict to the main branch so not every branch tries to deploy the web site
|
||||
- if: ($CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH)
|
||||
|
|
|
|||
17
.gitlab-ci/build-with-coverage.sh
Normal file
17
.gitlab-ci/build-with-coverage.sh
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -eux -o pipefail
|
||||
|
||||
export CFLAGS="-coverage -ftest-coverage -fprofile-arcs"
|
||||
|
||||
export CAIRO_TEST_IGNORE_image_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-image-argb32.txt)
|
||||
export CAIRO_TEST_IGNORE_image_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-image-rgb24.txt)
|
||||
export CAIRO_TEST_IGNORE_image16_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-image16-rgb24.txt)
|
||||
export CAIRO_TEST_TARGET=image,image16
|
||||
|
||||
meson setup --buildtype=debug _build .
|
||||
meson compile -C _build
|
||||
|
||||
export srcdir=../../test
|
||||
cd _build/test
|
||||
xvfb-run ./cairo-test-suite
|
||||
2
.gitlab-ci/env.sh
Normal file
2
.gitlab-ci/env.sh
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
export RUSTUP_HOME='/usr/local/rustup'
|
||||
export PATH=$PATH:/usr/local/cargo/bin
|
||||
14
.gitlab-ci/gen-coverage.sh
Normal file
14
.gitlab-ci/gen-coverage.sh
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -eux -o pipefail
|
||||
|
||||
mkdir -p public
|
||||
grcov _build --source-dir ./ --prefix-dir ../ --output-type cobertura --branch --ignore-not-existing -o public/coverage.xml
|
||||
grcov _build --source-dir ./ --prefix-dir ../ --output-type html --branch --ignore-not-existing -o public/coverage
|
||||
|
||||
# Print "Coverage: 42.42" so .gitlab-ci.yml will pick it up with a regex
|
||||
#
|
||||
# We scrape this from the HTML report, not the JSON summary, because coverage.json
|
||||
# uses no decimal places, just something like "42%".
|
||||
|
||||
grep -Eo 'abbr title.* %' public/coverage/index.html | head -n 1 | grep -Eo '[0-9.]+ %' | grep -Eo '[0-9.]+' | awk '{ print "Coverage:", $1 }'
|
||||
8
.gitlab-ci/install-grcov.sh
Normal file
8
.gitlab-ci/install-grcov.sh
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
source ./.gitlab-ci/env.sh
|
||||
|
||||
set -eu
|
||||
export CARGO_HOME='/usr/local/cargo'
|
||||
|
||||
# Coverage tools
|
||||
cargo install grcov
|
||||
rustup component add llvm-tools-preview
|
||||
11
.gitlab-ci/install-rust-tools.sh
Normal file
11
.gitlab-ci/install-rust-tools.sh
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
source ./.gitlab-ci/env.sh
|
||||
|
||||
set -eu
|
||||
export CARGO_HOME='/usr/local/cargo'
|
||||
|
||||
rustup component add clippy
|
||||
rustup component add rustfmt
|
||||
# cargo install --force cargo-c
|
||||
cargo install --version ^1.0 gitlab_clippy
|
||||
cargo install --force cargo-deny
|
||||
# cargo install --force cargo-outdated
|
||||
92
.gitlab-ci/install-rust.sh
Normal file
92
.gitlab-ci/install-rust.sh
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o errexit -o pipefail -o noclobber -o nounset
|
||||
|
||||
source ./.gitlab-ci/env.sh
|
||||
|
||||
export CARGO_HOME='/usr/local/cargo'
|
||||
|
||||
PARSED=$(getopt --options '' --longoptions 'rustup-version:,stable:,minimum:,nightly,arch:' --name "$0" -- "$@")
|
||||
if [ $? -ne 0 ]; then
|
||||
echo 'Terminating...' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
eval set -- "$PARSED"
|
||||
unset PARSED
|
||||
|
||||
RUSTUP_VERSION=
|
||||
STABLE=
|
||||
MINIMUM=
|
||||
NIGHTLY=
|
||||
ARCH=
|
||||
|
||||
while true; do
|
||||
case "$1" in
|
||||
'--rustup-version')
|
||||
RUSTUP_VERSION=$2
|
||||
shift 2
|
||||
;;
|
||||
|
||||
'--stable')
|
||||
STABLE=$2
|
||||
shift 2
|
||||
;;
|
||||
|
||||
'--minimum')
|
||||
MINIMUM=$2
|
||||
shift 2
|
||||
;;
|
||||
|
||||
'--nightly')
|
||||
NIGHTLY=1
|
||||
shift 1
|
||||
;;
|
||||
|
||||
'--arch')
|
||||
ARCH=$2
|
||||
shift 2
|
||||
;;
|
||||
|
||||
'--')
|
||||
shift
|
||||
break
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Programming error"
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$RUSTUP_VERSION" ]; then
|
||||
echo "missing --rustup-version argument"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$STABLE" ]; then
|
||||
echo "missing --stable argument, please pass the stable version of rustc you want"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$ARCH" ]; then
|
||||
echo "missing --arch argument, please pass an architecture triple like x86_64-unknown-linux-gnu"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
RUSTUP_URL=https://static.rust-lang.org/rustup/archive/$RUSTUP_VERSION/$ARCH/rustup-init
|
||||
wget $RUSTUP_URL
|
||||
|
||||
chmod +x rustup-init
|
||||
./rustup-init -y --no-modify-path --profile minimal --default-toolchain $STABLE
|
||||
rm rustup-init
|
||||
chmod -R a+w $RUSTUP_HOME $CARGO_HOME
|
||||
|
||||
if [ -n "$MINIMUM" ]; then
|
||||
rustup toolchain install $MINIMUM
|
||||
fi
|
||||
|
||||
if [ -n "$NIGHTLY" ]; then
|
||||
rustup toolchain install nightly
|
||||
fi
|
||||
Loading…
Add table
Reference in a new issue