# SPDX-License-Identifier: CC0-1.0 # SPDX-FileCopyrightText: 2018-2021 Collabora, Ltd. and the Monado contributors variables: FDO_UPSTREAM_REPO: monado/monado .templates_sha: &templates_sha db8eb22cd1abb036560faaebd36a38565a3ebda2 # Variables listing packages for Debian-based distros .monado.variables.debian-based-packages: variables: # Packages required for build and some other basic jobs CORE_REQUIRED_PACKAGES: "build-essential git wget unzip cmake meson ninja-build libeigen3-dev curl patch python3 pkg-config libx11-dev libx11-xcb-dev libxxf86vm-dev libxrandr-dev libxcb-randr0-dev libvulkan-dev glslang-tools libglvnd-dev libgl1-mesa-dev ca-certificates libusb-1.0-0-dev libudev-dev" # These are optional packages, that we're building against to ensure we build as much code as possible FEATURE_PACKAGES: "libhidapi-dev libwayland-dev libuvc-dev libavcodec-dev libopencv-dev libv4l-dev libcjson-dev libsdl2-dev libegl1-mesa-dev libdbus-1-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libsystemd-dev libbsd-dev" # Only used for building packages PACKAGING_PACKAGES: "devscripts debhelper dput-ng gettext-base markdown doxygen graphviz" # Used for ancillary "not compilation" jobs/features, like docs, changelogs, formatting, etc. TOOLS_REQUIRED_PACKAGES: "clang-format-7 codespell doxygen graphviz python3-pip python3-click" # The NDK builder uses only these packages NDK_PACKAGES: "git wget unzip cmake meson ninja-build libeigen3-dev python3 pkg-config ca-certificates glslang-tools" # Variables for build and usage of Debian 10 (Buster) image .monado.variables.debian:buster: variables: FDO_DISTRIBUTION_VERSION: buster FDO_DISTRIBUTION_TAG: "2021-04-15.0" # Variables for build and usage of Ubuntu 20.04 LTS (Focal) image .monado.variables.ubuntu:focal: variables: FDO_DISTRIBUTION_VERSION: "20.04" FDO_DISTRIBUTION_TAG: "2021-04-15.0" # Variables for build and usage of Ubuntu 20.10 (Groovy) image .monado.variables.ubuntu:groovy: variables: FDO_DISTRIBUTION_VERSION: "20.10" FDO_DISTRIBUTION_TAG: "2021-04-15.0" # Variables for build and usage of Debian 10 (Buster) + Android NDK image .monado.variables.debian:buster-ndk: variables: FDO_DISTRIBUTION_VERSION: buster FDO_DISTRIBUTION_TAG: "2020-05-06.0" FDO_REPO_SUFFIX: ndk # Variables for build and usage of Arch Linux image .monado.variables.arch:rolling: variables: FDO_DISTRIBUTION_TAG: "2021-09-14.0" include: - project: "freedesktop/ci-templates" ref: *templates_sha file: "/templates/debian.yml" - project: "freedesktop/ci-templates" ref: *templates_sha file: "/templates/ubuntu.yml" - project: "freedesktop/ci-templates" ref: *templates_sha file: "/templates/arch.yml" stages: - container_prep - build - package - reprepro - pages - deploy ### # Container prep jobs # Base for all container prep .monado.variables.container-prep-base: # "stage" set here doesn't work, for some reason variables: # no need to pull the whole tree for rebuilding the image - is this still needed? GIT_STRATEGY: none # Each most-derived container prep job has a script to set up stuff for it. FDO_DISTRIBUTION_EXEC: "bash .gitlab-ci/$(echo ${CI_JOB_NAME} | sed 's/:/_/g').sh" # Debian Buster (x64 + i386) debian:container_prep: stage: container_prep extends: - .monado.variables.debian:buster - .monado.variables.container-prep-base - .monado.variables.debian-based-packages - .fdo.container-build@debian # from ci-templates variables: # a list of packages to install - assembled from .monado.variables.debian-based-packages, plus reprepro FDO_DISTRIBUTION_PACKAGES: "${CORE_REQUIRED_PACKAGES} ${FEATURE_PACKAGES} ${PACKAGING_PACKAGES} ${TOOLS_REQUIRED_PACKAGES} reprepro" # Arch Linux (x64) arch:container_prep: stage: container_prep extends: - .monado.variables.arch:rolling - .monado.variables.container-prep-base - .fdo.container-build@arch # from ci-templates variables: # a list of packages to install FDO_DISTRIBUTION_PACKAGES: "git gcc clang cmake meson ninja pkgconfig python3 diffutils patch doxygen graphviz eigen hidapi libxrandr mesa glslang vulkan-headers vulkan-icd-loader check glfw-x11 libusb opencv gtk3 ffmpeg v4l-utils qt5-base" # Ubuntu Focal (x64) ubuntu:focal:container_prep: stage: container_prep extends: - .monado.variables.ubuntu:focal - .monado.variables.container-prep-base - .monado.variables.debian-based-packages - .fdo.container-build@ubuntu # from ci-templates variables: # a list of packages to install - assembled from .monado.variables.debian-based-packages FDO_DISTRIBUTION_PACKAGES: "${CORE_REQUIRED_PACKAGES} ${FEATURE_PACKAGES} ${PACKAGING_PACKAGES} ${TOOLS_REQUIRED_PACKAGES}" # Ubuntu Groovy (x64) ubuntu:groovy:container_prep: stage: container_prep extends: - .monado.variables.ubuntu:groovy - .monado.variables.container-prep-base - .monado.variables.debian-based-packages - .fdo.container-build@ubuntu # from ci-templates variables: # a list of packages to install - assembled from .monado.variables.debian-based-packages FDO_DISTRIBUTION_PACKAGES: "${CORE_REQUIRED_PACKAGES} ${FEATURE_PACKAGES} ${PACKAGING_PACKAGES}" # Debian Buster + the Android NDK in /opt/android-ndk # The NDK itself gets installed by .gitlab-ci/ndk:container_prep.sh ndk:container_prep: stage: container_prep extends: - .monado.variables.debian:buster-ndk - .monado.variables.container-prep-base - .fdo.container-build@debian # from ci-templates variables: # Repo suffix is set in .monado.variables.debian:buster-ndk # a list of packages to install FDO_DISTRIBUTION_PACKAGES: "${NDK_PACKAGES}" # Style check job format-and-spellcheck: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates stage: build script: - scripts/format-and-spellcheck.sh artifacts: paths: - patches/ expire_in: 1 week when: on_failure # Verify REUSE compliance reuse: stage: build image: name: fsfe/reuse:latest entrypoint: [""] script: - reuse lint # "Base" job for a CMake build .monado.base-job.build-cmake: stage: build script: - rm -rf build - mkdir build - pushd build - cmake -GNinja .. $CMAKE_ARGS # List build options - grep "^XRT_" CMakeCache.txt - ninja - ctest --output-on-failure # "Base" job for a Meson build .monado.base-job.build-meson: stage: build script: - rm -rf build - mkdir build - pushd build - meson .. $MESON_ARGS - ninja debian:cmake: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.build-cmake before_script: # Generate "changes since last release" and add to changelog, # since this is the build that makes our docs. - pip3 install proclamation - pushd doc/changes - proclamation build --overwrite vNEXT - popd artifacts: paths: - build/doc/html/ debian:cmake-no-opencv: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.build-cmake variables: CMAKE_ARGS: -DXRT_HAVE_OPENCV=OFF debian:cmake-no-opengl: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.build-cmake variables: CMAKE_ARGS: -DXRT_HAVE_OPENGL=OFF debian:cmake-no-sdl2: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.build-cmake variables: CMAKE_ARGS: -DXRT_HAVE_SDL2=OFF debian:cmake-no-service: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.build-cmake variables: CMAKE_ARGS: -DXRT_FEATURE_SERVICE=OFF arch:cmake: extends: - .monado.variables.arch:rolling - .fdo.distribution-image@arch # from ci-templates - .monado.base-job.build-cmake arch:cmake:clang: extends: - .monado.variables.arch:rolling - .fdo.distribution-image@arch # from ci-templates - .monado.base-job.build-cmake variables: CMAKE_ARGS: -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ ubuntu:cmake: extends: - .monado.variables.ubuntu:focal - .fdo.distribution-image@ubuntu # from ci-templates - .monado.base-job.build-cmake debian:meson: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.build-meson ubuntu:meson: extends: - .monado.variables.ubuntu:focal - .fdo.distribution-image@ubuntu # from ci-templates - .monado.base-job.build-meson arch:meson: extends: - .monado.variables.arch:rolling - .fdo.distribution-image@arch # from ci-templates - .monado.base-job.build-meson variables: MESON_ARGS: -Ddocs=disabled # Cross-compiling debian:meson:32bit: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.build-meson variables: MESON_ARGS: --prefix /usr --libdir /usr/lib/i386-linux-gnu --cross-file ../.gitlab-ci/i386-cross.txt debian:cmake:32bit: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.build-cmake variables: # OpenCV and local OpenHMD doesn't play nicely with us in multi-arch. CMAKE_ARGS: -DCMAKE_TOOLCHAIN_FILE=../.gitlab-ci/i386.cmake -DXRT_HAVE_OPENCV=off -DXRT_BUILD_DRIVER_OHMD=off # Base of Android NDK builds. # Takes the last :-delimited part of the name as the ABI to build for, # so you don't need to do anything other than "extends" in the job .monado.ndk:build-base: stage: build extends: - .monado.variables.debian:buster-ndk - .fdo.suffixed-image@debian # from ci-templates variables: ANDROID_PLATFORM: 26 script: - mkdir build - pushd build # This extracts the ABI from the job name - export ABI=$(echo $CI_JOB_NAME | cut --delimiter=":" -f 2) # Note we are pointing CMake to the host install of Eigen3 because it's header-only # and thus this is safe to do. - cmake -GNinja .. -DANDROID_PLATFORM=$ANDROID_PLATFORM -DANDROID_ABI=$ABI -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk/build/cmake/android.toolchain.cmake -DEigen3_DIR=/usr/lib/cmake/eigen3/ - grep "^XRT_" CMakeCache.txt - ninja ndk:armeabi-v7a: extends: .monado.ndk:build-base ndk:arm64-v8a: extends: .monado.ndk:build-base # Packaging .monado.packaging.conditions: rules: # Only the default branch of the "upstream" repo. - if: "$CI_PROJECT_PATH == $FDO_UPSTREAM_REPO && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH" when: on_success # Otherwise, don't build packages. - when: never .monado.base-job.debuild: extends: - .monado.packaging.conditions stage: package before_script: # Configure git - needed despite not actually committing here. - git config --global user.email "ryan.pavlik@collabora.com" - git config --global user.name "Monado CI" script: # Prep the source tree - git clean -dfx - git merge origin/${PACKAGE_BRANCH} --no-commit - DEBFULLNAME="Monado CI" DEBEMAIL="ryan.pavlik@collabora.com" debian/extra/prepare-commit-package.sh ${CI_COMMIT_SHA} 1~${BACKPORT_SUFFIX}~ci$(date --utc "+%Y%m%d") # Build the package - debuild -uc -us # Use dput-ng to move the package-related files into some artifacts. - export INCOMING=$(pwd)/incoming - mkdir -p $INCOMING - mkdir -p ~/.dput.d/profiles - cat .gitlab-ci/localhost.json | envsubst > ~/.dput.d/profiles/localhost.json - dpkg-parsechangelog --show-field version > incoming/${DISTRO}.distro - dput --debug localhost ../monado_$(dpkg-parsechangelog --show-field version)_amd64.changes artifacts: paths: - "incoming/" expire_in: 2 days debian:buster:package: extends: - .monado.variables.debian:buster - .fdo.distribution-image@debian # from ci-templates - .monado.base-job.debuild variables: BACKPORT_SUFFIX: bpo10 PACKAGE_BRANCH: debian/buster-backports DISTRO: buster ubuntu:focal:package: extends: - .monado.variables.ubuntu:focal - .fdo.distribution-image@ubuntu # from ci-templates - .monado.base-job.debuild variables: BACKPORT_SUFFIX: ubuntu20.04 PACKAGE_BRANCH: ubuntu/focal DISTRO: focal ubuntu:groovy:package: extends: - .monado.variables.ubuntu:groovy - .fdo.distribution-image@ubuntu # from ci-templates - .monado.base-job.debuild variables: BACKPORT_SUFFIX: ubuntu20.04 PACKAGE_BRANCH: ubuntu/focal DISTRO: focal reprepro:package: stage: reprepro extends: - .monado.variables.debian:buster - .monado.packaging.conditions - .fdo.distribution-image@debian # from ci-templates dependencies: - debian:buster:package - ubuntu:focal:package - ubuntu:groovy:package before_script: # Convince gnupg to work properly in CI - mkdir -p ~/.gnupg && chmod 700 ~/.gnupg - touch ~/.gnupg/gpg.conf - echo 'use-agent' > ~/.gnupg/gpg.conf - echo 'pinentry-mode loopback' >> ~/.gnupg/gpg.conf - touch ~/.gnupg/gpg-agent.conf - echo 'allow-loopback-pinentry' > ~/.gnupg/gpg-agent.conf - echo RELOADAGENT | gpg-connect-agent - gpg --batch --no-tty --yes --pinentry-mode loopback --passphrase ${MONADO_GPG_PASSPHRASE} --import ${MONADO_GPG_SECRET_KEY} script: # Use reprepro to create an apt repository in our artifacts - mkdir -p repo/conf # For each distro, sign the changes file and add it to the repo. - | for fn in incoming/*.distro; do # parse the distro name out export DISTRO=$(echo $fn | sed -e 's:incoming/::' -e 's:[.]distro::') echo "Processing $DISTRO" # add distro to repository config - blank line is mandatory! cat .gitlab-ci/distributions | envsubst >> repo/conf/distributions echo >> repo/conf/distributions echo "Signing package for $DISTRO" debsign -k ${MONADO_GPG_FINGERPRINT} -p "gpg --batch --no-tty --yes --pinentry-mode loopback --passphrase ${MONADO_GPG_PASSPHRASE}" incoming/monado_$(cat $fn)_amd64.changes echo "Adding package for $DISTRO to the repository" reprepro -V --ignore=wrongdistribution -b repo include ${DISTRO} incoming/monado_$(cat $fn)_amd64.changes done artifacts: paths: - "repo/" expire_in: 2 days ### # Pages ### pages: stage: pages only: - master dependencies: - debian:cmake - reprepro:package script: - mkdir -p public - mv build/doc/html/* public/ - mv repo public/apt artifacts: paths: - public