gst-plugins-rs/.gitlab-ci.yml
Thibault Saunier dfc11c545b ci: Build documentation with hotdoc to verify Since markers
We use GStreamer image to build the documentation as it is the simplest
way to ensure that we are testing against the same thing as GStreamer
itself.
2022-09-15 18:33:03 -03:00

430 lines
11 KiB
YAML

.templates_sha: &templates_sha 567700e483aabed992d0a4fea84994a0472deff6
include:
- project: 'freedesktop/ci-templates'
ref: *templates_sha
file: '/templates/debian.yml'
- remote: "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/raw/main/ci/images_template.yml"
variables:
FDO_UPSTREAM_REPO: gstreamer/gst-plugins-rs
# We use GStreamer image to build the documentation as it is the simplest way
# to ensure that we are testing against the same thing as GStreamer itself.
#
# This shouldn't be updated so often, only when big updates happen in
# GStreamer itself
GSTREAMER_DOC_IMAGE: registry.freedesktop.org/gstreamer/gstreamer/amd64/fedora:2022-09-14.0-main
WINDOWS_BASE: "registry.freedesktop.org/gstreamer/gstreamer-rs/windows"
WINDOWS_RUST_MINIMUM_IMAGE: "$WINDOWS_BASE:$GST_RS_IMG_TAG-main-$GST_RS_MSRV"
WINDOWS_RUST_STABLE_IMAGE: "$WINDOWS_BASE:$GST_RS_IMG_TAG-main-$GST_RS_STABLE"
workflow:
rules:
- if: $CI_MERGE_REQUEST_IID
# don't create a pipeline if its a commit pipeline, on a branch and that branch has
# open merge requests (bc we will get a MR build instead)
- if: $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH
default:
interruptible: true
stages:
- "prep"
- "lint"
- "test"
- "extras"
.debian:11:
variables:
FDO_DISTRIBUTION_VERSION: 'bullseye-slim'
before_script:
- source ./ci/env.sh
- mkdir .cargo && echo -e "[net]\ngit-fetch-with-cli = true" > .cargo/config
# If cargo exists assume we probably will want to update
# the lockfile
- |
if command -v cargo; then
cargo generate-lockfile
cargo update
fi
.debian:11-stable:
extends: .debian:11
variables:
FDO_DISTRIBUTION_TAG: '$GST_RS_STABLE-${GST_RS_IMG_TAG}_2022-09-07.0'
FDO_BASE_IMAGE: "registry.freedesktop.org/gstreamer/gstreamer-rs/debian/bullseye-slim:$GST_RS_STABLE-$GST_RS_IMG_TAG"
.debian:11-msrv:
extends: .debian:11
variables:
FDO_DISTRIBUTION_TAG: '$GST_RS_MSRV-${GST_RS_IMG_TAG}_2022-09-07.0'
FDO_BASE_IMAGE: "registry.freedesktop.org/gstreamer/gstreamer-rs/debian/bullseye-slim:$GST_RS_MSRV-$GST_RS_IMG_TAG"
.debian:11-nightly:
extends: .debian:11
variables:
FDO_DISTRIBUTION_TAG: 'nightly-${GST_RS_IMG_TAG}_2022-09-07.0'
FDO_BASE_IMAGE: "registry.freedesktop.org/gstreamer/gstreamer-rs/debian/bullseye-slim:nightly-$GST_RS_IMG_TAG"
.build-debian-container:
extends:
- .fdo.container-build@debian
stage: prep
variables:
FDO_DISTRIBUTION_PACKAGES: "libcsound64-dev llvm clang nasm libsodium-dev libwebp-dev python3-pip"
FDO_DISTRIBUTION_EXEC: >-
bash ci/install-dav1d.sh &&
apt clean &&
bash ./ci/install-rust-ext.sh &&
pip install tomli
rules:
- if: '$UPDATE_IMG == null'
build-stable:
extends:
- .build-debian-container
- .debian:11-stable
build-msrv:
extends:
- .build-debian-container
- .debian:11-msrv
build-nightly:
extends:
- .build-debian-container
- .debian:11-nightly
# Those jobs are triggered by gstreamer-rs when updating its images
update-stable:
extends: build-stable
rules:
- if: '$UPDATE_IMG == "stable"'
variables:
FDO_FORCE_REBUILD: 1
update-msrv:
extends: build-msrv
rules:
- if: '$UPDATE_IMG == "msrv"'
variables:
FDO_FORCE_REBUILD: 1
update-nightly:
extends: build-nightly
rules:
- if: '$UPDATE_IMG == "nightly"'
variables:
FDO_FORCE_REBUILD: 1
.dist-debian-container:
extends:
- .fdo.distribution-image@debian
variables:
SODIUM_USE_PKG_CONFIG: "true"
after_script:
- rm -rf target
.img-stable:
extends:
- .dist-debian-container
- .debian:11-stable
needs:
- job: 'build-stable'
optional: true
- job: 'update-stable'
optional: true
.img-msrv:
extends:
- .dist-debian-container
- .debian:11-msrv
needs:
- job: 'build-msrv'
optional: true
- job: 'update-msrv'
optional: true
.img-nightly:
extends:
- .dist-debian-container
- .debian:11-nightly
needs:
- job: 'build-nightly'
optional: true
- job: 'update-nightly'
optional: true
.cargo test:
stage: "test"
variables:
# csound-sys only looks at /usr/lib and /usr/local top levels
CSOUND_LIB_DIR: '/usr/lib/x86_64-linux-gnu/'
RUST_BACKTRACE: 'full'
script:
- rustc --version
- cargo build --locked --color=always --workspace --all-targets
- G_DEBUG=fatal_warnings cargo test --locked --color=always --workspace --all-targets
- cargo build --locked --color=always --workspace --all-targets --all-features
- G_DEBUG=fatal_warnings cargo test --locked --color=always --workspace --all-targets --all-features
- cargo build --locked --color=always --workspace --all-targets --no-default-features
- G_DEBUG=fatal_warnings cargo test --locked --color=always --workspace --all-targets --no-default-features
test msrv:
extends:
- '.cargo test'
- .img-msrv
rules:
- if: '$UPDATE_IMG == null || $UPDATE_IMG == "msrv"'
test stable:
extends:
- '.cargo test'
- .img-stable
rules:
- if: '$UPDATE_IMG == null || $UPDATE_IMG == "stable"'
test nightly:
allow_failure: true
extends:
- '.cargo test'
- .img-nightly
rules:
- if: '$UPDATE_IMG == null || $UPDATE_IMG == "nightly"'
.meson:
extends: .img-stable
rules:
- if: '$UPDATE_IMG == null || $UPDATE_IMG == "stable"'
variables:
# csound-sys only looks at /usr/lib and /usr/local top levels
CSOUND_LIB_DIR: '/usr/lib/x86_64-linux-gnu/'
meson shared:
extends: .meson
variables:
CI_ARTIFACTS_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/"
script:
- meson build --default-library=shared --prefix=$(pwd)/install
- ninja -C build install
- ./ci/check-plugins-installed.py install
- ninja -C build docs/gst_plugins_cache.json
- ci/check-documentation-diff.py
artifacts:
when: always
expire_in: "7 days"
paths:
- plugins-cache-diffs/
- 'build/meson-logs/'
meson static:
extends: .meson
script:
- meson build --default-library=static --prefix=$(pwd)/install -Dsodium=built-in
- ninja -C build install
- ./ci/generate-static-test.py test-static-link-all
- cd test-static-link-all
- PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$(pwd)/../install/lib/x86_64-linux-gnu/pkgconfig meson build
- ninja -C build
- ./build/test-gst-static
artifacts:
when: always
expire_in: "7 days"
paths:
- 'build/meson-logs/'
# Check that the gstreamer documentation keeps working
documentation:
image: $GSTREAMER_DOC_IMAGE
variables:
MESON_ARGS: >
-Domx=disabled
-Dpython=disabled
-Dlibav=disabled
-Dlibnice=disabled
-Dugly=disabled
-Dbad=disabled
-Dgood=disabled
-Ddevtools=disabled
-Dges=disabled
-Drtsp_server=disabled
-Dvaapi=disabled
-Dsharp=disabled
-Dgst-examples=disabled
-Drs=enabled
-Dgst-plugins-rs:sodium=system
-Dgst-docs:fatal_warnings=true
-Ddoc=enabled
-Dbase=disabled
-Dbase=disabled
-Dorc=disabled
script:
- P=$(pwd)
- cd ..
- rm -rf gstreamer
- git clone --depth 1 https://gitlab.freedesktop.org/gstreamer/gstreamer.git --branch main
- cd gstreamer
- ln -s $P subprojects/gst-plugins-rs
- meson build $MESON_ARGS
- ./gst-env.py ninja -C build subprojects/gst-docs/GStreamer-doc
- mv build/subprojects/gst-docs/GStreamer-doc/html documentation/
artifacts:
expire_in: '7 days'
when: always
paths:
- documentation/
needs: []
# build gst-plugins-rs as a gst-build subproject
gst-build:
extends: .meson
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: 'manual'
allow_failure: true
variables:
MESON_ARGS: >
-Domx=disabled
-Dpython=disabled
-Dlibav=disabled
-Dlibnice=disabled
-Dugly=disabled
-Dbad=disabled
-Ddevtools=disabled
-Dges=disabled
-Drtsp_server=disabled
-Dvaapi=disabled
-Dsharp=disabled
-Dgst-examples=disabled
-Drs=enabled
-Dgst-plugins-rs:sodium=system
script:
- P=$(pwd)
- cd ..
- rm -rf gstreamer
- git clone --depth 1 https://gitlab.freedesktop.org/gstreamer/gstreamer.git --branch main
- cd gstreamer
- ln -s $P subprojects/gst-plugins-rs
- meson build $MESON_ARGS
- ninja -C build
# Check static Rust plugins can be linked into gst-full
- meson build-gst-full --default-library=static $MESON_ARGS
- ninja -C build-gst-full
- meson devenv -C build-gst-full ./gst-inspect-1.0 rsaudiofx
artifacts:
expire_in: '7 days'
when: always
paths:
- 'build/meson-logs/'
- 'build-gst-full/meson-logs/'
.msvc2019 build:
stage: 'test'
needs: []
tags:
- 'docker'
- 'windows'
- '2022'
script:
# Set the code page to UTF-8
- chcp 65001
# We need to build each crate separately to choose that can build on windows
- cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=amd64 &&
powershell ./ci/run_windows_tests.ps1"
- |
if (!$?) {
Write-Host "Tests Failed!"
Exit 1
}
test windows msrv:
extends: '.msvc2019 build'
image: $WINDOWS_RUST_MINIMUM_IMAGE
test windows stable:
extends: '.msvc2019 build'
image: "$WINDOWS_RUST_STABLE_IMAGE"
rustfmt:
extends: .img-stable
stage: "lint"
rules:
- when: 'always'
script:
- cargo fmt --version
- cargo fmt -- --color=always --check
check commits:
extends: .img-stable
stage: "lint"
rules:
- when: 'always'
script:
- ci-fairy check-commits --textwidth 0 --no-signed-off-by
clippy:
extends: .img-stable
stage: 'extras'
variables:
# csound-sys only looks at /usr/lib and /usr/local top levels
CSOUND_LIB_DIR: '/usr/lib/x86_64-linux-gnu/'
rules:
- when: 'always'
script:
- cargo clippy --locked --color=always --all --all-features --all-targets -- -D warnings
deny:
extends: .img-stable
stage: 'extras'
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
script:
- cargo deny check
outdated:
extends: .img-stable
allow_failure: true
stage: 'extras'
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
script:
- cargo outdated --root-deps-only --exit-code 1 -v
coverage:
allow_failure: true
extends:
- .img-stable
stage: 'extras'
rules:
- when: 'always'
variables:
RUSTFLAGS: "-Cinstrument-coverage"
LLVM_PROFILE_FILE: "gst-plugins-rs-%p-%m.profraw"
# csound-sys only looks at /usr/lib and /usr/local top levels
CSOUND_LIB_DIR: '/usr/lib/x86_64-linux-gnu/'
script:
- cargo test --locked --color=always --all --all-features
# generate html report
- grcov . --binary-path ./target/debug/ -s . -t html --branch --ignore-not-existing --ignore "*target*" --ignore "*/build.rs" -o ./coverage/
# generate cobertura report for gitlab integration
- grcov . --binary-path ./target/debug/ -s . -t cobertura --branch --ignore-not-existing --ignore "*target*" --ignore "*/build.rs" -o coverage.xml
# output coverage summary for gitlab parsing.
# TODO: use grcov once https://github.com/mozilla/grcov/issues/556 is fixed
- grep "%" coverage/index.html | head -1 || true
artifacts:
paths:
- 'coverage'
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml