Skip to content
Snippets Groups Projects
.gitlab-ci.yml 12.49 KiB
stages:
  - container
  - container_coverity
  - build
  - analysis
  - pages

variables:
  FDO_UPSTREAM_REPO: 'pipewire/pipewire'

# ci-templates as of Jan 27th 2022
.templates_sha: &templates_sha 0c312d9c7255f46e741d43bcd1930f09cd12efe7

include:
  - project: 'freedesktop/ci-templates'
    ref: *templates_sha
    file: '/templates/fedora.yml'
  - project: 'freedesktop/ci-templates'
    ref: *templates_sha
    file: '/templates/ubuntu.yml'
  - project: 'freedesktop/ci-templates'
    ref: *templates_sha
    file: '/templates/alpine.yml'

.fedora:
  variables:
    # Update this tag when you want to trigger a rebuild
    FDO_DISTRIBUTION_TAG: '2022-11-07.0'
    FDO_DISTRIBUTION_VERSION: '35'
    FDO_DISTRIBUTION_PACKAGES: >-
      alsa-lib-devel
      avahi-devel
      bluez-libs-devel
      clang
      dbus-devel
      doxygen
      fdk-aac-free-devel
      findutils
      gcc
      gcc-c++
      git
      glib-devel
      graphviz
      gstreamer1-devel
      gstreamer1-plugins-base-devel
      jack-audio-connection-kit-devel
      libcanberra-devel
      libldac-devel
      libsndfile-devel
      libusb-devel
      lilv-devel
      libv4l-devel
      libva-devel
      libX11-devel
      ModemManager-devel
      openssl-devel
      pulseaudio-libs-devel
      python3-docutils
      sbc-devel
      ShellCheck
      SDL2-devel
      systemd-devel
      vulkan-loader-devel
      webrtc-audio-processing-devel
      which
      valgrind
      ninja-build
      pkgconf
      python3-pip
      pulseaudio-utils
      openal-soft
      readline-devel
    FDO_DISTRIBUTION_EXEC: >-
      pip3 install meson

.ubuntu:
  variables:
    # Update this tag when you want to trigger a rebuild
    FDO_DISTRIBUTION_TAG: '2022-01-27.0'
    FDO_DISTRIBUTION_VERSION: '20.04'
    FDO_DISTRIBUTION_PACKAGES: >-
      debhelper-compat
      findutils
      git
      libasound2-dev
      libavcodec-dev
      libavfilter-dev
      libavformat-dev
      libdbus-1-dev
      libglib2.0-dev
      libgstreamer1.0-dev
      libgstreamer-plugins-base1.0-dev
      libsbc-dev
      libsdl2-dev
      libudev-dev
      libva-dev
      libv4l-dev
      libx11-dev
      ninja-build
      pkg-config
      python3-docutils
      systemd
      python3-pip
    FDO_DISTRIBUTION_EXEC: >-
      pip3 install meson

.alpine:
  variables:
    # Update this tag when you want to trigger a rebuild
    FDO_DISTRIBUTION_TAG: '2022-09-07.0'
    FDO_DISTRIBUTION_VERSION: '3.15'
    FDO_DISTRIBUTION_PACKAGES: >-
      alsa-lib-dev
      avahi-dev
      bash
      bluez-dev
      gcc
      g++
      dbus-dev
      doxygen
      eudev-dev
      fdk-aac-dev
      git
      glib-dev
      graphviz
      gst-plugins-base-dev
      gstreamer-dev
      jack-dev
      libfreeaptx-dev
      libusb-dev
      libx11-dev
      meson
      modemmanager-dev
      ncurses-dev
      pulseaudio-dev
      readline-dev
      sbc-dev
      vulkan-loader-dev
      xmltoman
.coverity:
  variables:
    FDO_REPO_SUFFIX: 'coverity'
    FDO_BASE_IMAGE: registry.freedesktop.org/$FDO_UPSTREAM_REPO/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG
    FDO_DISTRIBUTION_PACKAGES: >-
      curl
    FDO_DISTRIBUTION_EXEC: >-
      mkdir -p /opt ;
      cd /opt ;
      curl -o /tmp/cov-analysis-linux64.tgz https://scan.coverity.com/download/cxx/linux64
      --form project=$COVERITY_SCAN_PROJECT_NAME --form token=$COVERITY_SCAN_TOKEN ;
      tar xf /tmp/cov-analysis-linux64.tgz ;
      mv cov-analysis-linux64-* coverity ;
      rm /tmp/cov-analysis-linux64.tgz
  only:
    variables:
      - $COVERITY

.not_coverity:
  except:
    variables:
      - $COVERITY

.build:
  before_script:
    # setup the environment
    - export BUILD_ID="$CI_JOB_ID"
    - export PREFIX="$PWD/prefix-$BUILD_ID"
    - export BUILD_DIR="$PWD/build-$BUILD_ID"
    - export XDG_RUNTIME_DIR="$(mktemp -p $PWD -d xdg-runtime-XXXXXX)"
    - |
      if [ -n "$FDO_CI_CONCURRENT" ]; then
         NINJA_ARGS="-j$FDO_CI_CONCURRENT $NINJA_ARGS"
         export NINJA_ARGS
      fi
  script:
    - echo "Building with meson options $MESON_OPTIONS"
    - meson "$BUILD_DIR" . --prefix="$PREFIX" $MESON_OPTIONS
    - ninja $NINJA_ARGS -C "$BUILD_DIR"
    - ninja $NINJA_ARGS -C "$BUILD_DIR" test
    - ninja $NINJA_ARGS -C "$BUILD_DIR" install
  artifacts:
    name: pipewire-$CI_COMMIT_SHA
    when: always
    paths:
      - build-*/meson-logs

container_ubuntu:
  extends:
    - .ubuntu
    - .fdo.container-build@ubuntu
  stage: container
  variables:
    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image

container_fedora:
  extends:
    - .fedora
    - .fdo.container-build@fedora
  stage: container
  variables:
    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image

container_alpine:
  extends:
    - .alpine
    - .fdo.container-build@alpine
  stage: container
  variables:
    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image

container_coverity:
  extends:
    - .fedora
    - .coverity
    - .fdo.container-build@fedora
  stage: container_coverity
  variables:
    GIT_STRATEGY: none

build_on_ubuntu:
  extends:
    - .ubuntu
    - .not_coverity
    - .fdo.distribution-image@ubuntu
    - .build
  stage: build
  variables:
    MESON_OPTIONS: "-Dsession-managers=[]"

.build_on_fedora:
  extends:
    - .fedora
    - .not_coverity
    - .fdo.distribution-image@fedora
    - .build
  stage: build

build_on_fedora:
  extends:
    - .build_on_fedora
  variables:
    MESON_OPTIONS: >-
        -Ddocs=enabled
        -Dinstalled_tests=enabled
        -Dsystemd-system-service=enabled
        -Dbluez5-backend-hsphfpd=enabled
        -Daudiotestsrc=enabled
        -Dtest=enabled
        -Dvideotestsrc=enabled
        -Dvolume=enabled
        -Dvulkan=enabled
        -Dsdl2=enabled
        -Dsndfile=enabled
        -Dsession-managers=[]
  artifacts:
    name: pipewire-$CI_COMMIT_SHA
    when: always
    paths:
      - build-*/meson-logs
      - prefix-*

build_on_alpine:
  extends:
    - .alpine
    - .not_coverity
    - .fdo.distribution-image@alpine
    - .build
  stage: build
  variables:
    MESON_OPTIONS: "-Dsession-managers=[]"

# build with all auto() options enabled
build_all:
  extends:
    - .build_on_fedora
  variables:
    # Fedora doesn't have libfreeaptx, lc3plus, lc3, or roc
    # libcamera has no stable API, so let's not chase that target
    MESON_OPTIONS: >-
        -Dauto_features=enabled
        -Dbluez5-codec-aptx=disabled
        -Dbluez5-codec-lc3plus=disabled
        -Dbluez5-codec-lc3=disabled
        -Droc=disabled
        -Dlibcamera=disabled
        -Dsession-managers=[]
  parallel:
    matrix:
      - CC: [gcc, clang]

# build with all options on auto() or their default values
build_with_no_commandline_options:
  extends:
    - .build_on_fedora
  variables:
    MESON_OPTIONS: "-Dsession-managers=[]"
  parallel:
    matrix:
      - CC: [gcc, clang]

# build with a set of options enabled or disabled
build_with_custom_options:
  extends:
    - .build_on_fedora
  parallel:
    matrix:
      - MESON_OPTION: [docs, installed_tests, systemd-system-service, bluez5-backend-hsphfpd,
                       audiotestsrc, test, videotestsrc, volume, vulkan, sdl2, sndfile]
        MESON_OPTION_VALUE: [enabled, disabled]
  script:
    - echo "Building with -D$MESON_OPTION=$MESON_OPTION_VALUE"
    - meson "$BUILD_DIR" . --prefix="$PREFIX" "-D$MESON_OPTION=$MESON_OPTION_VALUE" -Dsession-managers=[]
    - ninja $NINJA_ARGS -C "$BUILD_DIR"
    - ninja $NINJA_ARGS -C "$BUILD_DIR" test

# A release build with NDEBUG, all options on auto() but tests explicitly
# enabled. This should show issues with tests failing due to different
# optimization or relying on assert.
build_release:
  extends:
    - .build_on_fedora
  variables:
    MESON_OPTIONS: "-Dtest=enabled -Dbuildtype=release -Db_ndebug=true -Dsession-managers=[]"
  parallel:
    matrix:
      - CC: [gcc, clang]

build_session_managers:
  extends:
    - .build_on_fedora
  script:
    - echo "Building with meson options $MESON_OPTIONS"
    - meson "$BUILD_DIR" . --prefix="$PREFIX" $MESON_OPTIONS
    - ninja $NINJA_ARGS -C "$BUILD_DIR"
    - ninja $NINJA_ARGS -C "$BUILD_DIR" install
  variables:
    MESON_OPTIONS: "-Dsession-managers=$SESSION_MANAGERS"
  parallel:
    matrix:
      - SESSION_MANAGERS: ["[]", "wireplumber", "media-session", "media-session,wireplumber", "wireplumber,media-session" ]
  allow_failure: true

build_meson_prerelease:
  extends:
    - .build_on_fedora
  script:
    - pip3 install --upgrade --pre meson
    - echo "Building with meson options $MESON_OPTIONS"
    - meson "$BUILD_DIR" . --prefix="$PREFIX" $MESON_OPTIONS
    - ninja $NINJA_ARGS -C "$BUILD_DIR"
    - ninja $NINJA_ARGS -C "$BUILD_DIR" install
  variables:
    MESON_OPTIONS: "-Dsession-managers=wireplumber,media-session"
  allow_failure: true

build_meson_exact_release:
  extends:
    - .build_on_fedora
  script:
    - meson_version=$(head -n 5 meson.build | grep 'meson_version' | sed -e 's/.*\([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/')
    - echo "Requiring meson version $meson_version"
    - test -n "$meson_version" || (echo "Meson version parser failed" && exit 1)
    - pip3 uninstall --yes meson
    - pip3 install "meson==$meson_version"
    - echo "Building with meson options $MESON_OPTIONS"
    - meson "$BUILD_DIR" . --prefix="$PREFIX" $MESON_OPTIONS
    - ninja $NINJA_ARGS -C "$BUILD_DIR"
    - ninja $NINJA_ARGS -C "$BUILD_DIR" install
  variables:
    MESON_OPTIONS: "-Dsession-managers=[]"

valgrind:
  extends:
    - .build_on_fedora
  script:
    - echo "Building with meson options $MESON_OPTIONS"
    - meson "$BUILD_DIR" . --prefix="$PREFIX" $MESON_OPTIONS
    - meson test -C "$BUILD_DIR" --setup=valgrind
  variables:
    MESON_OPTIONS: "-Dsession-managers=[]"

build_with_coverity:
  extends:
    - .fedora
    - .coverity
    - .fdo.suffixed-image@fedora
    - .build
  stage: analysis
  script:
    - export PATH=/opt/coverity/bin:$PATH
    - meson "$BUILD_DIR" . --prefix="$PREFIX"
        -Ddocs=disabled
        -Dbluez5-backend-hsphfpd=enabled
        -Daudiotestsrc=enabled
        -Dtest=enabled
        -Dvideotestsrc=enabled
        -Dvolume=enabled
        -Dvulkan=enabled
        -Dsdl2=enabled
        -Dsndfile=enabled
        -Dsession-managers=[]
    - cov-configure --config coverity_conf.xml
        --comptype gcc --compiler cc --template
        --xml-option=append_arg@C:--ppp_translator
        --xml-option=append_arg@C:"replace/_sd_deprecated_\s+=/ ="
        --xml-option=append_arg@C:--ppp_translator
        --xml-option=append_arg@C:"replace/GLIB_(DEPRECATED|AVAILABLE)_ENUMERATOR_IN_\d_\d\d(_FOR\(\w+\)|)\s+=/ ="
        --xml-option=append_arg@C:--ppp_translator
        --xml-option=append_arg@C:"replace/(__has_builtin|_GLIBCXX_HAS_BUILTIN)\(\w+\)/1"
    - cov-build --dir cov-int --config coverity_conf.xml ninja $NINJA_ARGS -C "$BUILD_DIR"
    - tar czf cov-int.tar.gz cov-int
    - curl https://scan.coverity.com/builds?project=$COVERITY_SCAN_PROJECT_NAME
        --form token=$COVERITY_SCAN_TOKEN --form email=$GITLAB_USER_EMAIL
        --form file=@cov-int.tar.gz --form version="`git describe --tags`"
        --form description="`git describe --tags` / $CI_COMMIT_TITLE / $CI_COMMIT_REF_NAME:$CI_PIPELINE_ID "
  artifacts:
    name: pipewire-coverity-$CI_COMMIT_SHA
    when: always
    paths:
      - build-*/meson-logs
      - cov-int/build-log.txt

shellcheck:
  extends:
    - .build_on_fedora
  stage: analysis
  script:
    - shellcheck $(git grep -l "#\!/.*bin/.*sh")

spellcheck:
  extends:
    - .build_on_fedora
  stage: analysis
  script:
    - git ls-files | grep -v .gitlab-ci.yml | xargs -d '\n' sed -i 's/Pipewire/PipeWire/g'
    - git diff --exit-code || (echo "Please fix the above spelling mistakes" && exit 1)

doccheck:
  extends:
    - .build_on_fedora
  stage: analysis
  script:
    # Check that each pipewire module has a \subpage entry
    - git grep -h -o -e "\\\page page_module_\w\+" | cut -f2 -d' ' > pipewire_module_pages
    - cat pipewire_module_pages
    - |
      for page in $(cat pipewire_module_pages); do
          git grep -q -e "\\\subpage $page" || (echo "\\page $page is missing \\subpage entry in doc/pipewire-modules.dox" && false)
      done

check_missing_headers:
  extends:
    - .fedora
    - .not_coverity
    - .fdo.distribution-image@fedora
  stage: analysis
  dependencies:
    - build_on_fedora
  script:
    - export PREFIX=`find -name prefix-*`
    - ./.gitlab/ci/check_missing_headers.sh

pages:
  extends:
    - .not_coverity
  stage: pages
  dependencies:
    - build_on_fedora
  script:
    - mkdir public
    - cp -R prefix-*/share/doc/pipewire/html/* public/
  artifacts:
    paths:
      - public
  only:
    - master