From 091946a4785e563dcdf196bea8fcd7e9b85f5330 Mon Sep 17 00:00:00 2001
From: Thibault Saunier <tsaunier@igalia.com>
Date: Sat, 24 Oct 2020 14:56:22 -0300
Subject: [PATCH] ci: Port CI to the new monorepo

Main differences with previous setup are:
- No manifest creation
- gst-indent is executed only when the bot is assigned (instead of the manifest task)
- Cerbero jobs are triggered in the cerbero repo
- Remove cerbero and android related files as they now are in cerbero
  itself.
- Update `container.ps1` to the new file layout

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/891>
---
 .gitlab-ci.yml                                |  887 +++++++++-
 .indentignore                                 |    5 +
 {subprojects/gst-ci => ci}/.gitlab-ci.yml     |    0
 {subprojects/gst-ci => ci}/README.txt         |    0
 {subprojects/gst-ci => ci}/docker/README      |    0
 .../docker/build_manifest/Dockerfile          |    0
 .../gst-ci => ci}/docker/fedora/Dockerfile    |    2 +-
 .../android => ci/docker/fedora}/cleanup.sh   |    0
 .../gst-ci => ci}/docker/fedora/prepare.sh    |   12 +-
 .../gst-ci => ci}/docker/indent/Dockerfile    |    0
 .../docker/test_manifest/Dockerfile           |    0
 .../docker/windows/.dockerignore              |    0
 .../gst-ci => ci}/docker/windows/Dockerfile   |    2 +-
 .../docker/windows/build_image.ps1            |    2 +-
 .../docker/windows/container.ps1              |    4 +-
 .../docker/windows/install_choco.ps1          |    0
 .../docker/windows/install_gst.ps1            |    0
 .../docker/windows/install_toolchain.ps1      |    0
 .../docker/windows/prepare_cerbero_env.sh     |    0
 ci/docker/windows/prepare_gst_env.ps1         |   17 +
 .../docker/windows/rust.Dockerfile            |    2 +-
 {subprojects/gst-ci => ci}/fuzzing/README.txt |    0
 .../gst-ci => ci}/fuzzing/build-oss-fuzz.sh   |    0
 .../gst-ci => ci}/fuzzing/gst-discoverer.c    |    0
 .../gst-ci => ci}/fuzzing/localfuzzer.c       |    0
 {subprojects/gst-ci => ci}/fuzzing/typefind.c |    0
 .../gst-ci => ci}/gitlab/build_manifest.py    |    0
 .../gitlab/clone_manifest_ref.py              |    0
 .../gitlab/freedesktop_doc_importer.sh        |    0
 .../jenkins/Jenkinsfile-cerbero-debian        |    0
 .../jenkins/Jenkinsfile-master-fedora         |    0
 .../jenkins/Jenkinsfile-master-ubuntu         |    0
 .../jenkins/Jenkinsfile-meson-fedora          |    0
 ci/scripts/check-documentation-diff.py        |   20 +
 ci/scripts/handle-subprojects-cache.py        |   58 +
 scripts/gst-indent-all                        |   15 +
 subprojects/gst-ci/.gitignore                 |    1 -
 subprojects/gst-ci/docker/android/Dockerfile  |   11 -
 subprojects/gst-ci/docker/android/prepare.sh  |   56 -
 .../gst-ci/docker/cerbero/Dockerfile-fedora   |   35 -
 subprojects/gst-ci/docker/fedora/cleanup.sh   |    7 -
 .../gst-ci/docker/windows/prepare_gst_env.ps1 |   24 -
 subprojects/gst-ci/gitlab/cerbero_setup.sh    |  169 --
 subprojects/gst-ci/gitlab/ci_template.yml     | 1427 -----------------
 subprojects/gst-plugins-bad/.indentignore     |    1 -
 45 files changed, 1013 insertions(+), 1744 deletions(-)
 create mode 100644 .indentignore
 rename {subprojects/gst-ci => ci}/.gitlab-ci.yml (100%)
 rename {subprojects/gst-ci => ci}/README.txt (100%)
 rename {subprojects/gst-ci => ci}/docker/README (100%)
 rename {subprojects/gst-ci => ci}/docker/build_manifest/Dockerfile (100%)
 rename {subprojects/gst-ci => ci}/docker/fedora/Dockerfile (90%)
 rename {subprojects/gst-ci/docker/android => ci/docker/fedora}/cleanup.sh (100%)
 rename {subprojects/gst-ci => ci}/docker/fedora/prepare.sh (93%)
 rename {subprojects/gst-ci => ci}/docker/indent/Dockerfile (100%)
 rename {subprojects/gst-ci => ci}/docker/test_manifest/Dockerfile (100%)
 rename {subprojects/gst-ci => ci}/docker/windows/.dockerignore (100%)
 rename {subprojects/gst-ci => ci}/docker/windows/Dockerfile (95%)
 rename {subprojects/gst-ci => ci}/docker/windows/build_image.ps1 (96%)
 rename {subprojects/gst-ci => ci}/docker/windows/container.ps1 (96%)
 rename {subprojects/gst-ci => ci}/docker/windows/install_choco.ps1 (100%)
 rename {subprojects/gst-ci => ci}/docker/windows/install_gst.ps1 (100%)
 rename {subprojects/gst-ci => ci}/docker/windows/install_toolchain.ps1 (100%)
 rename {subprojects/gst-ci => ci}/docker/windows/prepare_cerbero_env.sh (100%)
 create mode 100644 ci/docker/windows/prepare_gst_env.ps1
 rename {subprojects/gst-ci => ci}/docker/windows/rust.Dockerfile (96%)
 rename {subprojects/gst-ci => ci}/fuzzing/README.txt (100%)
 rename {subprojects/gst-ci => ci}/fuzzing/build-oss-fuzz.sh (100%)
 rename {subprojects/gst-ci => ci}/fuzzing/gst-discoverer.c (100%)
 rename {subprojects/gst-ci => ci}/fuzzing/localfuzzer.c (100%)
 rename {subprojects/gst-ci => ci}/fuzzing/typefind.c (100%)
 rename {subprojects/gst-ci => ci}/gitlab/build_manifest.py (100%)
 rename {subprojects/gst-ci => ci}/gitlab/clone_manifest_ref.py (100%)
 rename {subprojects/gst-ci => ci}/gitlab/freedesktop_doc_importer.sh (100%)
 rename {subprojects/gst-ci => ci}/jenkins/Jenkinsfile-cerbero-debian (100%)
 rename {subprojects/gst-ci => ci}/jenkins/Jenkinsfile-master-fedora (100%)
 rename {subprojects/gst-ci => ci}/jenkins/Jenkinsfile-master-ubuntu (100%)
 rename {subprojects/gst-ci => ci}/jenkins/Jenkinsfile-meson-fedora (100%)
 create mode 100755 ci/scripts/check-documentation-diff.py
 create mode 100755 ci/scripts/handle-subprojects-cache.py
 create mode 100755 scripts/gst-indent-all
 delete mode 100644 subprojects/gst-ci/.gitignore
 delete mode 100644 subprojects/gst-ci/docker/android/Dockerfile
 delete mode 100644 subprojects/gst-ci/docker/android/prepare.sh
 delete mode 100644 subprojects/gst-ci/docker/cerbero/Dockerfile-fedora
 delete mode 100644 subprojects/gst-ci/docker/fedora/cleanup.sh
 delete mode 100644 subprojects/gst-ci/docker/windows/prepare_gst_env.ps1
 delete mode 100644 subprojects/gst-ci/gitlab/cerbero_setup.sh
 delete mode 100644 subprojects/gst-ci/gitlab/ci_template.yml
 delete mode 100644 subprojects/gst-plugins-bad/.indentignore

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1fa28f4eab..bf09d980eb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1 +1,886 @@
-include: 'https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/master/gitlab/ci_template.yml'
+include:
+  - remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/7ea696055e322cc7aa4bcbe5422b56a198c4bdff/templates/ci-fairy.yml"
+
+stages:
+  - 'build docker'
+  - 'preparation'
+  - 'pre-build'
+  - 'build'
+  - 'test'
+  # Use the resulting binaries
+  - 'integrate'
+
+variables:
+  # Branch to track for modules that have no ref specified in the manifest
+  GST_UPSTREAM_BRANCH: 'master'
+  ORC_UPSTREAM_BRANCH: 'master'
+
+  GIT_LFS_SKIP_SMUDGE: '1'
+
+  ###
+  # IMPORTANT
+  # These are the version tags for the docker images the CI runs against.
+  # If you are hacking on them or need a them to rebuild, its enough
+  # to change any part of the string of the image you want.
+  ###
+  FEDORA_TAG:  '2021-06-30.0'
+  INDENT_TAG: '2020-10-22.0'
+  WINDOWS_TAG: "2021-09-09.0"
+
+  GST_UPSTREAM_REPO: 'gstreamer/gst-ci'
+
+  FEDORA_AMD64_SUFFIX:  'amd64/fedora'
+  INDENT_AMD64_SUFFIX: 'amd64/gst-indent'
+  WINDOWS_AMD64_SUFFIX: 'amd64/windows'
+  WINDOWS_RUST_AMD64_SUFFIX: 'amd64/windows-rust'
+
+  FEDORA_IMAGE:   "$CI_REGISTRY_IMAGE/$FEDORA_AMD64_SUFFIX:$FEDORA_TAG-$GST_UPSTREAM_BRANCH"
+  FEDORA_DOCS_IMAGE: "registry.freedesktop.org/gstreamer/gst-ci/amd64/fedora:2020-07-03.0-master"
+  INDENT_IMAGE:   "$CI_REGISTRY_IMAGE/$INDENT_AMD64_SUFFIX:$INDENT_TAG-$GST_UPSTREAM_BRANCH"
+  WINDOWS_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH"
+  WINDOWS_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH"
+
+  RUST_MINIMUM_VERSION: '1.54.0'
+  RUST_LATEST_VERSION: '1.55.0'
+
+  WINDOWS_RUST_MINIMUM_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_RUST_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH-rust-$RUST_MINIMUM_VERSION"
+  WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/$WINDOWS_RUST_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH-rust-$RUST_MINIMUM_VERSION"
+
+  WINDOWS_RUST_LATEST_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_RUST_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH-rust-$RUST_LATEST_VERSION"
+  WINDOWS_RUST_LATEST_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/$WINDOWS_RUST_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH-rust-$RUST_LATEST_VERSION"
+
+  MESON_BUILDTYPE_ARGS: --default-library=both
+  DEFAULT_MESON_ARGS: >
+    -Dlibnice:tests=disabled
+    -Dlibnice:examples=disabled
+    -Dopenh264:tests=disabled
+    -Dpygobject:tests=false
+    -Dpython=enabled
+    -Dlibav=enabled
+    -Dugly=enabled
+    -Dbad=enabled
+    -Ddevtools=enabled
+    -Dges=enabled
+    -Drtsp_server=enabled
+    -Dvaapi=enabled
+    -Dsharp=disabled
+
+  MESON_GST_WERROR: >
+    -Dgstreamer:werror=true
+    -Dgst-plugins-base:werror=true
+    -Dgst-plugins-good:werror=true
+    -Dgst-plugins-ugly:werror=true
+    -Dgst-plugins-bad:werror=true
+    -Dgst-rtsp-server:werror=true
+    -Dgst-libav:werror=true
+    -Dgst-examples:werror=true
+    -Dgst-editing-services:werror=true
+    -Dgst-docs:werror=true
+    -Dgst-omx:werror=true
+    -Dgst-devtools:werror=true
+    -Dgst-python:werror=true
+    -Dgstreamer-vaapi:werror=true
+    -Dgstreamer-sharp:werror=true
+
+workflow:
+  rules:
+    - if: $CI_MERGE_REQUEST_IID
+    - if: $CI_COMMIT_TAG
+    - if: $CI_COMMIT_BRANCH
+
+#
+# Global CI policy
+#
+# This can be used to configure global behaviour our our jobs.
+#
+default:
+  retry:
+    max: 2
+    when:
+      - 'runner_system_failure'
+      - 'stuck_or_timeout_failure'
+      - 'scheduler_failure'
+      - 'api_failure'
+  interruptible: true
+
+
+# Script to check if a docker image exists in the upstream registry
+# and if so copy it to the forked registry so we can use it
+#
+# This is copied/adapted from citemplates/templates/fedora.yml
+# https://gitlab.freedesktop.org/freedesktop/ci-templates/-/blob/96b621fe9f57ec2464f8d1a0940446afbf6c8f59/templates/fedora.yml
+.check_image: &check_image_exists |
+  # if-not-exists steps
+  set -x
+
+  if [[ -z "$GST_FORCE_REBUILD" ]]
+  then
+    # disable exit on failure
+    set +e
+
+    # check if our image is already in the current registry
+    # we store the sha of the digest and the layers
+    skopeo inspect docker://$LOCAL_IMAGE | jq '[.Digest, .Layers]' > local_sha
+
+    # check if our image is already in our gst-ci registry fork
+    skopeo inspect docker://$LOCAL_GST_CI_IMAGE | jq '[.Digest, .Layers]' > local_gst_ci_sha
+
+    # check if our image is already in the upstream registry
+    if [[ -z "$GST_UPSTREAM_REPO" ]]
+    then
+      echo "WARNING! Variable \$GST_UPSTREAM_REPO is undefined, cannot check for images"
+    else
+      skopeo inspect docker://$GST_UPSTREAM_IMAGE | jq '[.Digest, .Layers]' > upstream_sha
+    fi
+
+    # reenable exit on failure
+    set -e
+
+    # if the upstream repo has an image, ensure we use the same
+    if [ -s upstream_sha ]
+    then
+
+      echo "Checking if $LOCAL_IMAGE is up to date"
+      # ensure we use the same image from upstream
+      diff upstream_sha local_sha && exit 0 || true
+
+      echo "Copying image from gstreamer/gst-ci to local registry"
+      # copy the original image into the current project registry namespace
+      # we do 2 attempts with skopeo copy at most
+      skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD \
+                  docker://$GST_UPSTREAM_IMAGE \
+                  docker://$LOCAL_IMAGE || \
+      skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD \
+                  docker://$GST_UPSTREAM_IMAGE \
+                  docker://$LOCAL_IMAGE
+
+      exit 0
+    fi
+
+    set +x
+
+    # if the local ci fork repo has an image, ensure we use the same
+    if [ -s local_gst_ci_sha ]
+    then
+      echo "Checking if $LOCAL_GST_CI_IMAGE is up to date"
+      # ensure we use the same image from upstream
+      diff local_gst_ci_sha local_sha && exit 0 || true
+
+      echo "Copying image from $CI_PROJECT_NAMESPACE/gst-ci to local registry"
+      # copy the original image into the current project registry namespace
+      # we do 2 attempts with skopeo copy at most
+      skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD \
+                  docker://$LOCAL_GST_CI_IMAGE \
+                  docker://$LOCAL_IMAGE || \
+      skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD \
+                  docker://$LOCAL_GST_CI_IMAGE \
+                  docker://$LOCAL_IMAGE
+
+      exit 0
+    fi
+
+    # if we have a local image but none in the upstream repo, use our
+    if [ -s local_sha ]
+    then
+      echo "Using $LOCAL_IMAGE"
+      exit 0
+    fi
+  fi
+
+
+# Build docker images from Dockerfiles
+#
+# This is copied/adapted from citemplates/templates/fedora.yml
+# https://gitlab.freedesktop.org/freedesktop/ci-templates/-/blob/96b621fe9f57ec2464f8d1a0940446afbf6c8f59/templates/fedora.yml
+#
+# CITemplates builds uses buildah run/commit workflow to build the images which doesn't
+# fit us atm and our images need further adjustment to make use of it. Porting to
+# ci-templates is the next step though.
+#
+# All the documentation from citemplates should be applicable here, so please refer there
+.base:
+  image: "$CI_REGISTRY/freedesktop/ci-templates/buildah:2020-07-20.1"
+  variables:
+    STORAGE_DRIVER: 'vfs'
+    BUILDAH_FORMAT: 'docker'
+    BUILDAH_ISOLATION: 'chroot'
+
+    GIT_STRATEGY: fetch
+  script:
+    - export LOCAL_IMAGE="$CI_REGISTRY_IMAGE/$REPO_SUFFIX:$TAG"
+    - export LOCAL_GST_CI_IMAGE="$CI_REGISTRY/$CI_PROJECT_NAMESPACE/gst-ci/$REPO_SUFFIX:$TAG"
+    - export GST_UPSTREAM_IMAGE="$CI_REGISTRY/$GST_UPSTREAM_REPO/$REPO_SUFFIX:$TAG"
+
+    # check if the docker registry is enabled, else the variable will be missing
+    - |
+      if [[ -z "$CI_REGISTRY_IMAGE" ]]
+      then
+        echo "ERROR! Looks like your repository/fork has disabled Docker Registries."
+        echo "Pleae enable them by following the documentation from here:"
+        echo "https://docs.gitlab.com/ee/user/packages/container_registry/#enable-the-container-registry-for-your-project"
+        exit 1
+      fi
+
+    # Newer versions of podman/buildah try to set overlayfs mount options when
+    # using the vfs driver, and this causes errors.
+    - sed -i '/^mountopt =.*/d' /etc/containers/storage.conf
+
+    - *check_image_exists
+
+    - echo "Building image $LOCAL_IMAGE"
+
+    - >
+      buildah bud
+      --build-arg DEFAULT_BRANCH=$GST_UPSTREAM_BRANCH
+      --label ci.job_id=$CI_JOB_ID
+      --label pipeline.url=$CI_PIPELINE_URL
+      --label git.ref_name=$CI_COMMIT_REF_NAME
+      --label git.sha=$CI_COMMIT_SHA
+      --label gitlab.project_path=$CI_PROJECT_PATH
+      --label gitlab.project_url=$CI_PROJECT_URL
+      --label fdo.upstream-repo=$GST_UPSTREAM_REPO
+      -f $DOCKERFILE
+      -t $LOCAL_IMAGE
+      $CONTEXT_DIR
+
+    - buildah login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+
+    # Sanity check
+    - |
+      if [ "$CI_PROJECT_PATH" = "gstreamer/gstreamer" ]; then
+        if [ "$LOCAL_IMAGE" != "$GST_UPSTREAM_IMAGE" ]; then
+          echo "ERROR!!! AAAAA! THE IMAGE URI DOES NOT MATCH THE EXPECTED UPSTREAM ONE"
+          echo $LOCAL_IMAGE
+          echo $GST_UPSTREAM_IMAGE
+          exit 1
+        fi
+      fi
+
+    -  buildah push $LOCAL_IMAGE
+
+fedora amd64 docker:
+  stage: "build docker"
+  variables:
+    REPO_SUFFIX: "$FEDORA_AMD64_SUFFIX"
+    TAG: "$FEDORA_TAG-$GST_UPSTREAM_BRANCH"
+
+    CONTEXT_DIR: "ci/docker/fedora/"
+    DOCKERFILE: "ci/docker/fedora/Dockerfile"
+  extends: .base
+
+gst-indent amd64 docker:
+  stage: "build docker"
+  variables:
+    REPO_SUFFIX: "$INDENT_AMD64_SUFFIX"
+    TAG: "$INDENT_TAG-$GST_UPSTREAM_BRANCH"
+
+    CONTEXT_DIR: "ci/docker/indent/"
+    DOCKERFILE: "ci/docker/indent/Dockerfile"
+  extends: .base
+
+windows amd64 docker:
+  stage: "build docker"
+  variables:
+    GIT_STRATEGY: fetch
+
+    # Unlike the buildah/linux jobs, this file
+    # needs to be relative to docker/windows/ subdir
+    # as it makes life easier in the powershell script
+    #
+    # We also don't need a CONTEXT_DIR var as its also
+    # hardcoded to be docker/windows/
+    DOCKERFILE: "ci/docker/windows/Dockerfile"
+  tags:
+    - windows
+    - shell
+    - "1809"
+  script:
+    # We need to pass an array and to resolve the env vars, so we can't use a variable:
+    - $DOCKER_BUILD_ARGS = @("--build-arg", "DEFAULT_BRANCH=$GST_UPSTREAM_BRANCH")
+
+    - "& ci/docker/windows/container.ps1 $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $WINDOWS_IMAGE $WINDOWS_UPSTREAM_IMAGE $DOCKERFILE"
+    - |
+      if (!($?)) {
+        echo "Failed to build the image"
+        Exit 1
+      }
+
+.windows rust docker build:
+  stage: 'build docker'
+  needs:
+    - job: 'windows amd64 docker'
+      artifacts: false
+  rules:
+    - if: '$CI_PROJECT_NAME == "gst-ci"'
+  variables:
+    GIT_STRATEGY: 'fetch'
+
+    # Unlike the buildah/linux jobs, this file
+    # needs to be relative to docker/windows/ subdir
+    # as it makes life easier in the powershell script
+    #
+    # We also don't need a CONTEXT_DIR var as its also
+    # hardcoded to be docker/windows/
+    DOCKERFILE: 'docker/windows/rust.Dockerfile'
+  tags:
+    - 'windows'
+    - 'shell'
+    - '1809'
+  script:
+    # We need to pass an array and to resolve the env vars, so we can't use a variable:
+    - $DOCKER_BUILD_ARGS = @("--build-arg", "DEFAULT_BRANCH=$GST_UPSTREAM_BRANCH", "--build-arg", "BASE_IMAGE=$WINDOWS_IMAGE", "--build-arg", "RUST_VERSION=$RUST_VERSION")
+
+    - $env:WINDOWS_CONTAINER_SCRIPT_PATH = "$env:CI_PROJECT_DIR\container.ps1"
+    - echo "Fetching $env:WINDOWS_CONTAINER_SCRIPT_URL"
+    - Invoke-WebRequest -Uri $env:WINDOWS_CONTAINER_SCRIPT_URL -OutFile $env:WINDOWS_CONTAINER_SCRIPT_PATH
+
+    - "& $env:WINDOWS_CONTAINER_SCRIPT_PATH $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $RUST_IMAGE $RUST_UPSTREAM_IMAGE $DOCKERFILE"
+    - |
+      if (!($?)) {
+        echo "Failed to build the image"
+        Exit 1
+      }
+
+windows rust amd64 docker latest stable:
+  extends: '.windows rust docker build'
+  variables:
+    RUST_IMAGE: !reference [variables, "WINDOWS_RUST_LATEST_IMAGE"]
+    RUST_UPSTREAM_IMAGE: !reference [variables, "WINDOWS_RUST_LATEST_UPSTREAM_IMAGE"]
+    RUST_VERSION: !reference [variables, "RUST_LATEST_VERSION"]
+
+windows rust amd64 docker minimum supported version:
+  extends: '.windows rust docker build'
+  variables:
+    RUST_IMAGE: !reference [variables, "WINDOWS_RUST_MINIMUM_IMAGE"]
+    RUST_UPSTREAM_IMAGE: !reference [variables, "WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE"]
+    RUST_VERSION: !reference [variables, "RUST_MINIMUM_VERSION"]
+
+
+
+# ---- Preparation ----- #
+#
+# gst-indent!!
+#
+gst indent:
+  image: $INDENT_IMAGE
+  stage: 'preparation'
+  variables:
+    GIT_STRATEGY: 'fetch'
+    GIT_LFS_SKIP_SMUDGE: '1'
+  script:
+    # man indent. grep RETURN VALUE, grab a beer on my behalf...
+    - indent --version || true
+    - ./scripts/gst-indent-all
+    - |
+      if git diff --quiet; then
+          echo "Code is properly formatted"
+      else
+          git diff --color=always
+          echo 'style diverges, please run gst-indent first'
+          exit 1
+      fi
+
+  rules:
+    # If the MR is assigned to the Merge bot, trigger the pipeline automatically
+    - if: '$CI_MERGE_REQUEST_ASSIGNEES == "gstreamer-merge-bot"'
+    # When the assignee isn't the merge bot, require an explicit action to trigger the pipeline
+    # to avoid wasting CI resources
+    - if: '$CI_MERGE_REQUEST_ASSIGNEES != "gstreamer-merge-bot"'
+      when: 'manual'
+      allow_failure: false
+    # If this matches, it means the pipeline is running against either the main
+    # or a stable branch, so make it manual
+    - if: '$CI_COMMIT_BRANCH == $GST_UPSTREAM_BRANCH'
+      when: 'manual'
+
+#
+# Check "allow-edit" checkbox on merge requests with ci-fairy
+#
+check allow-edit:
+  extends: '.fdo.ci-fairy'
+  needs: []
+  stage: 'preparation'
+  script:
+    - ci-fairy check-merge-request --require-allow-collaboration
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+
+#
+# build setup templates
+#
+.build_template: &build
+  - echo $MESON_ARGS
+
+  - meson build/ $MESON_ARGS
+  - ninja -C build/
+  - ccache --show-stats
+
+.build_ccache_vars:
+  variables:
+    CCACHE_COMPILERCHECK: 'content'
+    CCACHE_COMPRESS: 'true'
+    CCACHE_BASEDIR: '/cache/gstreamer/gstreamer'
+    CCACHE_DIR: '/cache/gstreamer/gstreamer/ccache/'
+    # shared across everything really
+    CCACHE_MAXSIZE: '10G'
+    CARGO_HOME: '/cache/gstreamer/cargo'
+
+.simple_fedora_build: &simple_build >-
+  ${DEFAULT_MESON_ARGS}
+  -Dsharp=enabled
+  -Domx=enabled
+  -Dgst-omx:target=generic
+  -Ddoc=disabled
+  -Drs=disabled
+  ${MESON_BUILDTYPE_ARGS}
+  ${MESON_GST_WERROR}
+
+.build:
+  stage: 'build'
+  extends:
+    - '.build_ccache_vars'
+  needs:
+    - "gst indent"
+  # Taking into account the slowest shared runner + time needed to upload the binaries to artifacts
+  # Also need to take into account I/O of pulling docker images and uploading artifacts
+  timeout: '45min'
+  variables:
+    MESON_ARGS: "${DEFAULT_MESON_ARGS} ${MESON_BUILDTYPE_ARGS} ${MESON_GST_WERROR}"
+  script:
+    *build
+  after_script:
+    - mv build/meson-logs/ meson-logs
+  artifacts:
+    expire_in: "7 days"
+    when: "always"
+    paths:
+      - 'meson-logs/'
+
+.base_modules_changes: &modules_changes
+  - .gitlab-ci.yml
+  - meson.build
+  - subprojects/*.wrap
+  - subprojects/gst-devtools/**/*
+  - subprojects/gst-editing-services/**/*
+  - subprojects/gst-integration-testsuites/**/*
+  - subprojects/gst-libav/**/*
+  - subprojects/gst-omx/**/*
+  - subprojects/gst-plugins-bad/**/*
+  - subprojects/gst-plugins-base/**/*
+  - subprojects/gst-plugins-good/**/*
+  - subprojects/gst-plugins-ugly/**/*
+  - subprojects/gst-python/**/*
+  - subprojects/gstreamer/**/*
+  - subprojects/gstreamer-sharp/**/*
+  - subprojects/gstreamer-vaapi/**/*
+  - subprojects/gst-rtsp-server/**/*
+
+.simple_fedora_build: &simple_build >-
+  ${DEFAULT_MESON_ARGS}
+  -Dsharp=enabled
+  -Domx=enabled
+  -Dgst-omx:target=generic
+  -Ddoc=disabled
+  -Drs=disabled
+  ${MESON_BUILDTYPE_ARGS}
+  ${MESON_GST_WERROR}
+
+.build:
+  stage: 'build'
+  extends:
+    - '.build_ccache_vars'
+  # Taking into account the slowest shared runner + time needed to upload the binaries to artifacts
+  # Also need to take into account I/O of pulling docker images and uploading artifacts
+  timeout: '45min'
+  variables:
+    MESON_ARGS: "${DEFAULT_MESON_ARGS} ${MESON_BUILDTYPE_ARGS} ${MESON_GST_WERROR}"
+  before_script:
+    - ci/scripts/handle-subprojects-cache.py subprojects/
+    # Update subprojects to respect `.wrap` content
+    - meson subprojects update --reset
+  script:
+    *build
+  after_script:
+    - mv build/meson-logs/ meson-logs
+  artifacts:
+    expire_in: "7 days"
+    when: "always"
+    paths:
+      - 'meson-logs/'
+
+.build fedora x86_64:
+  extends: '.build'
+  image: $FEDORA_IMAGE
+  variables:
+    MESON_ARGS: *simple_build
+  rules:
+    - changes:
+        *modules_changes
+
+build nodebug fedora x86_64:
+  extends: '.build'
+  image: $FEDORA_IMAGE
+  variables:
+    MESON_ARGS: "${DEFAULT_MESON_ARGS} -Dsharp=enabled -Dgstreamer:gst_debug=false -Domx=enabled -Dgst-omx:target=generic ${MESON_BUILDTYPE_ARGS} ${MESON_GST_WERROR}"
+
+build static fedora x86_64:
+  extends: '.build fedora x86_64'
+  variables:
+    MESON_BUILDTYPE_ARGS: "--default-library=static -Dintrospection=disabled -Ddoc=disabled"
+
+build static nodebug fedora x86_64:
+  extends: 'build nodebug fedora x86_64'
+  variables:
+    MESON_BUILDTYPE_ARGS: "--default-library=static -Dintrospection=disabled -Ddoc=disabled"
+
+build clang fedora x86_64:
+  extends: '.build fedora x86_64'
+  variables:
+    CC: 'ccache clang'
+    CXX: 'ccache clang++'
+
+.build windows:
+  image: $WINDOWS_IMAGE
+  stage: 'build'
+  tags:
+    - 'docker'
+    - 'windows'
+    - '1809'
+  needs:
+    - "gst indent"
+  timeout: '45min'
+  variables:
+    MESON_ARGS: >
+      ${DEFAULT_MESON_ARGS}
+      -Dpython=disabled
+      -Dlibav=disabled
+      -Dvaapi=disabled
+      -Dgst-plugins-base:pango=enabled
+      -Dgst-plugins-good:cairo=enabled
+  rules:
+    - changes:
+        *modules_changes
+  before_script:
+    - ci/scripts/handle-subprojects-cache.py subprojects/
+  script:
+    # For some reason, options are separated by newline instead of space, so we
+    # have to replace them first.
+    - $env:MESON_ARGS = $env:MESON_ARGS.replace("`n"," ")
+    - cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH &&
+        meson build $env:MESON_ARGS &&
+        ninja -C build"
+  # XXX: Re-enable when uploading stops timing out
+  #artifacts:
+  #  expire_in: "7 days"
+  #  when: "always"
+  #  paths:
+  #    - 'build/meson-logs/'
+
+build vs2017 amd64:
+  extends: '.build windows'
+  variables:
+    ARCH: 'amd64'
+
+build vs2017 x86:
+  extends: '.build windows'
+  variables:
+    ARCH: 'x86'
+
+build msys2 :
+  extends: '.build windows'
+  timeout: '60min'
+  rules:
+    - changes:
+        *modules_changes
+      allow_failure: true
+      when: 'manual'
+  script:
+    # Make sure powershell exists on errors
+    # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-6
+    - $ErrorActionPreference = "Stop"
+
+    # For some reason docker build hangs if this is included in the image, needs more troubleshooting
+    - $env:PATH += ';C:\msys64\usr\bin;C:\msys64\mingw64\bin;C:\msys64\mingw32\bin'
+    # Copied from https://github.com/msys2/setup-msys2/blob/master/main.js#L98
+    - C:\msys64\usr\bin\bash -c "pacman-key --init && pacman-key --populate msys2 && pacman-key --refresh-keys || true"
+    - C:\msys64\usr\bin\bash -c "sed -i 's/^CheckSpace/#CheckSpace/g' /etc/pacman.conf"
+    - echo "Updating MSYS2"
+    - C:\msys64\usr\bin\bash -c "pacman -Syuu --noconfirm || echo Update failed, ignoring"
+    - echo "Killing all MSYS2 processes"
+    - taskkill /F /FI "MODULES eq msys-2.0.dll"
+    - echo "Completing MSYS2 update"
+    - C:\msys64\usr\bin\bash -c "pacman -Suu --noconfirm"
+    - echo "Installing needed MSYS2 packages"
+    - C:\msys64\usr\bin\bash -c "pacman -Sy --noconfirm --needed mingw-w64-x86_64-toolchain ninja"
+
+    # For some reason, options are separated by newline instead of space, so we
+    # have to replace them first.
+    - $env:MESON_ARGS = $env:MESON_ARGS.replace("`n"," ")
+    # Replace forward slashes with backwards so bash doesn't complain
+    - $env:_PROJECT_DIR = $env:CI_PROJECT_DIR.replace('\','/')
+    - C:\msys64\usr\bin\bash -c "meson build $env:MESON_ARGS && ninja -C build"
+
+# ---- Tests ----- #
+
+.test:
+  stage: 'test'
+  extends:
+    - '.build_ccache_vars'
+  needs:
+    - "gst indent"
+  variables:
+    MESON_ARGS: *simple_build
+
+    # Disable colored output to avoid weird rendering issues
+    GST_DEBUG_NO_COLOR: "true"
+    CI_ARTIFACTS_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/validate-logs/"
+    GST_VALIDATE_LAUNCHER_FORCE_COLORS: "true"
+    TIMEOUT_FACTOR: "2"
+    CARGO_HOME: "/cache/gstreamer/cargo"
+    # Enable the fault handler so we get backtraces on segfaults.
+    # any non-empty string will do
+    PYTHONFAULTHANDLER: "enabled"
+  rules:
+    - changes:
+        *modules_changes
+  script:
+    - *build
+
+    - echo "-> Running ${TEST_SUITE}"
+    - >
+      ./gst-env.py
+      gst-validate-launcher ${TEST_SUITE}
+      --dump-on-failure
+      --mute
+      --shuffle
+      --no-display
+      --meson-no-rebuild
+      --timeout-factor "${TIMEOUT_FACTOR}"
+      --fail-on-testlist-change
+      -l "${CI_PROJECT_DIR}/validate-logs/"
+      --xunit-file "${CI_PROJECT_DIR}/validate-logs/xunit.xml"
+      ${EXTRA_VALIDATE_ARGS}
+  after_script:
+    - mv build/meson-logs/ meson-logs
+  artifacts:
+    expire_in: '14 days'
+    when: always
+    paths:
+      - 'meson-logs/'
+      - 'validate-logs'
+    reports:
+      junit:
+        - "validate-logs/*.xml"
+
+.test fedora x86_64:
+  image: $FEDORA_IMAGE
+  extends: '.test'
+  tags: ['gstreamer']
+
+check fedora:
+  extends: '.test fedora x86_64'
+  variables:
+    TEST_SUITE: "check.gst*"
+
+integration testsuites fedora:
+  extends: '.test fedora x86_64'
+  parallel: 4
+  variables:
+    EXTRA_VALIDATE_ARGS: "--timeout-factor=2 --retry-on-failures --check-bugs --parts=${CI_NODE_TOTAL} --part-index=${CI_NODE_INDEX}"
+    TEST_SUITE: "validate ges"
+    GIT_LFS_SKIP_SMUDGE: '0'
+
+# gstreamer-full:
+# introspection has been disabled as the static build does not support it.
+# See https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/162
+gstreamer-full:
+  extends: 'build static fedora x86_64'
+  stage: integrate
+  variables:
+    MESON_ARGS: >
+      --default-library=static
+      -Dintrospection=disabled
+      $MESON_GST_WERROR
+  rules:
+    - changes:
+      - "*"
+      - scripts/*
+      - subprojects/gst-ci/**/*
+
+  script:
+  - *build
+  - meson test -C build -v test-gst-full
+  artifacts:
+    expire_in: "7 days"
+    when: "always"
+    paths:
+      - 'meson-logs/'
+
+gstreamer-full-minimal:
+  extends: 'build static fedora x86_64'
+  stage: integrate
+  variables:
+    MESON_ARGS: >
+      --default-library=static
+      -Dauto_features=disabled
+      -Dgstreamer:check=enabled
+      -Dtests=enabled
+      -Dgst-plugins-base:alsa=enabled
+      -Dgst-plugins-base:typefind=enabled
+      -Dgst-plugins-base:pbtypes=enabled
+      -Dgst-full-elements=coreelements:filesrc,fakesink,identity,input-selector
+      -Dgst-full-typefind-functions=typefindfunctions:wav,flv
+      -Dgst-full-device-providers=alsa:alsadeviceprovider
+      -Dgst-full-dynamic-types=pbtypes:video_multiview_flagset
+      $MESON_GST_WERROR
+  rules:
+    - if: '$CI_PROJECT_NAME =~ /^(gst-build|gst-ci)$/'
+
+  script:
+  - *build
+  - meson test -C build -v test-gst-full
+  - meson test -C build test-gst-full-features --test-args "-e filesrc,identity,fakesink -E filesink,capsfilter -t audio/x-wav -T video/vivo -d alsadeviceprovider -D v4l2deviceprovider -l GstVideoMultiviewFlagsSet"
+  - strip build/libgstreamer-full-1.0.so
+  - ls -l build/libgstreamer-full-1.0.so
+  artifacts:
+    expire_in: "7 days"
+    when: "always"
+    paths:
+      - 'meson-logs/'
+
+# Valgrind
+.valgrind fedora x86_64:
+  extends: '.test fedora x86_64'
+  stage: 'test'
+  variables:
+    EXTRA_VALIDATE_ARGS: "--valgrind"
+
+valgrind core:
+  extends: '.valgrind fedora x86_64'
+  variables:
+    TEST_SUITE: "check.gstreamer\\..*"
+  rules:
+    - changes:
+      - "*"
+      - scripts/*
+      - subprojects/gst-ci/**/*
+      - subprojects/gst-devtools/**/*
+      - subprojects/gstreamer/**/*
+
+valgrind base:
+  extends: '.valgrind fedora x86_64'
+  variables:
+    TEST_SUITE: "check.gst-plugins-base\\..*"
+  rules:
+    - changes:
+      - "*"
+      - scripts/*
+      - subprojects/gst-ci/**/*
+      - subprojects/gst-devtools/**/*
+      - subprojects/gstreamer/**/*
+      - subprojects/gst-plugins-base/**/*
+
+valgrind good:
+  extends: '.valgrind fedora x86_64'
+  variables:
+    TEST_SUITE: "check.gst-plugins-good\\..*"
+    # take longer time due to splitmux unit test
+    TIMEOUT_FACTOR: "4"
+  rules:
+    - changes:
+      - "*"
+      - scripts/*
+      - subprojects/gst-ci/**/*
+      - subprojects/gst-devtools/**/*
+      - subprojects/gstreamer/**/*
+      - subprojects/gst-plugins-base/**/*
+      - subprojects/gst-plugins-good/**/*
+
+valgrind ugly:
+  extends: '.valgrind fedora x86_64'
+  variables:
+    TEST_SUITE: "check.gst-plugins-ugly\\..*"
+  rules:
+    - changes:
+      - "*"
+      - scripts/*
+      - subprojects/gst-ci/**/*
+      - subprojects/gst-devtools/**/*
+      - subprojects/gstreamer/**/*
+      - subprojects/gst-plugins-base/**/*
+      - subprojects/gst-plugins-good/**/*
+      - subprojects/gst-plugins-ugly/**/*
+
+valgrind bad:
+  extends: '.valgrind fedora x86_64'
+  variables:
+    TEST_SUITE: "check.gst-plugins-bad\\..*"
+  rules:
+    - changes:
+      - "*"
+      - scripts/*
+      - subprojects/gst-ci/**/*
+      - subprojects/gst-devtools/**/*
+      - subprojects/gstreamer/**/*
+      - subprojects/gst-plugins-base/**/*
+      - subprojects/gst-plugins-good/**/*
+      - subprojects/gst-plugins-bad/**/*
+
+valgrind ges:
+  extends: '.valgrind fedora x86_64'
+  variables:
+    TEST_SUITE: "check.gst-editing-services\\..*"
+  rules:
+    - changes:
+      - "*"
+      - scripts/*
+      - subprojects/gst-ci/**/*
+      - subprojects/gst-devtools/**/*
+      - subprojects/gstreamer/**/*
+      - subprojects/gst-plugins-base/**/*
+      - subprojects/gst-plugins-good/**/*
+      - subprojects/gst-plugins-bad/**/*
+      - subprojects/gst-editing-services/**/*
+
+# ---- Integration ----- #
+
+documentation:
+  image: $FEDORA_DOCS_IMAGE
+  extends:
+    - '.build_ccache_vars'
+  needs:
+    - "gst indent"
+  rules:
+    - changes:
+      - "*"
+      - subprojects/*.wrap
+      - subprojects/gst-docs/**/*
+      - subprojects/gst-devtools/**/*
+      - subprojects/gst-editing-services/**/*
+      - subprojects/gst-libav/**/*
+      - subprojects/gst-omx/**/*
+      - subprojects/gst-plugins-bad/**/*
+      - subprojects/gst-plugins-base/**/*
+      - subprojects/gst-plugins-good/**/*
+      - subprojects/gst-plugins-ugly/**/*
+      - subprojects/gstreamer/**/*
+      - subprojects/gstreamer-vaapi/**/*
+      - subprojects/gst-rtsp-server/**/*
+  stage: integrate
+  variables:
+    MESON_ARGS: *simple_build
+    MESON_BUILDTYPE_ARGS: "-Ddoc=enabled"
+    CI_ARTIFACTS_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/"
+  script:
+  - pip3 install --upgrade hotdoc
+  - *build
+  - ./gst-env.py ninja -C build/ plugins_doc_caches
+  - ./ci/scripts/check-documentation-diff.py
+  - ./gst-env.py hotdoc run --conf-file=build/subprojects/gst-docs/GStreamer-doc.json --fatal-warnings
+  - mv build/subprojects/gst-docs/GStreamer-doc/html documentation/
+
+  artifacts:
+    when: always
+    paths:
+    - documentation/
+    - plugins-cache-diffs/
diff --git a/.indentignore b/.indentignore
new file mode 100644
index 0000000000..11ffdb987f
--- /dev/null
+++ b/.indentignore
@@ -0,0 +1,5 @@
+subprojects/gst-plugins-bad/ext/sctp/usrsctp/usrsctplib/
+subprojects/gstreamer-rs/
+subprojects/gstreamer-rs-sys/
+subprojects/gst-plugins-rs/
+subprojects/gstreamer-sharp/
diff --git a/subprojects/gst-ci/.gitlab-ci.yml b/ci/.gitlab-ci.yml
similarity index 100%
rename from subprojects/gst-ci/.gitlab-ci.yml
rename to ci/.gitlab-ci.yml
diff --git a/subprojects/gst-ci/README.txt b/ci/README.txt
similarity index 100%
rename from subprojects/gst-ci/README.txt
rename to ci/README.txt
diff --git a/subprojects/gst-ci/docker/README b/ci/docker/README
similarity index 100%
rename from subprojects/gst-ci/docker/README
rename to ci/docker/README
diff --git a/subprojects/gst-ci/docker/build_manifest/Dockerfile b/ci/docker/build_manifest/Dockerfile
similarity index 100%
rename from subprojects/gst-ci/docker/build_manifest/Dockerfile
rename to ci/docker/build_manifest/Dockerfile
diff --git a/subprojects/gst-ci/docker/fedora/Dockerfile b/ci/docker/fedora/Dockerfile
similarity index 90%
rename from subprojects/gst-ci/docker/fedora/Dockerfile
rename to ci/docker/fedora/Dockerfile
index 624cfcdcb8..84a1a038dd 100644
--- a/subprojects/gst-ci/docker/fedora/Dockerfile
+++ b/ci/docker/fedora/Dockerfile
@@ -4,7 +4,7 @@ ENV RUSTUP_HOME=/usr/local/rustup \
     CARGO_HOME=/usr/local/cargo \
     PATH=/usr/local/cargo/bin:$PATH
 
-ARG DEFAULT_BRANCH="master"
+ARG DEFAULT_BRANCH="main"
 
 COPY prepare.sh cleanup.sh /root/
 
diff --git a/subprojects/gst-ci/docker/android/cleanup.sh b/ci/docker/fedora/cleanup.sh
similarity index 100%
rename from subprojects/gst-ci/docker/android/cleanup.sh
rename to ci/docker/fedora/cleanup.sh
diff --git a/subprojects/gst-ci/docker/fedora/prepare.sh b/ci/docker/fedora/prepare.sh
similarity index 93%
rename from subprojects/gst-ci/docker/fedora/prepare.sh
rename to ci/docker/fedora/prepare.sh
index a85f3e495d..3327e21e0c 100644
--- a/subprojects/gst-ci/docker/fedora/prepare.sh
+++ b/ci/docker/fedora/prepare.sh
@@ -7,7 +7,7 @@ sed -i "s/tsflags=nodocs//g" /etc/dnf/dnf.conf
 dnf install -y git-core ninja-build dnf-plugins-core python3-pip
 
 # Configure git for various usage
-git config --global user.email "gst-build@gstreamer.net"
+git config --global user.email "gstreamer@gstreamer.net"
 git config --global user.name "Gstbuild Runner"
 
 # Add rpm fusion repositories in order to access all of the gst plugins
@@ -232,13 +232,13 @@ rustup --version
 cargo --version
 rustc --version
 
-# get gst-build and make all subprojects available
-git clone -b ${DEFAULT_BRANCH} https://gitlab.freedesktop.org/gstreamer/gst-build.git /gst-build/
-cd /gst-build
-meson subprojects download
+# get gstreamer and make all subprojects available
+git clone -b  ${DEFAULT_BRANCH} https://gitlab.freedesktop.org/gstreamer/gstreamer.git /gstreamer
+meson subprojects download --sourcedir /gstreamer
+/gstreamer/ci/scripts/handle-subprojects-cache.py --build /gstreamer/subprojects/
 
 # Run git gc to prune unwanted refs and reduce the size of the image
 for i in $(find subprojects/ -mindepth 1 -maxdepth 1 -type d);
 do
     git -C $i gc --aggressive || true;
-done
\ No newline at end of file
+done
diff --git a/subprojects/gst-ci/docker/indent/Dockerfile b/ci/docker/indent/Dockerfile
similarity index 100%
rename from subprojects/gst-ci/docker/indent/Dockerfile
rename to ci/docker/indent/Dockerfile
diff --git a/subprojects/gst-ci/docker/test_manifest/Dockerfile b/ci/docker/test_manifest/Dockerfile
similarity index 100%
rename from subprojects/gst-ci/docker/test_manifest/Dockerfile
rename to ci/docker/test_manifest/Dockerfile
diff --git a/subprojects/gst-ci/docker/windows/.dockerignore b/ci/docker/windows/.dockerignore
similarity index 100%
rename from subprojects/gst-ci/docker/windows/.dockerignore
rename to ci/docker/windows/.dockerignore
diff --git a/subprojects/gst-ci/docker/windows/Dockerfile b/ci/docker/windows/Dockerfile
similarity index 95%
rename from subprojects/gst-ci/docker/windows/Dockerfile
rename to ci/docker/windows/Dockerfile
index e36e4fa01c..9637c2e7bb 100644
--- a/subprojects/gst-ci/docker/windows/Dockerfile
+++ b/ci/docker/windows/Dockerfile
@@ -14,7 +14,7 @@ RUN 'git config --global user.email "cirunner@gstreamer.freedesktop.org"; git co
 COPY install_toolchain.ps1 C:\
 RUN C:\install_toolchain.ps1
 
-ARG DEFAULT_BRANCH="master"
+ARG DEFAULT_BRANCH="main"
 
 COPY prepare_gst_env.ps1 C:\
 RUN C:\prepare_gst_env.ps1
diff --git a/subprojects/gst-ci/docker/windows/build_image.ps1 b/ci/docker/windows/build_image.ps1
similarity index 96%
rename from subprojects/gst-ci/docker/windows/build_image.ps1
rename to ci/docker/windows/build_image.ps1
index a4be56c1fa..0fadb7e284 100644
--- a/subprojects/gst-ci/docker/windows/build_image.ps1
+++ b/ci/docker/windows/build_image.ps1
@@ -1,6 +1,6 @@
 $env:ErrorActionPreference='Stop'
 
-$env:DEFAULT_BRANCH='master'
+$env:DEFAULT_BRANCH='main'
 $env:VERSION='test'
 $env:tag ="registry.freedesktop.org/gstreamer/gst-ci/amd64/windows:$env:VERSION-$env:DEFAULT_BRANCH"
 $env:rust_tag ="registry.freedesktop.org/gstreamer/gst-ci/amd64/windows-rust:$env:VERSION-$env:DEFAULT_BRANCH"
diff --git a/subprojects/gst-ci/docker/windows/container.ps1 b/ci/docker/windows/container.ps1
similarity index 96%
rename from subprojects/gst-ci/docker/windows/container.ps1
rename to ci/docker/windows/container.ps1
index e5dc2cd835..1386495c72 100644
--- a/subprojects/gst-ci/docker/windows/container.ps1
+++ b/ci/docker/windows/container.ps1
@@ -1,5 +1,5 @@
 # Copied from mesa, big kudos
-# 
+#
 # https://gitlab.freedesktop.org/mesa/mesa/-/blob/master/.gitlab-ci/windows/mesa_container.ps1
 # https://gitlab.freedesktop.org/mesa/mesa/-/blob/34e3e164936d1d3cef267da7780e87f062fedf39/.gitlab-ci/windows/mesa_container.ps1
 
@@ -43,7 +43,7 @@ if ($?) {
 }
 
 Write-Host "No image found at $registry_user_image or $registry_central_image; rebuilding"
-docker --config "windows-docker.conf" build $DOCKER_BUILD_ARGS --no-cache -t "$registry_user_image" -f "$dockerfile" "./docker/windows"
+docker --config "windows-docker.conf" build $DOCKER_BUILD_ARGS --no-cache -t "$registry_user_image" -f "$dockerfile" "./ci/docker/windows"
 if (!$?) {
   Write-Host "Container build failed"
   docker --config "windows-docker.conf" logout "$registry_uri"
diff --git a/subprojects/gst-ci/docker/windows/install_choco.ps1 b/ci/docker/windows/install_choco.ps1
similarity index 100%
rename from subprojects/gst-ci/docker/windows/install_choco.ps1
rename to ci/docker/windows/install_choco.ps1
diff --git a/subprojects/gst-ci/docker/windows/install_gst.ps1 b/ci/docker/windows/install_gst.ps1
similarity index 100%
rename from subprojects/gst-ci/docker/windows/install_gst.ps1
rename to ci/docker/windows/install_gst.ps1
diff --git a/subprojects/gst-ci/docker/windows/install_toolchain.ps1 b/ci/docker/windows/install_toolchain.ps1
similarity index 100%
rename from subprojects/gst-ci/docker/windows/install_toolchain.ps1
rename to ci/docker/windows/install_toolchain.ps1
diff --git a/subprojects/gst-ci/docker/windows/prepare_cerbero_env.sh b/ci/docker/windows/prepare_cerbero_env.sh
similarity index 100%
rename from subprojects/gst-ci/docker/windows/prepare_cerbero_env.sh
rename to ci/docker/windows/prepare_cerbero_env.sh
diff --git a/ci/docker/windows/prepare_gst_env.ps1 b/ci/docker/windows/prepare_gst_env.ps1
new file mode 100644
index 0000000000..7b19497297
--- /dev/null
+++ b/ci/docker/windows/prepare_gst_env.ps1
@@ -0,0 +1,17 @@
+[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
+
+# FIXME: Python fails to validate github.com SSL certificate, unless we first
+# run a dummy download to force refreshing Windows' CA database.
+# See: https://bugs.python.org/issue36137
+(New-Object System.Net.WebClient).DownloadString("https://github.com") >$null
+
+Write-Host "Cloning GStreamer"
+git clone -b $env:DEFAULT_BRANCH https://gitlab.freedesktop.org/gstreamer/gstreamer.git C:\gstreamer
+
+# download the subprojects to try and cache them
+Write-Host "Downloading subprojects"
+meson subprojects download --sourcedir /gstreamer
+
+Write-Host "Caching subprojects into /subprojects/"
+python /gstreamer/ci/scripts/handle-subprojects-cache.py --build /gstreamer/subprojects/
+Remove-Item -Recurse -Force C:\gstreamer
diff --git a/subprojects/gst-ci/docker/windows/rust.Dockerfile b/ci/docker/windows/rust.Dockerfile
similarity index 96%
rename from subprojects/gst-ci/docker/windows/rust.Dockerfile
rename to ci/docker/windows/rust.Dockerfile
index 5e7425fef9..f3742454a3 100644
--- a/subprojects/gst-ci/docker/windows/rust.Dockerfile
+++ b/ci/docker/windows/rust.Dockerfile
@@ -5,7 +5,7 @@
 ARG BASE_IMAGE="inavlid.gstreamer.freedesktop.org/invalid"
 FROM $BASE_IMAGE
 
-ARG DEFAULT_BRANCH="master"
+ARG DEFAULT_BRANCH="main"
 ARG RUST_VERSION="invalid"
 
 COPY install_gst.ps1 C:\
diff --git a/subprojects/gst-ci/fuzzing/README.txt b/ci/fuzzing/README.txt
similarity index 100%
rename from subprojects/gst-ci/fuzzing/README.txt
rename to ci/fuzzing/README.txt
diff --git a/subprojects/gst-ci/fuzzing/build-oss-fuzz.sh b/ci/fuzzing/build-oss-fuzz.sh
similarity index 100%
rename from subprojects/gst-ci/fuzzing/build-oss-fuzz.sh
rename to ci/fuzzing/build-oss-fuzz.sh
diff --git a/subprojects/gst-ci/fuzzing/gst-discoverer.c b/ci/fuzzing/gst-discoverer.c
similarity index 100%
rename from subprojects/gst-ci/fuzzing/gst-discoverer.c
rename to ci/fuzzing/gst-discoverer.c
diff --git a/subprojects/gst-ci/fuzzing/localfuzzer.c b/ci/fuzzing/localfuzzer.c
similarity index 100%
rename from subprojects/gst-ci/fuzzing/localfuzzer.c
rename to ci/fuzzing/localfuzzer.c
diff --git a/subprojects/gst-ci/fuzzing/typefind.c b/ci/fuzzing/typefind.c
similarity index 100%
rename from subprojects/gst-ci/fuzzing/typefind.c
rename to ci/fuzzing/typefind.c
diff --git a/subprojects/gst-ci/gitlab/build_manifest.py b/ci/gitlab/build_manifest.py
similarity index 100%
rename from subprojects/gst-ci/gitlab/build_manifest.py
rename to ci/gitlab/build_manifest.py
diff --git a/subprojects/gst-ci/gitlab/clone_manifest_ref.py b/ci/gitlab/clone_manifest_ref.py
similarity index 100%
rename from subprojects/gst-ci/gitlab/clone_manifest_ref.py
rename to ci/gitlab/clone_manifest_ref.py
diff --git a/subprojects/gst-ci/gitlab/freedesktop_doc_importer.sh b/ci/gitlab/freedesktop_doc_importer.sh
similarity index 100%
rename from subprojects/gst-ci/gitlab/freedesktop_doc_importer.sh
rename to ci/gitlab/freedesktop_doc_importer.sh
diff --git a/subprojects/gst-ci/jenkins/Jenkinsfile-cerbero-debian b/ci/jenkins/Jenkinsfile-cerbero-debian
similarity index 100%
rename from subprojects/gst-ci/jenkins/Jenkinsfile-cerbero-debian
rename to ci/jenkins/Jenkinsfile-cerbero-debian
diff --git a/subprojects/gst-ci/jenkins/Jenkinsfile-master-fedora b/ci/jenkins/Jenkinsfile-master-fedora
similarity index 100%
rename from subprojects/gst-ci/jenkins/Jenkinsfile-master-fedora
rename to ci/jenkins/Jenkinsfile-master-fedora
diff --git a/subprojects/gst-ci/jenkins/Jenkinsfile-master-ubuntu b/ci/jenkins/Jenkinsfile-master-ubuntu
similarity index 100%
rename from subprojects/gst-ci/jenkins/Jenkinsfile-master-ubuntu
rename to ci/jenkins/Jenkinsfile-master-ubuntu
diff --git a/subprojects/gst-ci/jenkins/Jenkinsfile-meson-fedora b/ci/jenkins/Jenkinsfile-meson-fedora
similarity index 100%
rename from subprojects/gst-ci/jenkins/Jenkinsfile-meson-fedora
rename to ci/jenkins/Jenkinsfile-meson-fedora
diff --git a/ci/scripts/check-documentation-diff.py b/ci/scripts/check-documentation-diff.py
new file mode 100755
index 0000000000..238c958d1e
--- /dev/null
+++ b/ci/scripts/check-documentation-diff.py
@@ -0,0 +1,20 @@
+#!/usr/bin/python3
+import os, subprocess, sys
+
+if __name__ == "__main__":
+    diffsdir = '../plugins-cache-diffs'
+    os.makedirs(diffsdir, exist_ok=True)
+    res = 0
+    try:
+        subprocess.check_call(['git', 'diff', '--quiet'] )
+    except subprocess.CalledProcessError:
+        diffname = os.path.join(diffsdir, 'plugins_cache.diff')
+        res += 1
+        with open(diffname, 'w') as diff:
+            subprocess.check_call(['git', 'diff'], stdout=diff)
+            print('\033[91mYou have a diff in the documentation cache. Please update with:\033[0m')
+            print('     $ curl %s/%s | git apply -' % (os.environ['CI_ARTIFACTS_URL'], diffname.replace('../', '')))
+
+    if res != 0:
+        print('(note that it might take a few minutes for artefacts to be available on the server)\n')
+        sys.exit(res)
\ No newline at end of file
diff --git a/ci/scripts/handle-subprojects-cache.py b/ci/scripts/handle-subprojects-cache.py
new file mode 100755
index 0000000000..3bec5bfe78
--- /dev/null
+++ b/ci/scripts/handle-subprojects-cache.py
@@ -0,0 +1,58 @@
+#!/usr/bin/python
+
+"""
+Copies current subproject git repository to create a cache
+"""
+
+import shutil
+import os
+import sys
+import argparse
+
+DEST = "/subprojects"
+PARSER = argparse.ArgumentParser()
+PARSER.add_argument('subprojects_dir')
+PARSER.add_argument('--build', action="store_true", default=False)
+
+def create_cache_in_image(options):
+    os.makedirs(DEST, exist_ok=True)
+    print("Creating cache from %s" % options.subprojects_dir)
+    for project_name in os.listdir(options.subprojects_dir):
+        project_path = os.path.join(options.subprojects_dir, project_name)
+
+        if project_name != "packagecache" and not os.path.exists(os.path.join(project_path, '.git')):
+            continue
+
+        print("Copying %s" % project_name)
+        shutil.copytree(project_path, os.path.join(DEST, project_name))
+
+
+def copy_cache(options):
+    for path in [DEST, "/gst-build/subprojects", r"C:\gst-build\subprojects"]: # FIXME Remove when not needed anymore.
+        if not os.path.exists(path):
+            print("%s doesn't exist." % path)
+            continue
+
+        for project_name in os.listdir(path):
+            project_path = os.path.join(options.subprojects_dir, project_name)
+
+            cache_dir = os.path.join(path, project_name)
+            if os.path.exists(project_path):
+                print("- Ignoring %s" % cache_dir)
+                continue
+
+            if not os.path.isdir(cache_dir):
+                print("- Ignoring %s" % cache_dir)
+                continue
+
+            print("Copying from %s" % cache_dir)
+            shutil.copytree(cache_dir, project_path)
+
+
+if __name__ == "__main__":
+    options = PARSER.parse_args()
+
+    if options.build:
+        create_cache_in_image(options)
+    else:
+        copy_cache(options)
\ No newline at end of file
diff --git a/scripts/gst-indent-all b/scripts/gst-indent-all
new file mode 100755
index 0000000000..c0580b1aed
--- /dev/null
+++ b/scripts/gst-indent-all
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+filter_cmd=("cat")
+if test -f ".indentignore"; then
+    filter_args=()
+    while read -r line; do
+        if test -n "$line"; then
+            filter_args+=("-e" "$line")
+        fi
+    done < ".indentignore"
+    if [[ ${#filter_args[@]} -gt 0 ]]; then
+        filter_cmd=("grep" "-v" "${filter_args[@]}")
+    fi
+fi
+git ls-files "*.c" | "${filter_cmd[@]}" | xargs -d '\n' gst-indent
diff --git a/subprojects/gst-ci/.gitignore b/subprojects/gst-ci/.gitignore
deleted file mode 100644
index b25c15b81f..0000000000
--- a/subprojects/gst-ci/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*~
diff --git a/subprojects/gst-ci/docker/android/Dockerfile b/subprojects/gst-ci/docker/android/Dockerfile
deleted file mode 100644
index f874ff01d2..0000000000
--- a/subprojects/gst-ci/docker/android/Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM registry.fedoraproject.org/fedora:31
-
-ENV ANDROID_HOME=/android/sdk
-ENV ANDROID_NDK_HOME=/android/ndk
-
-ARG DEFAULT_BRANCH="master"
-
-COPY prepare.sh cleanup.sh /root/
-
-RUN /usr/bin/sh /root/prepare.sh && \
-    /usr/bin/sh /root/cleanup.sh
diff --git a/subprojects/gst-ci/docker/android/prepare.sh b/subprojects/gst-ci/docker/android/prepare.sh
deleted file mode 100644
index 953bc5ec5a..0000000000
--- a/subprojects/gst-ci/docker/android/prepare.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-set -eux
-
-dnf install -y \
-    file \
-    git-core \
-    java-1.8.0-openjdk-devel \
-    lbzip2 \
-    make \
-    pkg-config \
-    unzip \
-    which \
-    xz
-
-mkdir -p /android/sources
-
-curl -o /android/sources/android-ndk.zip https://dl.google.com/android/repository/android-ndk-r21-linux-x86_64.zip
-unzip /android/sources/android-ndk.zip -d ${ANDROID_NDK_HOME}/
-# remove the intermediate versioned directory
-mv ${ANDROID_NDK_HOME}/*/* ${ANDROID_NDK_HOME}/
-
-curl -o /android/sources/android-sdk-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip
-unzip /android/sources/android-sdk-tools.zip -d ${ANDROID_HOME}/
-mkdir -p ${ANDROID_HOME}/licenses
-
-# Accept licenses. Values taken from:
-# $ANDROID_HOME/tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --licenses
-# cd $ANDROID_HOME
-# for f in licenses/*; do echo "echo \"$(cat $f | tr -d '\n')\" > \${ANDROID_HOME}/$f"; done
-echo "601085b94cd77f0b54ff86406957099ebe79c4d6" > ${ANDROID_HOME}/licenses/android-googletv-license
-echo "859f317696f67ef3d7f30a50a5560e7834b43903" > ${ANDROID_HOME}/licenses/android-sdk-arm-dbt-license
-echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" > ${ANDROID_HOME}/licenses/android-sdk-license
-echo "84831b9409646a918e30573bab4c9c91346d8abd" > ${ANDROID_HOME}/licenses/android-sdk-preview-license
-echo "33b6a2b64607f11b759f320ef9dff4ae5c47d97a" > ${ANDROID_HOME}/licenses/google-gdk-license
-echo "e9acab5b5fbb560a72cfaecce8946896ff6aab9d" > ${ANDROID_HOME}/licenses/mips-android-sysimage-license
-
-# pre-cache deps
-export GSTREAMER_ROOT_ANDROID=/android/sources/gstreamer-android
-curl -o /android/sources/gstreamer-android.tar.xz https://gstreamer.freedesktop.org/data/pkg/android/1.16.2/gstreamer-1.0-android-universal-1.16.2.tar.xz
-mkdir $GSTREAMER_ROOT_ANDROID
-tar -xvf /android/sources/gstreamer-android.tar.xz -C $GSTREAMER_ROOT_ANDROID
-ls $GSTREAMER_ROOT_ANDROID
-
-git clone -b ${DEFAULT_BRANCH} https://gitlab.freedesktop.org/gstreamer/gst-examples.git /android/sources/gst-examples
-chmod +x /android/sources/gst-examples/playback/player/android/gradlew
-/android/sources/gst-examples/playback/player/android/gradlew --no-daemon --project-dir /android/sources/gst-examples/playback/player/android dependencies --refresh-dependencies
-
-chmod +x /android/sources/gst-examples/vulkan/android/gradlew
-/android/sources/gst-examples/vulkan/android/gradlew --no-daemon --project-dir /android/sources/gst-examples/vulkan/android dependencies --refresh-dependencies
-
-git clone -b ${DEFAULT_BRANCH} https://gitlab.freedesktop.org/gstreamer/gst-docs.git /android/sources/gst-docs
-chmod +x /android/sources/gst-docs/examples/tutorials/android/gradlew
-/android/sources/gst-docs/examples/tutorials/android/gradlew --no-daemon --project-dir /android/sources/gst-docs/examples/tutorials/android dependencies --refresh-dependencies
-
-unset GSTREAMER_ROOT_ANDROID
-
-rm -rf /android/sources
diff --git a/subprojects/gst-ci/docker/cerbero/Dockerfile-fedora b/subprojects/gst-ci/docker/cerbero/Dockerfile-fedora
deleted file mode 100644
index c903b9562b..0000000000
--- a/subprojects/gst-ci/docker/cerbero/Dockerfile-fedora
+++ /dev/null
@@ -1,35 +0,0 @@
-FROM registry.fedoraproject.org/fedora:31
-
-ENV TERM="dumb"
-
-ARG DEFAULT_BRANCH="master"
-
-# System setup
-RUN echo "fastestmirror=true" >>  /etc/dnf/dnf.conf && \
-    dnf upgrade -y && \
-    dnf install -y sudo git lbzip2 rsync wine which
-
-# Configure git for various usage
-RUN git config --global user.email "cerbero@gstreamer.freedesktop.org" && \
-    git config --global user.name  "Cerbero Build System"
-
-RUN git clone -b ${DEFAULT_BRANCH} https://gitlab.freedesktop.org/gstreamer/cerbero.git && \
-    mkdir $HOME/.cerbero && \
-    echo "allow_parallel_build=True" > $HOME/.cerbero/cerbero.cbc && \
-    echo "use_ccache=True" >> $HOME/.cerbero/cerbero.cbc && \
-    cd cerbero && \
-      echo "local_sources=\"/cerbero/cerbero-sources\"" >> localconf.cbc && \
-      echo "home_dir=\"/cerbero/cerbero-build\"" >> localconf.cbc && \
-      ./cerbero-uninstalled -t -c localconf.cbc fetch-bootstrap --jobs=4 && \
-      ./cerbero-uninstalled -t -c localconf.cbc fetch-package --jobs=4 gstreamer-1.0 && \
-      ./cerbero-uninstalled -t -c localconf.cbc bootstrap -y --build-tools=no --toolchains=no && \
-      ./cerbero-uninstalled -t -c localconf.cbc -c config/cross-win32.cbc fetch-bootstrap --jobs=4 && \
-      ./cerbero-uninstalled -t -c localconf.cbc -c config/cross-win32.cbc fetch-package --jobs=4 gstreamer-1.0 && \
-      ./cerbero-uninstalled -t -c localconf.cbc -c config/cross-win64.cbc fetch-bootstrap --jobs=4 && \
-      ./cerbero-uninstalled -t -c localconf.cbc -c config/cross-win64.cbc fetch-package --jobs=4 gstreamer-1.0 && \
-      ./cerbero-uninstalled -t -c localconf.cbc -c config/cross-android-universal.cbc fetch-bootstrap --jobs=4 && \
-      ./cerbero-uninstalled -t -c localconf.cbc -c config/cross-android-universal.cbc fetch-package --jobs=4 gstreamer-1.0 && \
-      cd .. && \
-    rm -rf /cerbero/cerbero-build/{dist,logs,sources} && \
-    rm -f /cerbero/cerbero-build/{linux,windows,android}*.cache && \
-    dnf clean all
diff --git a/subprojects/gst-ci/docker/fedora/cleanup.sh b/subprojects/gst-ci/docker/fedora/cleanup.sh
deleted file mode 100644
index a60a9fcf4b..0000000000
--- a/subprojects/gst-ci/docker/fedora/cleanup.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-set -eux
-
-echo "Removing DNF cache"
-dnf clean all
-
-rm -R /root/*
-rm -rf /var/cache/dnf /var/log/dnf*
diff --git a/subprojects/gst-ci/docker/windows/prepare_gst_env.ps1 b/subprojects/gst-ci/docker/windows/prepare_gst_env.ps1
deleted file mode 100644
index 652fe2b4f7..0000000000
--- a/subprojects/gst-ci/docker/windows/prepare_gst_env.ps1
+++ /dev/null
@@ -1,24 +0,0 @@
-[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
-
-# Download gst-build and all its subprojects
-git clone -b $env:DEFAULT_BRANCH https://gitlab.freedesktop.org/gstreamer/gst-build.git C:\gst-build
-if (!$?) {
-  Write-Host "Failed to clone gst-build"
-  Exit 1
-}
-
-# download the subprojects to try and cache them
-meson subprojects download --sourcedir C:\gst-build
-if (!$?) {
-  Write-Host "Failed to download the subprojects"
-  Exit 1
-}
-
-# Remove files that will conflict with a fresh clone on the runner side
-Remove-Item -Force 'C:/gst-build/subprojects/*.wrap'
-Remove-Item -Recurse -Force 'C:/gst-build/subprojects/win-nasm'
-Remove-Item -Recurse -Force 'C:/gst-build/subprojects/win-flex-bison-binaries'
-Remove-Item -Recurse -Force 'C:/gst-build/subprojects/macos-bison-binary'
-
-Move-Item C:\gst-build\subprojects C:\subprojects
-Remove-Item -Recurse -Force C:\gst-build
diff --git a/subprojects/gst-ci/gitlab/cerbero_setup.sh b/subprojects/gst-ci/gitlab/cerbero_setup.sh
deleted file mode 100644
index 96fc7390df..0000000000
--- a/subprojects/gst-ci/gitlab/cerbero_setup.sh
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-show_ccache_sum() {
-    if [[ -n ${HAVE_CCACHE} ]]; then
-        ccache -s
-    fi
-}
-
-# XXX: This is copied and modified from the cerbero-uninstalled script
-# Use `mount` to get a list of MSYS mount points that the MSYS shell uses.
-# That's our reference point for translating from MSYS paths to Win32 paths.
-# We assume that the MSYS mount point directories are only in the filesystem
-# root. This will break if people add their own custom mount points beyond what
-# MSYS automatically creates, which is highly unlikely.
-#
-# /d -> d:/
-# /c -> c:/
-# /d/projects/cerbero -> d:/projects/cerbero/
-# /home/USERNAME/cerbero -> C:\\MinGW\\msys\\1.0/home/USERNAME/
-# /mingw -> C:\\MinGW/
-# /mingw/bin/foobar -> C:\\MinGW\\bin/foobar/
-# /tmp/baz -> C:\\Users\\USERNAME\\AppData\\Local\\Temp/baz/
-msys_dir_to_win32() {
-    set -e
-    local msys_path stripped_path mount_point path mounted_path
-    # If the path is already a native path, just return that
-    if [[ $1 == ?:/* ]] || [[ $1 == ?:\\* ]]; then
-      echo $1
-      return
-    fi
-    # Convert /c or /mingw etc to /c/ or /mingw/ etc; gives us a necessary
-    # anchor to split the path into components
-    msys_path="$1/"
-    # Strip leading slash
-    stripped_path="${msys_path#/}"
-    # Get the first path component, which may be a mount point
-    mount_point="/${stripped_path%%/*}"
-    # Get the path inside the mountp oint
-    path="/${stripped_path#*/}"
-    mounted_path="$(mount | sed -n "s|\(.*\) on $mount_point type.*|\1|p")"
-    # If it's not a mounted path (like /c or /tmp or /mingw), then it's in the
-    # general MSYS root mount
-    if [[ -z $mounted_path ]]; then
-        mounted_path="$(mount | sed -n "s|\(.*\) on / type.*|\1|p")"
-        path="$1"
-    fi
-    echo ${mounted_path}${path%/}
-}
-
-# Print the working directory in the native OS path format, but with forward
-# slashes
-pwd_native() {
-    if [[ -n "$MSYSTEM" ]]; then
-        msys_dir_to_win32 "$(pwd)"
-    else
-        pwd
-    fi
-}
-
-fix_build_tools() {
-    if [[ $(uname) == Darwin ]]; then
-        # Bison needs these env vars set for the build-tools prefix to be
-        # relocatable, and we only build it on macOS. On Linux we install it
-        # using the package manager, and on Windows we use the MSYS Bison.
-        export M4="$(pwd)/${CERBERO_HOME}/build-tools/bin/m4"
-        export BISON_PKGDATADIR="$(pwd)/${CERBERO_HOME}/build-tools/share/bison"
-    fi
-}
-
-# Produces runtime and devel tarball packages for linux/android or .pkg for macos
-cerbero_package_and_check() {
-    $CERBERO $CERBERO_ARGS package --offline ${CERBERO_PACKAGE_ARGS} -o "$(pwd_native)" gstreamer-1.0
-
-    # Run gst-inspect-1.0 for some basic checks. Can't do this for cross-(android|ios)-universal, of course.
-    if [[ $CONFIG != *universal* ]]; then
-        $CERBERO $CERBERO_ARGS run $CERBERO_RUN_WRAPPER gst-inspect-1.0$CERBERO_RUN_SUFFIX --version
-        $CERBERO $CERBERO_ARGS run $CERBERO_RUN_WRAPPER gst-inspect-1.0$CERBERO_RUN_SUFFIX
-    fi
-
-    show_ccache_sum
-}
-
-cerbero_before_script() {
-    pwd
-    ls -lha
-
-    # Copy cerbero git repo stored on the image
-    cp -a "${CERBERO_HOST_DIR}/.git" .
-    git checkout .
-    git status
-
-    # If there's no cerbero-sources directory in the runner cache, copy it from
-    # the image cache
-    if ! [[ -d ${CERBERO_SOURCES} ]]; then
-        time cp -a "${CERBERO_HOST_DIR}/${CERBERO_SOURCES}" .
-    fi
-    du -sch "${CERBERO_SOURCES}" || true
-
-    echo "home_dir = \"$(pwd_native)/${CERBERO_HOME}\"" > localconf.cbc
-    echo "local_sources = \"$(pwd_native)/${CERBERO_SOURCES}\"" >> localconf.cbc
-    if [[ $CONFIG == win??.cbc ]]; then
-        # Visual Studio 2017 build tools install path
-        echo 'vs_install_path = "C:/BuildTools"' >> localconf.cbc
-        echo 'vs_install_version = "vs15"' >> localconf.cbc
-    fi
-    cat localconf.cbc
-
-    time ./cerbero-uninstalled --self-update manifest.xml
-
-    # GitLab runner does not always wipe the image after each job, so do that
-    # to ensure we don't have any leftover data from a previous job such as
-    # a dirty builddir, or tarballs/pkg files, leftover files from an old
-    # cerbero commit, etc. Skip the things we actually need to keep.
-    time git clean -xdff -e cerbero_setup.sh -e manifest.xml -e localconf.cbc -e "${CERBERO_SOURCES}"
-}
-
-cerbero_script() {
-    show_ccache_sum
-
-    $CERBERO $CERBERO_ARGS show-config
-    $CERBERO $CERBERO_ARGS fetch-bootstrap --jobs=4
-    $CERBERO $CERBERO_ARGS fetch-package --jobs=4 --deps gstreamer-1.0
-    du -sch "${CERBERO_SOURCES}" || true
-
-    $CERBERO $CERBERO_ARGS fetch-cache --branch "${GST_UPSTREAM_BRANCH}"
-
-    if [[ -n ${CERBERO_OVERRIDDEN_DIST_DIR} && -d "${CERBERO_HOME}/dist/${ARCH}" ]]; then
-        mkdir -p "${CERBERO_OVERRIDDEN_DIST_DIR}"
-        time rsync -aH "${CERBERO_HOME}/dist/${ARCH}/" "${CERBERO_OVERRIDDEN_DIST_DIR}"
-    fi
-
-    $CERBERO $CERBERO_ARGS bootstrap --offline --system=no
-    fix_build_tools
-
-    cerbero_package_and_check
-}
-
-cerbero_deps_script() {
-    show_ccache_sum
-
-    $CERBERO $CERBERO_ARGS show-config
-    $CERBERO $CERBERO_ARGS fetch-bootstrap --jobs=4
-    $CERBERO $CERBERO_ARGS fetch-package --jobs=4 --deps gstreamer-1.0
-    $CERBERO $CERBERO_ARGS bootstrap --offline --system=no
-    $CERBERO $CERBERO_ARGS build-deps --offline \
-        gstreamer-1.0 gst-plugins-base-1.0 gst-plugins-good-1.0 \
-        gst-plugins-bad-1.0 gst-plugins-ugly-1.0 gst-rtsp-server-1.0 \
-        gst-libav-1.0 gst-devtools-1.0 gst-editing-services-1.0 libnice
-
-    if [[ -n ${CERBERO_OVERRIDDEN_DIST_DIR} ]]; then
-        mkdir -p "${CERBERO_HOME}/dist/${ARCH}"
-        time rsync -aH "${CERBERO_OVERRIDDEN_DIST_DIR}/" "${CERBERO_HOME}/dist/${ARCH}"
-    fi
-
-    # Check that the env var is set. Don't expand this protected variable by
-    # doing something silly like [[ -n ${CERBERO_...} ]] because it will get
-    # printed in the CI logs due to set -x
-    if env | grep -q -e CERBERO_PRIVATE_SSH_KEY; then
-        time $CERBERO $CERBERO_ARGS gen-cache --branch "${GST_UPSTREAM_BRANCH}"
-        time $CERBERO $CERBERO_ARGS upload-cache --branch "${GST_UPSTREAM_BRANCH}"
-    fi
-
-    cerbero_package_and_check
-}
-
-# Run whichever function is asked of us
-eval "$1"
diff --git a/subprojects/gst-ci/gitlab/ci_template.yml b/subprojects/gst-ci/gitlab/ci_template.yml
deleted file mode 100644
index cb8ae521d3..0000000000
--- a/subprojects/gst-ci/gitlab/ci_template.yml
+++ /dev/null
@@ -1,1427 +0,0 @@
-include:
-  - remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/7ea696055e322cc7aa4bcbe5422b56a198c4bdff/templates/ci-fairy.yml"
-
-stages:
-  - 'build docker'
-  - 'preparation'
-  - 'pre-build'
-  - 'build'
-  - 'test'
-  # Use the resulting binaries
-  - 'integrate'
-
-variables:
-  # Branch to track for modules that have no ref specified in the manifest
-  GST_UPSTREAM_BRANCH: 'master'
-  ORC_UPSTREAM_BRANCH: 'master'
-
-  ###
-  # IMPORTANT
-  # These are the version tags for the docker images the CI runs against.
-  # If you are hacking on them or need a them to rebuild, its enough
-  # to change any part of the string of the image you want.
-  ###
-  FEDORA_TAG:  '2021-06-30.0'
-  CERBERO_TAG: '2020-10-22.0'
-  ANDROID_TAG: '2020-10-22.0'
-  MANIFEST_TAG: '2020-10-22.0'
-  TEST_MANIFEST_TAG: '2020-10-22.0'
-  INDENT_TAG: '2020-10-22.0'
-  WINDOWS_TAG: "2021-09-09.0"
-
-  GST_UPSTREAM_REPO: 'gstreamer/gst-ci'
-
-  FEDORA_AMD64_SUFFIX:  'amd64/fedora'
-  CERBERO_AMD64_SUFFIX: 'amd64/cerbero-fedora'
-  ANDROID_AMD64_SUFFIX: 'amd64/android-fedora'
-  MANIFEST_AMD64_SUFFIX: 'amd64/build-manifest'
-  TEST_MANIFEST_AMD64_SUFFIX: 'amd64/test-manifest'
-  INDENT_AMD64_SUFFIX: 'amd64/gst-indent'
-  WINDOWS_AMD64_SUFFIX: 'amd64/windows'
-  WINDOWS_RUST_AMD64_SUFFIX: 'amd64/windows-rust'
-
-  FEDORA_IMAGE:   "$CI_REGISTRY_IMAGE/$FEDORA_AMD64_SUFFIX:$FEDORA_TAG-$GST_UPSTREAM_BRANCH"
-  FEDORA_DOCS_IMAGE: "registry.freedesktop.org/gstreamer/gst-ci/amd64/fedora:2020-07-03.0-master"
-  CERBERO_IMAGE:  "$CI_REGISTRY_IMAGE/$CERBERO_AMD64_SUFFIX:$CERBERO_TAG-$GST_UPSTREAM_BRANCH"
-  ANDROID_IMAGE:  "$CI_REGISTRY_IMAGE/$ANDROID_AMD64_SUFFIX:$ANDROID_TAG-$GST_UPSTREAM_BRANCH"
-  MANIFEST_IMAGE: "$CI_REGISTRY_IMAGE/$MANIFEST_AMD64_SUFFIX:$MANIFEST_TAG-$GST_UPSTREAM_BRANCH"
-  TEST_MANIFEST_IMAGE: "$CI_REGISTRY_IMAGE/$TEST_MANIFEST_AMD64_SUFFIX:$TEST_MANIFEST_TAG-$GST_UPSTREAM_BRANCH"
-  INDENT_IMAGE:   "$CI_REGISTRY_IMAGE/$INDENT_AMD64_SUFFIX:$INDENT_TAG-$GST_UPSTREAM_BRANCH"
-  WINDOWS_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH"
-  WINDOWS_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH"
-
-  RUST_MINIMUM_VERSION: '1.54.0'
-  RUST_LATEST_VERSION: '1.55.0'
-
-  WINDOWS_RUST_MINIMUM_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_RUST_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH-rust-$RUST_MINIMUM_VERSION"
-  WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/$WINDOWS_RUST_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH-rust-$RUST_MINIMUM_VERSION"
-
-  WINDOWS_RUST_LATEST_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_RUST_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH-rust-$RUST_LATEST_VERSION"
-  WINDOWS_RUST_LATEST_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/$WINDOWS_RUST_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH-rust-$RUST_LATEST_VERSION"
-
-  # Current windows image doesn't seem to be able to spawn procceses for reason,
-  # use a different image until this is debuged
-  # Running command 'c:/builds/alatiera/gst-ci/cerbero-build/build-tools/bin/meson --prefix=c:/builds/alatiera/gst-ci/cerbero-build/dist/msvc_x86_64 --libdir=lib -Ddebug=true --default-library=both -Doptimization=2 --backend=ninja --wrap-mode=nodownload -Db_vscrt=md --native-file c:/builds/alatiera/gst-ci/cerbero-build/sources/msvc_x86_64/gstreamer-1.0-1.19.0.1/_builddir/meson-native-file.txt -Dlibunwind=disabled -Ddbghelp=enabled -Dintrospection=disabled -Dexamples=disabled'
-  # failed to create process
-  CERBERO_WINDOWS_IMAGE: 'registry.freedesktop.org/gstreamer/gst-ci/amd64/windows:v13-master'
-
-  # Can't use $CI_* variables since we use this template in all repos, not just gst-ci
-  CERBERO_SCRIPT_URL: "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/${GST_UPSTREAM_BRANCH}/gitlab/cerbero_setup.sh"
-  WINDOWS_CONTAINER_SCRIPT_URL: "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/${GST_UPSTREAM_BRANCH}/docker/windows/container.ps1"
-
-  GIT_STRATEGY: none
-  MESON_BUILDTYPE_ARGS: --default-library=both
-  DEFAULT_MESON_ARGS: >
-    -Dlibnice:tests=disabled
-    -Dlibnice:examples=disabled
-    -Dopenh264:tests=disabled
-    -Dpygobject:tests=false
-    -Dpython=enabled
-    -Dlibav=enabled
-    -Dugly=enabled
-    -Dbad=enabled
-    -Ddevtools=enabled
-    -Dges=enabled
-    -Drtsp_server=enabled
-    -Dvaapi=enabled
-    -Dsharp=disabled
-
-  MESON_GST_WERROR: >
-    -Dgstreamer:werror=true
-    -Dgst-plugins-base:werror=true
-    -Dgst-plugins-good:werror=true
-    -Dgst-plugins-ugly:werror=true
-    -Dgst-plugins-bad:werror=true
-    -Dgst-rtsp-server:werror=true
-    -Dgst-libav:werror=true
-    -Dgst-examples:werror=true
-    -Dgst-editing-services:werror=true
-    -Dgst-docs:werror=true
-    -Dgst-omx:werror=true
-    -Dgst-devtools:werror=true
-    -Dgst-python:werror=true
-    -Dgstreamer-vaapi:werror=true
-    -Dgstreamer-sharp:werror=true
-
-  DEFAULT_CERBERO_ARGS: >
-    --variants werror
-    --timestamps
-
-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
-
-#
-# Global CI policy
-#
-# This can be used to configure global behaviour our our jobs.
-#
-default:
-  retry:
-    max: 2
-    when:
-      - 'runner_system_failure'
-      - 'stuck_or_timeout_failure'
-      - 'scheduler_failure'
-      - 'api_failure'
-  interruptible: true
-
-
-# Script to check if a docker image exists in the upstream registry
-# and if so copy it to the forked registry so we can use it
-#
-# This is copied/adapted from citemplates/templates/fedora.yml
-# https://gitlab.freedesktop.org/freedesktop/ci-templates/-/blob/96b621fe9f57ec2464f8d1a0940446afbf6c8f59/templates/fedora.yml
-.check_image: &check_image_exists |
-  # if-not-exists steps
-  set -x
-
-  if [[ -z "$GST_FORCE_REBUILD" ]]
-  then
-    # disable exit on failure
-    set +e
-
-    # check if our image is already in the current registry
-    # we store the sha of the digest and the layers
-    skopeo inspect docker://$LOCAL_IMAGE | jq '[.Digest, .Layers]' > local_sha
-
-    # check if our image is already in our gst-ci registry fork
-    skopeo inspect docker://$LOCAL_GST_CI_IMAGE | jq '[.Digest, .Layers]' > local_gst_ci_sha
-
-    # check if our image is already in the upstream registry
-    if [[ -z "$GST_UPSTREAM_REPO" ]]
-    then
-      echo "WARNING! Variable \$GST_UPSTREAM_REPO is undefined, cannot check for images"
-    else
-      skopeo inspect docker://$GST_UPSTREAM_IMAGE | jq '[.Digest, .Layers]' > upstream_sha
-    fi
-
-    # reenable exit on failure
-    set -e
-
-    # if the upstream repo has an image, ensure we use the same
-    if [ -s upstream_sha ]
-    then
-
-      echo "Checking if $LOCAL_IMAGE is up to date"
-      # ensure we use the same image from upstream
-      diff upstream_sha local_sha && exit 0 || true
-
-      echo "Copying image from gstreamer/gst-ci to local registry"
-      # copy the original image into the current project registry namespace
-      # we do 2 attempts with skopeo copy at most
-      skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD \
-                  docker://$GST_UPSTREAM_IMAGE \
-                  docker://$LOCAL_IMAGE || \
-      skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD \
-                  docker://$GST_UPSTREAM_IMAGE \
-                  docker://$LOCAL_IMAGE
-
-      exit 0
-    fi
-
-    set +x
-
-    # if the local ci fork repo has an image, ensure we use the same
-    if [ -s local_gst_ci_sha ]
-    then
-      echo "Checking if $LOCAL_GST_CI_IMAGE is up to date"
-      # ensure we use the same image from upstream
-      diff local_gst_ci_sha local_sha && exit 0 || true
-
-      echo "Copying image from $CI_PROJECT_NAMESPACE/gst-ci to local registry"
-      # copy the original image into the current project registry namespace
-      # we do 2 attempts with skopeo copy at most
-      skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD \
-                  docker://$LOCAL_GST_CI_IMAGE \
-                  docker://$LOCAL_IMAGE || \
-      skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD \
-                  docker://$LOCAL_GST_CI_IMAGE \
-                  docker://$LOCAL_IMAGE
-
-      exit 0
-    fi
-
-    # if we have a local image but none in the upstream repo, use our
-    if [ -s local_sha ]
-    then
-      echo "Using $LOCAL_IMAGE"
-      exit 0
-    fi
-  fi
-
-
-# Build docker images from Dockerfiles
-#
-# This is copied/adapted from citemplates/templates/fedora.yml
-# https://gitlab.freedesktop.org/freedesktop/ci-templates/-/blob/96b621fe9f57ec2464f8d1a0940446afbf6c8f59/templates/fedora.yml
-#
-# CITemplates builds uses buildah run/commit workflow to build the images which doesn't
-# fit us atm and our images need further adjustment to make use of it. Porting to
-# ci-templates is the next step though.
-#
-# All the documentation from citemplates should be applicable here, so please refer there
-.base:
-  image: "$CI_REGISTRY/freedesktop/ci-templates/buildah:2020-07-20.1"
-  variables:
-    STORAGE_DRIVER: 'vfs'
-    BUILDAH_FORMAT: 'docker'
-    BUILDAH_ISOLATION: 'chroot'
-
-    GIT_STRATEGY: fetch
-  script:
-    - export LOCAL_IMAGE="$CI_REGISTRY_IMAGE/$REPO_SUFFIX:$TAG"
-    - export LOCAL_GST_CI_IMAGE="$CI_REGISTRY/$CI_PROJECT_NAMESPACE/gst-ci/$REPO_SUFFIX:$TAG"
-    - export GST_UPSTREAM_IMAGE="$CI_REGISTRY/$GST_UPSTREAM_REPO/$REPO_SUFFIX:$TAG"
-
-    # check if the docker registry is enabled, else the variable will be missing
-    - |
-      if [[ -z "$CI_REGISTRY_IMAGE" ]]
-      then
-        echo "ERROR! Looks like your repository/fork has disabled Docker Registries."
-        echo "Pleae enable them by following the documentation from here:"
-        echo "https://docs.gitlab.com/ee/user/packages/container_registry/#enable-the-container-registry-for-your-project"
-        exit 1
-      fi
-
-    # Newer versions of podman/buildah try to set overlayfs mount options when
-    # using the vfs driver, and this causes errors.
-    - sed -i '/^mountopt =.*/d' /etc/containers/storage.conf
-
-    - *check_image_exists
-
-    # This part of the job should only ever be possible to be reach in a gst-ci fork
-    - |
-      if [[ "$CI_PROJECT_NAME" != 'gst-ci' ]]
-      then
-        echo "ERROR! Something is wrong!"
-        echo "This part of the job is supposed to be executed only in gst-ci forks, and its probably going to fail else"
-        exit 1
-      fi
-
-    - echo "Building image $LOCAL_IMAGE"
-
-    - >
-      buildah bud
-      --build-arg DEFAULT_BRANCH=$GST_UPSTREAM_BRANCH
-      --label ci.job_id=$CI_JOB_ID
-      --label pipeline.url=$CI_PIPELINE_URL
-      --label git.ref_name=$CI_COMMIT_REF_NAME
-      --label git.sha=$CI_COMMIT_SHA
-      --label gitlab.project_path=$CI_PROJECT_PATH
-      --label gitlab.project_url=$CI_PROJECT_URL
-      --label fdo.upstream-repo=$GST_UPSTREAM_REPO
-      -f $DOCKERFILE
-      -t $LOCAL_IMAGE
-      $CONTEXT_DIR
-
-    - buildah login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
-
-    # Sanity check
-    - |
-      if [ "$CI_PROJECT_PATH" = "gstreamer/gst-ci" ]; then
-        if [ "$LOCAL_IMAGE" != "$GST_UPSTREAM_IMAGE" ]; then
-          echo "ERROR!!! AAAAA! THE IMAGE URI DOES NOT MATCH THE EXPECTED UPSTREAM ONE"
-          echo $LOCAL_IMAGE
-          echo $GST_UPSTREAM_IMAGE
-          exit 1
-        fi
-      fi
-
-    -  buildah push $LOCAL_IMAGE
-
-fedora amd64 docker:
-  stage: "build docker"
-  variables:
-    REPO_SUFFIX: "$FEDORA_AMD64_SUFFIX"
-    TAG: "$FEDORA_TAG-$GST_UPSTREAM_BRANCH"
-
-    CONTEXT_DIR: "./docker/fedora/"
-    DOCKERFILE: "docker/fedora/Dockerfile"
-  extends: .base
-
-cerbero fedora amd64 docker:
-  stage: "build docker"
-  variables:
-    REPO_SUFFIX: "$CERBERO_AMD64_SUFFIX"
-    TAG: "$CERBERO_TAG-$GST_UPSTREAM_BRANCH"
-
-    CONTEXT_DIR: "docker/cerbero/"
-    DOCKERFILE: "docker/cerbero/Dockerfile-fedora"
-  extends: .base
-
-android docker:
-  stage: "build docker"
-  variables:
-    REPO_SUFFIX: "$ANDROID_AMD64_SUFFIX"
-    TAG: "$ANDROID_TAG-$GST_UPSTREAM_BRANCH"
-
-    CONTEXT_DIR: "docker/android/"
-    DOCKERFILE: "docker/android/Dockerfile"
-  extends: .base
-
-alpine amd64 manifest builder docker:
-  stage: "build docker"
-  variables:
-    REPO_SUFFIX: "$MANIFEST_AMD64_SUFFIX"
-    TAG: '$MANIFEST_TAG-$GST_UPSTREAM_BRANCH'
-
-    CONTEXT_DIR: "docker/build_manifest/"
-    DOCKERFILE: "docker/build_manifest/Dockerfile"
-  extends: .base
-
-gst-indent amd64 docker:
-  stage: "build docker"
-  variables:
-    REPO_SUFFIX: "$INDENT_AMD64_SUFFIX"
-    TAG: "$INDENT_TAG-$GST_UPSTREAM_BRANCH"
-
-    CONTEXT_DIR: "docker/indent/"
-    DOCKERFILE: "docker/indent/Dockerfile"
-  extends: .base
-
-windows amd64 docker:
-  stage: "build docker"
-  variables:
-    GIT_STRATEGY: fetch
-
-    # Unlike the buildah/linux jobs, this file
-    # needs to be relative to docker/windows/ subdir
-    # as it makes life easier in the powershell script
-    #
-    # We also don't need a CONTEXT_DIR var as its also
-    # hardcoded to be docker/windows/
-    DOCKERFILE: "docker/windows/Dockerfile"
-  tags:
-    - windows
-    - shell
-    - "1809"
-  script:
-    # We need to pass an array and to resolve the env vars, so we can't use a variable:
-    - $DOCKER_BUILD_ARGS = @("--build-arg", "DEFAULT_BRANCH=$GST_UPSTREAM_BRANCH")
-
-    - $env:WINDOWS_CONTAINER_SCRIPT_PATH = "$env:CI_PROJECT_DIR\container.ps1"
-    - echo "Fetching $env:WINDOWS_CONTAINER_SCRIPT_URL"
-    - Invoke-WebRequest -Uri $env:WINDOWS_CONTAINER_SCRIPT_URL -OutFile $env:WINDOWS_CONTAINER_SCRIPT_PATH
-
-    - "& $env:WINDOWS_CONTAINER_SCRIPT_PATH $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $WINDOWS_IMAGE $WINDOWS_UPSTREAM_IMAGE $DOCKERFILE"
-    - |
-      if (!($?)) {
-        echo "Failed to build the image"
-        Exit 1
-      }
-
-.windows rust docker build:
-  stage: 'build docker'
-  needs:
-    - job: 'windows amd64 docker'
-      artifacts: false
-  rules:
-    - if: '$CI_PROJECT_NAME == "gst-ci"'
-  variables:
-    GIT_STRATEGY: 'fetch'
-
-    # Unlike the buildah/linux jobs, this file
-    # needs to be relative to docker/windows/ subdir
-    # as it makes life easier in the powershell script
-    #
-    # We also don't need a CONTEXT_DIR var as its also
-    # hardcoded to be docker/windows/
-    DOCKERFILE: 'docker/windows/rust.Dockerfile'
-  tags:
-    - 'windows'
-    - 'shell'
-    - '1809'
-  script:
-    # We need to pass an array and to resolve the env vars, so we can't use a variable:
-    - $DOCKER_BUILD_ARGS = @("--build-arg", "DEFAULT_BRANCH=$GST_UPSTREAM_BRANCH", "--build-arg", "BASE_IMAGE=$WINDOWS_IMAGE", "--build-arg", "RUST_VERSION=$RUST_VERSION")
-
-    - $env:WINDOWS_CONTAINER_SCRIPT_PATH = "$env:CI_PROJECT_DIR\container.ps1"
-    - echo "Fetching $env:WINDOWS_CONTAINER_SCRIPT_URL"
-    - Invoke-WebRequest -Uri $env:WINDOWS_CONTAINER_SCRIPT_URL -OutFile $env:WINDOWS_CONTAINER_SCRIPT_PATH
-
-    - "& $env:WINDOWS_CONTAINER_SCRIPT_PATH $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $RUST_IMAGE $RUST_UPSTREAM_IMAGE $DOCKERFILE"
-    - |
-      if (!($?)) {
-        echo "Failed to build the image"
-        Exit 1
-      }
-
-windows rust amd64 docker latest stable:
-  extends: '.windows rust docker build'
-  variables:
-    RUST_IMAGE: !reference [variables, "WINDOWS_RUST_LATEST_IMAGE"]
-    RUST_UPSTREAM_IMAGE: !reference [variables, "WINDOWS_RUST_LATEST_UPSTREAM_IMAGE"]
-    RUST_VERSION: !reference [variables, "RUST_LATEST_VERSION"]
-
-windows rust amd64 docker minimum supported version:
-  extends: '.windows rust docker build'
-  variables:
-    RUST_IMAGE: !reference [variables, "WINDOWS_RUST_MINIMUM_IMAGE"]
-    RUST_UPSTREAM_IMAGE: !reference [variables, "WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE"]
-    RUST_VERSION: !reference [variables, "RUST_MINIMUM_VERSION"]
-
-#
-# Job to create the manifest.xml to used for our builds
-#
-manifest:
-  image: $MANIFEST_IMAGE
-  rules:
-    # Always have automatic pipeline for branchs in cerbero and docs
-    # cause they need to update artifacts, like the docs site or cerbero deps
-    - if: '$CI_PROJECT_PATH == "gstreamer/cerbero"'
-    - if: '$CI_PROJECT_PATH == "gstreamer/gst-docs"'
-
-    # If the MR is assigned to the Merge bot, trigger the pipeline automatically
-    - if: '$CI_MERGE_REQUEST_ASSIGNEES == "gstreamer-merge-bot"'
-    # When the assignee isn't the merge bot, require an explicit action to trigger the pipeline
-    # to avoid wasting CI resources
-    - if: '$CI_MERGE_REQUEST_ASSIGNEES != "gstreamer-merge-bot"'
-      when: 'manual'
-      allow_failure: false
-    # If this matches, it means the pipeline is running against either the main
-    # or a stable branch, so make it manual
-    - if: '$CI_COMMIT_BRANCH == $GST_UPSTREAM_BRANCH'
-      when: 'manual'
-      allow_failure: false
-
-  stage: 'preparation'
-  script:
-    - cd /gst-ci
-    - gitlab/build_manifest.py --self-update
-    - gitlab/build_manifest.py ${CI_PROJECT_DIR}/manifest.xml
-    - cat ${CI_PROJECT_DIR}/manifest.xml
-  artifacts:
-    expire_in: "7 days"
-    paths:
-      - "manifest.xml"
-
-#
-# gst-indent!!
-#
-gst indent:
-  image: $INDENT_IMAGE
-  stage: 'preparation'
-  variables:
-    GIT_STRATEGY: 'fetch'
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(gstreamer-sharp|gst-integration-testsuites|cerbero|gst-docs)$/'
-  script:
-    # man indent. grep RETURN VALUE, grab a beer on my behalf...
-    - indent --version || true
-    - |
-      filter_cmd=("cat")
-      if test -f ".indentignore"; then
-          filter_args=()
-          while read -r line; do
-              if test -n "$line"; then
-                  filter_args+=("-e" "$line")
-              fi
-          done < ".indentignore"
-          if [[ ${#filter_args[@]} -gt 0 ]]; then
-              filter_cmd=("grep" "-v" "${filter_args[@]}")
-          fi
-      fi
-      find . -name '*.c' | "${filter_cmd[@]}" | xargs -d '\n' gst-indent
-    - |
-      if git diff --quiet; then
-          echo "Code is properly formatted"
-      else
-          git diff --color=always
-          echo 'style diverges, please run gst-indent first'
-          exit 1
-      fi
-
-#
-# Check "allow-edit" checkbox on merge requests with ci-fairy
-#
-check allow-edit:
-  extends: '.fdo.ci-fairy'
-  needs: []
-  stage: 'preparation'
-  variables:
-    GIT_STRATEGY: 'none'
-  script:
-    - ci-fairy check-merge-request --require-allow-collaboration
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-
-#
-# gst-build setup templates
-#
-.gst_build_template: &gst_build
-  - echo $MESON_ARGS
-  # Sometimes, gitlab-runner want to reuse
-  # existing docker volumes without cleaning them up...
-  # Make sure the docker volume is clean
-  - rm -rf gst-build || true
-  - rm -rf meson-logs || true
-  - rm -rf validate-logs || true
-
-  - curl -L -o clone_manifest_ref.py "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/${GST_UPSTREAM_BRANCH}/gitlab/clone_manifest_ref.py"
-  - python3 clone_manifest_ref.py --manifest manifest.xml --project gst-build --destination gst-build
-  - cd gst-build/
-  # only copy immediate directories. We don't want to modify .wrap files
-  - find /gst-build/subprojects/ -mindepth 1 -maxdepth 1 -type d -exec cp -r \{\} subprojects/ \;
-
-  # Reset the state of the subprojects to what gst-build expects
-  - meson subprojects update --reset
-  - ./git-update --no-interaction --manifest="${CI_PROJECT_DIR}/manifest.xml"
-
-  - meson build/ $MESON_ARGS
-  - ninja -C build/
-  - ccache --show-stats
-
-.gst_build_ccache_vars:
-  variables:
-    CCACHE_COMPILERCHECK: 'content'
-    CCACHE_COMPRESS: 'true'
-    CCACHE_BASEDIR: '/cache/gstreamer/gst-build'
-    CCACHE_DIR: '/cache/gstreamer/gst-build/ccache/'
-    # shared across everything really
-    CCACHE_MAXSIZE: '10G'
-    CARGO_HOME: '/cache/gstreamer/cargo'
-
-.simple_fedora_build: &simple_build >-
-  ${DEFAULT_MESON_ARGS}
-  -Dsharp=enabled
-  -Domx=enabled
-  -Dgst-omx:target=generic
-  -Ddoc=disabled
-  -Drs=disabled
-  ${MESON_BUILDTYPE_ARGS}
-  ${MESON_GST_WERROR}
-
-.build:
-  stage: 'build'
-  extends:
-    - '.gst_build_ccache_vars'
-  needs:
-    - "manifest"
-  # Taking into account the slowest shared runner + time needed to upload the binaries to artifacts
-  # Also need to take into account I/O of pulling docker images and uploading artifacts
-  timeout: '45min'
-  variables:
-    MESON_ARGS: "${DEFAULT_MESON_ARGS} ${MESON_BUILDTYPE_ARGS} ${MESON_GST_WERROR}"
-  rules:
-    - if: '$CI_PROJECT_NAME != "cerbero"'
-  script:
-    *gst_build
-  after_script:
-    - mv gst-build/build/meson-logs/ meson-logs
-    # Cleanup everything else to reduce the size
-    # of the docker volume we leave behind
-    - rm -rf gst-build
-  artifacts:
-    expire_in: "7 days"
-    when: "always"
-    paths:
-      - 'meson-logs/'
-      - 'manifest.xml'
-
-.build fedora x86_64:
-  extends: '.build'
-  image: $FEDORA_IMAGE
-  variables:
-    MESON_ARGS: *simple_build
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-omx|gst-plugins-rs)$/'
-
-build nodebug fedora x86_64:
-  extends: '.build'
-  image: $FEDORA_IMAGE
-  variables:
-    MESON_ARGS: "${DEFAULT_MESON_ARGS} -Dsharp=enabled -Dgstreamer:gst_debug=false -Domx=enabled -Dgst-omx:target=generic ${MESON_BUILDTYPE_ARGS} ${MESON_GST_WERROR}"
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-docs|gst-integration-testsuites|gst-omx|gst-plugins-rs)$/'
-
-build static fedora x86_64:
-  extends: '.build fedora x86_64'
-  variables:
-    MESON_BUILDTYPE_ARGS: "--default-library=static -Dintrospection=disabled -Ddoc=disabled"
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-docs|gst-integration-testsuites|gst-omx|gst-plugins-rs)$/'
-
-build static nodebug fedora x86_64:
-  extends: 'build nodebug fedora x86_64'
-  variables:
-    MESON_BUILDTYPE_ARGS: "--default-library=static -Dintrospection=disabled -Ddoc=disabled"
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-docs|gst-integration-testsuites|gst-omx|gst-plugins-rs)$/'
-
-build clang fedora x86_64:
-  extends: '.build fedora x86_64'
-  variables:
-    CC: 'ccache clang'
-    CXX: 'ccache clang++'
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-docs|gst-integration-testsuites|gst-omx|gst-plugins-rs)$/'
-
-.test:
-  stage: 'test'
-  extends:
-    - '.gst_build_ccache_vars'
-  needs:
-    - "manifest"
-  variables:
-    MESON_ARGS: *simple_build
-
-    # Disable colored output to avoid weird rendering issues
-    GST_DEBUG_NO_COLOR: "true"
-    CI_ARTIFACTS_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/validate-logs/"
-    GST_VALIDATE_LAUNCHER_FORCE_COLORS: "true"
-    TIMEOUT_FACTOR: "2"
-    CARGO_HOME: "/cache/gstreamer/cargo"
-    # Enable the fault handler so we get backtraces on segfaults.
-    # any non-empty string will do
-    PYTHONFAULTHANDLER: "enabled"
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-examples|gst-docs)$/'
-  script:
-    - *gst_build
-
-    - echo "-> Running ${TEST_SUITE}"
-    - >
-      ./gst-uninstalled.py
-      gst-validate-launcher ${TEST_SUITE}
-      --dump-on-failure
-      --mute
-      --shuffle
-      --no-display
-      --meson-no-rebuild
-      --timeout-factor "${TIMEOUT_FACTOR}"
-      --fail-on-testlist-change
-      -l "${CI_PROJECT_DIR}/validate-logs/"
-      --xunit-file "${CI_PROJECT_DIR}/validate-logs/xunit.xml"
-      ${EXTRA_VALIDATE_ARGS}
-  after_script:
-    - mv gst-build/build/meson-logs/ meson-logs
-    # Cleanup everything else to reduce the size
-    # of the docker volume we leave behind
-    - rm -rf gst-build
-  artifacts:
-    expire_in: '14 days'
-    when: always
-    paths:
-      - 'meson-logs/'
-      - 'validate-logs'
-      - 'manifest.xml'
-    reports:
-      junit:
-        - "validate-logs/*.xml"
-
-.test fedora x86_64:
-  image: $FEDORA_IMAGE
-  extends: '.test'
-  tags: ['gstreamer']
-
-check fedora:
-  extends: '.test fedora x86_64'
-  variables:
-    TEST_SUITE: "check.gst*"
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-docs|gst-integration-testsuites|gst-omx|gst-plugins-rs)$/'
-
-integration testsuites fedora:
-  extends: '.test fedora x86_64'
-  parallel: 4
-  variables:
-    EXTRA_VALIDATE_ARGS: "--timeout-factor=2 --retry-on-failures --check-bugs --parts=${CI_NODE_TOTAL} --part-index=${CI_NODE_INDEX}"
-    TEST_SUITE: "validate ges"
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-docs|gst-examples|gst-omx|gstreamer-sharp|gst-plugins-rs)$/'
-
-# gstreamer-full:
-# introspection has been disabled as the static build does not support it.
-# See https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/162
-gstreamer-full:
-  extends: 'build static fedora x86_64'
-  stage: integrate
-  variables:
-    MESON_ARGS: >
-      --default-library=static
-      -Dintrospection=disabled
-      $MESON_GST_WERROR
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gst-build|gst-ci)$/'
-
-  script:
-  - *gst_build
-  - meson test -C build -v test-gst-full
-  artifacts:
-    expire_in: "7 days"
-    when: "always"
-    paths:
-      - 'meson-logs/'
-
-gstreamer-full-minimal:
-  extends: 'build static fedora x86_64'
-  stage: integrate
-  variables:
-    MESON_ARGS: >
-      --default-library=static
-      -Dauto_features=disabled
-      -Dgstreamer:check=enabled
-      -Dtests=enabled
-      -Dgst-plugins-base:alsa=enabled
-      -Dgst-plugins-base:typefind=enabled
-      -Dgst-plugins-base:pbtypes=enabled
-      -Dgst-full-elements=coreelements:filesrc,fakesink,identity,input-selector
-      -Dgst-full-typefind-functions=typefindfunctions:wav,flv
-      -Dgst-full-device-providers=alsa:alsadeviceprovider
-      -Dgst-full-dynamic-types=pbtypes:video_multiview_flagset
-      $MESON_GST_WERROR
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gst-build|gst-ci)$/'
-
-  script:
-  - *gst_build
-  - meson test -C build -v test-gst-full
-  - meson test -C build test-gst-full-features --test-args "-e filesrc,identity,fakesink -E filesink,capsfilter -t audio/x-wav -T video/vivo -d alsadeviceprovider -D v4l2deviceprovider -l GstVideoMultiviewFlagsSet"
-  - strip build/libgstreamer-full-1.0.so
-  - ls -l build/libgstreamer-full-1.0.so
-  artifacts:
-    expire_in: "7 days"
-    when: "always"
-    paths:
-      - 'meson-logs/'
-
-# Valgrind
-.valgrind fedora x86_64:
-  extends: '.test fedora x86_64'
-  stage: 'test'
-  variables:
-    EXTRA_VALIDATE_ARGS: "--valgrind"
-
-valgrind core:
-  extends: '.valgrind fedora x86_64'
-  variables:
-    TEST_SUITE: "check.gstreamer\\..*"
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gstreamer|gst-ci|gst-devtools)$/'
-
-valgrind base:
-  extends: '.valgrind fedora x86_64'
-  variables:
-    TEST_SUITE: "check.gst-plugins-base\\..*"
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gstreamer|gst-plugins-base|gst-ci|gst-devtools)$/'
-
-valgrind good:
-  extends: '.valgrind fedora x86_64'
-  variables:
-    TEST_SUITE: "check.gst-plugins-good\\..*"
-    # take longer time due to splitmux unit test
-    TIMEOUT_FACTOR: "4"
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gstreamer|gst-plugins-base|gst-plugins-good|gst-ci|gst-devtools)$/'
-
-valgrind ugly:
-  extends: '.valgrind fedora x86_64'
-  variables:
-    TEST_SUITE: "check.gst-plugins-ugly\\..*"
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gstreamer|gst-plugins-base|gst-plugins-ugly|gst-ci|gst-devtools)$/'
-
-valgrind bad:
-  extends: '.valgrind fedora x86_64'
-  variables:
-    TEST_SUITE: "check.gst-plugins-bad\\..*"
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gstreamer|gst-plugins-base|gst-plugins-good|gst-plugins-bad|gst-ci|gst-devtools)$/'
-
-valgrind ges:
-  extends: '.valgrind fedora x86_64'
-  variables:
-    TEST_SUITE: "check.gst-editing-services\\..*"
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gstreamer|gst-plugins-base|gst-plugins-good|gst-editing-services|gst-ci|gst-devtools)$/'
-
-# Template for Cerbero GStreamer Build
-#
-# Parameters:
-# CONFIG: The name of the configuration file to use
-# ARCH: The cerbero <os>_<cpu> (used in cache key)
-#
-.cerbero:
-  stage: "build"
-  image: $CERBERO_IMAGE
-  rules:
-    - if: '$CI_PROJECT_NAME == "cerbero"'
-  needs:
-    - "manifest"
-  # Ensure that the runners it will be executed on
-  # will have plenty of space for the cache
-  tags: ['gstreamer']
-  timeout: '3h'
-  variables:
-    CCACHE_COMPILERCHECK: "content"
-    CCACHE_COMPRESS: "true"
-    CCACHE_BASEDIR: "/cache/gstreamer/cerbero/"
-    CCACHE_DIR: "/cache/gstreamer/cerbero/ccache/"
-    # shared across everything really
-    CCACHE_MAXSIZE: "50G"
-
-    CERBERO_HOME: "cerbero-build"
-    CERBERO_SOURCES: "cerbero-sources"
-    CERBERO_ARGS: "${DEFAULT_CERBERO_ARGS}"
-    CERBERO: "./cerbero-uninstalled -c config/${CONFIG} -c localconf.cbc -m manifest.xml"
-    CERBERO_PACKAGE_ARGS: "-t"
-    CERBERO_RUN_WRAPPER: "" # 'wine' on cross-winXX
-    CERBERO_RUN_SUFFIX: "" # '.exe' on cross-winXX
-    HAVE_CCACHE: "yes"
-    # used by macos packages as we only ever install to a fixed directory
-    CERBERO_OVERRIDDEN_DIST_DIR: ""
-    # location where the cerbero git repo is stored on the image
-    CERBERO_HOST_DIR: "/cerbero/"
-  before_script:
-    - echo "Fetching ${CERBERO_SCRIPT_URL}"
-    - curl -L -o cerbero_setup.sh "${CERBERO_SCRIPT_URL}"
-    - chmod +x cerbero_setup.sh
-    - ./cerbero_setup.sh cerbero_before_script
-  script:
-    - ./cerbero_setup.sh cerbero_script
-  cache:
-    key: "${CI_JOB_NAME}"
-    paths:
-      - "${CERBERO_SOURCES}"
-  artifacts:
-    name: "${CI_JOB_NAME}_${CI_COMMIT_SHA}"
-    expire_in: '5 days'
-    when: 'always'
-    paths:
-      - "manifest.xml"
-      - "${CERBERO_HOME}/logs"
-      - "*.tar.*"
-
-.build windows:
-  image: $WINDOWS_IMAGE
-  stage: 'build'
-  needs:
-    - 'manifest'
-  tags:
-    - 'docker'
-    - 'windows'
-    - '1809'
-  timeout: '45min'
-  variables:
-    MESON_ARGS: >
-      ${DEFAULT_MESON_ARGS}
-      -Dpython=disabled
-      -Dlibav=disabled
-      -Dvaapi=disabled
-      -Dgst-plugins-base:pango=enabled
-      -Dgst-plugins-good:cairo=enabled
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-docs|gst-integration-testsuites|gst-omx|gst-plugins-rs|gstreamer-vaapi)$/'
-  script:
-    # Sometimes there's seems to be an existing gst-build clone that comes either from the ether or
-    # from a previous job due to some gitlab bug or implicit behavior?
-    # So let's always check and clear it out if its there
-    # https://gitlab.freedesktop.org/tpm/gstreamer-sharp/-/jobs/1672137
-    - if (Test-Path $env:CI_PROJECT_DIR/gst-build) { Remove-Item -Recurse -Force $env:CI_PROJECT_DIR/gst-build }
-
-    # Make sure powershell exists on errors
-    # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-6
-    - $ErrorActionPreference = "Stop"
-
-    - Invoke-WebRequest -Uri "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/$env:GST_UPSTREAM_BRANCH/gitlab/clone_manifest_ref.py" -OutFile $env:CI_PROJECT_DIR/clone_manifest_ref.py
-    - python clone_manifest_ref.py --manifest manifest.xml --project gst-build --destination $env:CI_PROJECT_DIR/gst-build
-    - cd $env:CI_PROJECT_DIR/gst-build
-
-    # Update meson
-    # FIXME: remove this once the windows image is rebuilt/updated
-    - pip install -U meson==0.56.2
-
-    - cp -r C:/subprojects/* subprojects/
-    - cd $env:CI_PROJECT_DIR/gst-build
-    # Reset the subprojects to invalidate the cache if needed
-    - meson subprojects update --reset
-    # Run the git-update script and feed it the manifest to setup the environment
-    - python git-update --no-interaction --manifest=$env:CI_PROJECT_DIR/manifest.xml
-
-    # For some reason, options are separated by newline instead of space, so we
-    # have to replace them first.
-    - $env:MESON_ARGS = $env:MESON_ARGS.replace("`n"," ")
-    # Gitlab executes PowerShell in docker, but VsDevCmd.bat is a batch script.
-    # Environment variables substitutions is done by PowerShell before calling
-    # cmd.exe, that's why we use $env:FOO instead of %FOO%
-    - cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH &&
-        meson build $env:MESON_ARGS &&
-        ninja -C build"
-  artifacts:
-    expire_in: "7 days"
-    when: "always"
-    paths:
-      - 'gst-build/build/meson-logs/'
-
-build vs2017 amd64:
-  extends: '.build windows'
-  variables:
-    ARCH: 'amd64'
-
-build vs2017 x86:
-  extends: '.build windows'
-  variables:
-    ARCH: 'x86'
-
-build msys2 :
-  extends: '.build windows'
-  timeout: '60min'
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-docs|gst-integration-testsuites|gst-omx|gst-plugins-rs|gstreamer-vaapi)$/'
-      allow_failure: true
-      when: 'manual'
-  script:
-    # Sometimes there's seems to be an existing gst-build clone that comes either from the ether or
-    # from a previous job due to some gitlab bug or implicit behavior?
-    # So let's always check and clear it out if its there
-    # https://gitlab.freedesktop.org/tpm/gstreamer-sharp/-/jobs/1672137
-    - if (Test-Path $env:CI_PROJECT_DIR/gst-build) { Remove-Item -Recurse -Force $env:CI_PROJECT_DIR/gst-build }
-
-    # Make sure powershell exists on errors
-    # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-6
-    - $ErrorActionPreference = "Stop"
-
-    # For some reason docker build hangs if this is included in the image, needs more troubleshooting
-    - $env:PATH += ';C:\msys64\usr\bin;C:\msys64\mingw64\bin;C:\msys64\mingw32\bin'
-    # Copied from https://github.com/msys2/setup-msys2/blob/master/main.js#L98
-    - C:\msys64\usr\bin\bash -c "pacman-key --init && pacman-key --populate msys2 && pacman-key --refresh-keys || true"
-    - C:\msys64\usr\bin\bash -c "sed -i 's/^CheckSpace/#CheckSpace/g' /etc/pacman.conf"
-    - echo "Updating MSYS2"
-    - C:\msys64\usr\bin\bash -c "pacman -Syuu --noconfirm || echo Update failed, ignoring"
-    - echo "Killing all MSYS2 processes"
-    - taskkill /F /FI "MODULES eq msys-2.0.dll"
-    - echo "Completing MSYS2 update"
-    - C:\msys64\usr\bin\bash -c "pacman -Suu --noconfirm"
-    - echo "Installing needed MSYS2 packages"
-    - C:\msys64\usr\bin\bash -c "pacman -Sy --noconfirm --needed mingw-w64-x86_64-toolchain ninja"
-
-    - Invoke-WebRequest -Uri "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/$env:GST_UPSTREAM_BRANCH/gitlab/clone_manifest_ref.py" -OutFile $env:CI_PROJECT_DIR/clone_manifest_ref.py
-    - python clone_manifest_ref.py --manifest manifest.xml --project gst-build --destination $env:CI_PROJECT_DIR/gst-build
-    - cd $env:CI_PROJECT_DIR/gst-build
-
-    - cp -r C:\subprojects\* subprojects\
-
-    # Run the git-update script and feed it the manifest to setup the environment
-    - cd $env:CI_PROJECT_DIR/gst-build; python git-update --no-interaction --manifest=$env:CI_PROJECT_DIR/manifest.xml
-    # For some reason, options are separated by newline instead of space, so we
-    # have to replace them first.
-    - $env:MESON_ARGS = $env:MESON_ARGS.replace("`n"," ")
-    # Replace forward slashes with backwards so bash doesn't complain
-    - $env:_PROJECT_DIR = $env:CI_PROJECT_DIR.replace('\','/')
-    - C:\msys64\usr\bin\bash -c "cd $env:_PROJECT_DIR/gst-build &&
-        meson build $env:MESON_ARGS &&
-        ninja -C build"
-
-
-# Template for Cerbero GStreamer Deps
-#
-# This template is used by cerbero/ project to pre-built the GStreamer
-# dependencies. When available, the .cerbero jobs will download this artifact
-# in order to speed up the build.
-#
-# Parameters:
-# CONFIG: The name of the configuration file to use
-# ARCH: The cerbero <os>_<cpu> (used in cache key)
-#
-# Produce an artifact with the dist/ and .cache along
-# with the associated build-tools.
-.cerbero deps:
-  extends: .cerbero
-  rules:
-    - if: '$CI_PROJECT_NAME == "cerbero"'
-  script:
-    - ./cerbero_setup.sh cerbero_deps_script
-
-#
-# Cerbero Linux X86_64 build
-#
-cerbero deps fedora x86_64:
-  extends: '.cerbero deps'
-  variables:
-    CONFIG: "linux.config"
-    ARCH: "linux_x86_64"
-
-build cerbero fedora x86_64:
-  extends: '.cerbero'
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-omx|gstreamer-vaapi|gst-docs|gst-integration-testsuites|gst-plugins-rs)$/'
-  variables:
-    CONFIG: "linux.config"
-
-#
-# Cerbero Android Universal build
-#
-.cerbero cross-android universal:
-  variables:
-    CONFIG: "cross-android-universal.cbc"
-    ARCH: "android_universal"
-  artifacts:
-    name: "${CI_JOB_NAME}_${CI_COMMIT_SHA}"
-    expire_in: '5 days'
-    when: 'always'
-    paths:
-      - "manifest.xml"
-      - "${CERBERO_HOME}/logs"
-      - "*[0-9].tar.*"
-
-cerbero deps cross-android universal:
-  extends:
-    - '.cerbero deps'
-    - '.cerbero cross-android universal'
-
-build cerbero cross-android universal:
-  extends:
-    - '.cerbero'
-    - '.cerbero cross-android universal'
-  rules:
-    - if: '$CI_MERGE_REQUEST_IID && $CI_PROJECT_NAME == "gst-docs"'
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-docs|gst-omx|gstreamer-vaapi|gst-integration-testsuites|gst-plugins-rs)$/'
-
-#
-# Cerbero Cross Windows builds
-#
-cerbero deps cross-windows x86:
-  extends: '.cerbero deps'
-  variables:
-    CONFIG: "cross-win32.cbc"
-    ARCH: "mingw_x86"
-
-build cerbero cross win32:
-  extends: '.cerbero'
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-docs|gst-omx|gstreamer-vaapi|gst-docs|gst-integration-testsuites|gst-plugins-rs)$/'
-  variables:
-    CONFIG: "cross-win32.cbc"
-    CERBERO_RUN_WRAPPER: "wine"
-    CERBERO_RUN_SUFFIX: ".exe"
-
-
-cerbero deps cross-windows x86_64:
-  extends: '.cerbero deps'
-  variables:
-    CONFIG: "cross-win64.cbc"
-    ARCH: "mingw_x86_64"
-
-build cerbero cross win64:
-  extends: '.cerbero'
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-omx|gstreamer-vaapi|gst-docs|gst-integration-testsuites|gst-plugins-rs)$/'
-  variables:
-    CONFIG: "cross-win64.cbc"
-    CERBERO_RUN_WRAPPER: "wine"
-    CERBERO_RUN_SUFFIX: ".exe"
-
-#
-# Build an Android App using the android binaries
-#
-.cross-android universal examples:
-  image: $ANDROID_IMAGE
-  stage: 'integrate'
-  variables:
-    EXAMPLES_HOME: ${CI_PROJECT_DIR}/examples
-    GSTREAMER_ROOT_ANDROID: ${CI_PROJECT_DIR}/examples/cerbero-android-universal
-  script:
-    - mkdir -p ${EXAMPLES_HOME}/outputs
-    - curl -L -o clone_manifest_ref.py https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/${GST_UPSTREAM_BRANCH}/gitlab/clone_manifest_ref.py
-    - chmod +x clone_manifest_ref.py
-    - ./clone_manifest_ref.py --manifest manifest.xml --project gst-examples --destination ${EXAMPLES_HOME}/gst-examples
-    - ./clone_manifest_ref.py --manifest manifest.xml --project gst-docs --destination ${EXAMPLES_HOME}/gst-docs
-    - rm clone_manifest_ref.py
-
-    # extract our binaries
-    - rm -f gstreamer-1.0-android-universal-*-runtime.tar.*
-    - mkdir ${GSTREAMER_ROOT_ANDROID}
-    - time tar -C ${GSTREAMER_ROOT_ANDROID} -xf gstreamer-1.0-android-universal-*.tar.*
-
-    # gst-examples - player
-    - chmod +x ${EXAMPLES_HOME}/gst-examples/playback/player/android/gradlew
-    - ${EXAMPLES_HOME}/gst-examples/playback/player/android/gradlew --no-daemon --project-dir ${EXAMPLES_HOME}/gst-examples/playback/player/android assembleDebug
-    - cp ${EXAMPLES_HOME}/gst-examples/playback/player/android/app/build/outputs/apk/debug/*.apk ${EXAMPLES_HOME}/outputs/
-
-    # gst-examples - vulkan
-    - chmod +x ${EXAMPLES_HOME}/gst-examples/vulkan/android/gradlew
-    - ${EXAMPLES_HOME}/gst-examples/vulkan/android/gradlew --no-daemon --project-dir ${EXAMPLES_HOME}/gst-examples/vulkan/android assembleDebug
-    - cp ${EXAMPLES_HOME}/gst-examples/vulkan/android/build/outputs/apk/debug/*.apk ${EXAMPLES_HOME}/outputs/
-
-    # gst-docs android tutorials
-    - chmod +x ${EXAMPLES_HOME}/gst-docs/examples/tutorials/android/gradlew
-    - ${EXAMPLES_HOME}/gst-docs/examples/tutorials/android/gradlew --no-daemon --project-dir ${EXAMPLES_HOME}/gst-docs/examples/tutorials/android assembleDebug
-    - cp ${EXAMPLES_HOME}/gst-docs/examples/tutorials/android/android-tutorial-*/build/outputs/apk/debug/*.apk ${EXAMPLES_HOME}/outputs/
-  after_script:
-    - rm -rf ${GSTREAMER_ROOT_ANDROID}
-    - rm -rf ${EXAMPLES_HOME}/gst-examples ${EXAMPLES_HOME}/gst-docs
-  artifacts:
-    name: "${CI_JOB_NAME}_${CI_COMMIT_SHA}"
-    expire_in: '5 days'
-    when: 'always'
-    paths:
-      - "manifest.xml"
-      - "${EXAMPLES_HOME}/outputs"
-
-cross-android universal examples:
-  extends: ".cross-android universal examples"
-  rules:
-    - if: '$CI_MERGE_REQUEST_IID && $CI_PROJECT_NAME == "gst-docs"'
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-docs|gst-omx|gstreamer-vaapi|gst-integration-testsuites|gst-plugins-rs)$/'
-  needs:
-    - "build cerbero cross-android universal"
-
-cerbero cross-android universal examples:
-  extends: ".cross-android universal examples"
-  rules:
-    - if: '$CI_PROJECT_NAME == "cerbero"'
-  needs:
-    - "cerbero deps cross-android universal"
-
-#
-# Cerbero macOS X86_64 build
-#
-.cerbero macos x86_64:
-  variables:
-    ARCH: "darwin_x86_64"
-    CONFIG: "osx-x86-64.cbc"
-    CERBERO_PACKAGE_ARGS: ""
-    HAVE_CCACHE: ""
-    CERBERO_OVERRIDDEN_DIST_DIR: "/Library/Frameworks/GStreamer.framework/Versions/1.0"
-    CERBERO_HOST_DIR: "/Users/gst-ci/cerbero/"
-  tags:
-    - gst-macos-11.1
-  artifacts:
-    name: "${CI_JOB_NAME}_${CI_COMMIT_SHA}"
-    expire_in: '5 days'
-    when: 'always'
-    paths:
-      - "manifest.xml"
-      - "${CERBERO_HOME}/logs"
-      - "gstreamer-1.0-1.*.pkg"
-      - "gstreamer-1.0-devel-1.*.pkg"
-
-cerbero deps macos x86_64:
-  extends:
-    - '.cerbero deps'
-    - '.cerbero macos x86_64'
-
-build cerbero macos x86_64:
-  extends:
-    - '.cerbero'
-    - '.cerbero macos x86_64'
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-docs|gst-omx|gst-sharp|gstreamer-vaapi|gst-integration-testsuites|gst-plugins-rs)$/'
-
-#
-# Cerbero macOS Universal build
-#
-.cerbero cross-macos universal:
-  variables:
-    ARCH: "darwin_universal"
-    CONFIG: "cross-macos-universal.cbc"
-    CERBERO_PACKAGE_ARGS: ""
-    HAVE_CCACHE: ""
-    CERBERO_HOST_DIR: "/Users/gst-ci/cerbero/"
-  tags:
-    - gst-macos-11.1
-  artifacts:
-    name: "${CI_JOB_NAME}_${CI_COMMIT_SHA}"
-    expire_in: '5 days'
-    when: 'always'
-    paths:
-      - "manifest.xml"
-      - "${CERBERO_HOME}/logs"
-      - "gstreamer-1.0-1.*.pkg"
-      - "gstreamer-1.0-devel-1.*.pkg"
-
-cerbero deps cross-macos universal:
-  extends:
-    - '.cerbero deps'
-    - '.cerbero cross-macos universal'
-
-build cerbero cross-macos universal:
-  extends:
-    - '.cerbero'
-    - '.cerbero cross-macos universal'
-  script:
-    # We have build-tools that have fixed paths pointing to the upstream
-    # repository.  We need to point
-    - pwd
-    - mkdir -p "../../gstreamer"
-    - ln -sf "$(pwd)" "../../gstreamer/cerbero"
-    - mkdir -p "../../${CI_PROJECT_NAMESPACE}"
-    - ln -sf "$(pwd)" "../../${CI_PROJECT_NAMESPACE}/cerbero"
-
-    - ./cerbero_setup.sh cerbero_script
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-docs|gst-omx|gst-sharp|gstreamer-vaapi|gst-integration-testsuites|gst-plugins-rs)$/'
-
-#
-# Cerbero iOS build
-#
-.cerbero cross-ios universal:
-  variables:
-    ARCH: "ios_universal"
-    CONFIG: "cross-ios-universal.cbc"
-    CERBERO_ARGS: "${DEFAULT_CERBERO_ARGS} -v nowerror"
-    CERBERO_PACKAGE_ARGS: ""
-    HAVE_CCACHE: ""
-    CERBERO_HOST_DIR: "/Users/gst-ci/cerbero/"
-  tags:
-    - gst-ios-14.3
-  artifacts:
-    name: "${CI_JOB_NAME}_${CI_COMMIT_SHA}"
-    expire_in: '5 days'
-    when: 'always'
-    paths:
-      - "manifest.xml"
-      - "${CERBERO_HOME}/logs"
-      - "gstreamer-1.0-*-ios-universal.pkg"
-
-cerbero deps cross-ios universal:
-  extends:
-    - '.cerbero deps'
-    - '.cerbero cross-ios universal'
-
-build cerbero cross-ios universal:
-  extends:
-    - '.cerbero'
-    - '.cerbero cross-ios universal'
-  rules:
-    - if: '$CI_MERGE_REQUEST_IID && $CI_PROJECT_NAME == "gst-docs"'
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-docs|gst-omx|gst-sharp|gstreamer-vaapi|gst-integration-testsuites|gst-plugins-rs)$/'
-
-documentation:
-  image: $FEDORA_DOCS_IMAGE
-  extends:
-    - '.gst_build_ccache_vars'
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-integration-testsuites|gst-plugins-rs|gst-python)$/'
-  needs:
-    - "manifest"
-  stage: integrate
-  variables:
-    MESON_ARGS: *simple_build
-    MESON_BUILDTYPE_ARGS: "-Ddoc=enabled"
-    CI_ARTIFACTS_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/"
-  script:
-  - pip3 install --upgrade hotdoc
-
-  # FIXME: remove this once the docs image is updated
-  - pip3 install -U meson==0.56.2
-
-  - *gst_build
-  - ./gst-uninstalled.py ninja -C build/ plugins_doc_caches
-  - |
-    python3 -c "import os, subprocess, sys
-    subprojects = [os.environ['CI_PROJECT_NAME']]
-    if subprojects[0]  in ['gst-ci', 'gst-build']:
-        subprojects = ['gstreamer', 'gst-plugins-ugly', 'gst-omx', 'gst-plugins-good', 'gst-plugins-base', 'gstreamer-vaapi', 'gst-libav', 'gst-editing-services', 'gst-rtsp-server', 'gst-plugins-bad',]
-
-    diffsdir = '../plugins-cache-diffs'
-    os.makedirs(diffsdir, exist_ok=True)
-    res = 0
-    for subproject in subprojects:
-        cwd = os.path.join('subprojects', subproject)
-        try:
-            subprocess.check_call(['git', 'diff', '--quiet'], cwd=cwd)
-        except subprocess.CalledProcessError:
-            diffname = os.path.join(diffsdir, '%s_cache.diff' % subproject)
-            res += 1
-            with open(diffname, 'w') as diff:
-                subprocess.check_call(['git', 'diff'], stdout=diff, cwd=cwd)
-                print('\033[91mYou have a diff in the %s documentation cache. Please update with:\033[0m' % subproject)
-                print('     $ curl %s/%s | git apply -' % (os.environ['CI_ARTIFACTS_URL'], diffname.replace('../', '')))
-    if res != 0:
-        print('(note that it might take a few minutes for artefacts to be available on the server)\n')
-        sys.exit(res)"
-
-  - ./gst-uninstalled.py hotdoc run --conf-file=build/subprojects/gst-docs/GStreamer-doc.json --fatal-warnings
-  - cd -
-  - mv gst-build/build/subprojects/gst-docs/GStreamer-doc/html documentation/
-
-  artifacts:
-    when: always
-    paths:
-    - documentation/
-    - plugins-cache-diffs/
-
-#
-# Build an iOS App using the iOS binaries
-#
-.cross-ios universal examples:
-  stage: 'integrate'
-  variables:
-    EXAMPLES_HOME: ${CI_PROJECT_DIR}/examples
-    # disable codesigning so we don't need developer identities on the CI
-    # machines
-    XCODE_BUILD_ARGS: >
-      CODE_SIGNING_REQUIRED="NO"
-      CODE_SIGN_IDENTITY=""
-      CODE_SIGNING_ALLOWED="NO"
-      CODE_SIGN_ENTITLEMENTS=""
-  script:
-    # install the binaries
-    - installer -pkg gstreamer-1.0-devel-*-ios-universal.pkg -target CurrentUserHomeDirectory -verbose
-
-    - curl -L -o clone_manifest_ref.py https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/${GST_UPSTREAM_BRANCH}/gitlab/clone_manifest_ref.py
-    - chmod +x clone_manifest_ref.py
-    - ./clone_manifest_ref.py --manifest manifest.xml --project gst-examples --destination ${EXAMPLES_HOME}/gst-examples
-    - ./clone_manifest_ref.py --manifest manifest.xml --project gst-docs --destination ${EXAMPLES_HOME}/gst-docs
-    - rm clone_manifest_ref.py
-
-    # dump some useful information
-    - xcodebuild -version
-    - xcodebuild -showsdks
-
-    # gst-docs ios tutorials
-    - xcodebuild -showBuildSettings -alltargets -project ${EXAMPLES_HOME}/gst-docs/examples/tutorials/xcode\ iOS/GStreamer\ iOS\ Tutorials.xcodeproj
-    - xcodebuild -alltargets -destination generic/platform=iOS -project ${EXAMPLES_HOME}/gst-docs/examples/tutorials/xcode\ iOS/GStreamer\ iOS\ Tutorials.xcodeproj ${XCODE_BUILD_ARGS}
-
-    # gst-examples
-    - xcodebuild -showBuildSettings -alltargets -project ${EXAMPLES_HOME}/gst-examples/playback/player/ios/GstPlay.xcodeproj
-    - xcodebuild -alltargets -destination generic/platform=iOS -project ${EXAMPLES_HOME}/gst-examples/playback/player/ios/GstPlay.xcodeproj ${XCODE_BUILD_ARGS}
-  after_script:
-    - rm -rf ${EXAMPLES_HOME}/gst-examples ${EXAMPLES_HOME}/gst-docs
-  tags:
-    - gst-ios-14.3
-
-cross-ios universal examples:
-  extends: ".cross-ios universal examples"
-  rules:
-    - if: '$CI_MERGE_REQUEST_IID && $CI_PROJECT_NAME == "gst-docs"'
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-docs|gst-omx|gstreamer-vaapi|gst-integration-testsuites|gst-plugins-rs)$/'
-  needs:
-    - "build cerbero cross-ios universal"
-
-cerbero cross-ios universal examples:
-  extends: ".cross-ios universal examples"
-  rules:
-    - if: '$CI_PROJECT_NAME == "cerbero"'
-  needs:
-    - "cerbero deps cross-ios universal"
-
-build gst-omx zynq fedora x86_64:
-  extends: '.build fedora x86_64'
-  variables:
-    MESON_ARGS: "-Domx=enabled -Dgst-omx:target=zynqultrascaleplus -Dgst-omx:header_path=${CI_PROJECT_DIR}/vcu-omx-il/omx_header -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=disabled ${MESON_BUILDTYPE_ARGS} $MESON_GST_WERROR"
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gst-omx|gst-ci)$/'
-  before_script:
-    - git clone https://github.com/Xilinx/vcu-omx-il.git --branch=release-2020.1 ${CI_PROJECT_DIR}/vcu-omx-il
-
-build gst-omx tizonia fedora x86_64:
-  extends: '.build fedora x86_64'
-  variables:
-    MESON_ARGS: "-Domx=enabled -Dgst-omx:target=tizonia -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=disabled ${MESON_BUILDTYPE_ARGS} $MESON_GST_WERROR"
-    PKG_CONFIG_PATH: ${PKG_CONFIG_PATH}:${CI_PROJECT_DIR}/tizonia-install/lib64/pkgconfig/
-  rules:
-    - if: '$CI_PROJECT_NAME =~ /^(gst-omx|gst-ci)$/'
-  before_script:
-    - git clone https://github.com/tizonia/tizonia-openmax-il --branch v0.20.2
-    - cd tizonia-openmax-il
-    - meson build -Dclients=false -Dplugins='' -Dplayer=false -Dprefix=${CI_PROJECT_DIR}/tizonia-install
-    - ninja -C build
-    - ninja -C build install
-    - cd ..
-
-#
-# Cerbero Native Windows builds
-#
-.cerbero windows native:
-  needs: ['manifest']
-  image: $CERBERO_WINDOWS_IMAGE
-  tags:
-    - 'docker'
-    - 'windows'
-    - 'gstreamer-windows'
-    - '1809'
-  variables:
-    CONFIG: 'win64.cbc'
-    ARCH: 'msvc_x86_64'
-    CERBERO_HOST_DIR: "C:/cerbero"
-    CERBERO_ARGS: "${DEFAULT_CERBERO_ARGS} -v visualstudio -v nowerror"
-    CERBERO_RUN_SUFFIX: ".exe"
-    HAVE_CCACHE: ""
-  before_script:
-    - $env:CI_PROJECT_DIR = $env:CI_PROJECT_DIR.replace('\', '/')
-    - $env:CERBERO_SCRIPTS_PATH = "$env:CI_PROJECT_DIR/cerbero_setup.sh"
-    - echo "Fetching $env:CERBERO_SCRIPT_URL"
-    - Invoke-WebRequest -Uri $env:CERBERO_SCRIPT_URL -OutFile $env:CERBERO_SCRIPTS_PATH
-    - C:\MinGW\msys\1.0\bin\bash.exe --login -c "cd $env:CI_PROJECT_DIR && $env:CERBERO_SCRIPTS_PATH cerbero_before_script"
-
-cerbero deps msvc x86_64:
-  extends: ['.cerbero deps', '.cerbero windows native']
-  script:
-    - C:\MinGW\msys\1.0\bin\bash.exe --login -c "cd $env:CI_PROJECT_DIR && $env:CERBERO_SCRIPTS_PATH cerbero_deps_script"
-
-build cerbero msvc x86_64:
-  extends: ['.cerbero', '.cerbero windows native']
-  script:
-    - C:\MinGW\msys\1.0\bin\bash.exe --login -c "cd $env:CI_PROJECT_DIR && $env:CERBERO_SCRIPTS_PATH cerbero_script"
-  rules:
-    - if: '$CI_PROJECT_NAME !~ /^(cerbero|gst-build|gst-omx|gstreamer-vaapi|gst-docs|gst-integration-testsuites|gst-plugins-rs)$/'
diff --git a/subprojects/gst-plugins-bad/.indentignore b/subprojects/gst-plugins-bad/.indentignore
deleted file mode 100644
index a54620b63f..0000000000
--- a/subprojects/gst-plugins-bad/.indentignore
+++ /dev/null
@@ -1 +0,0 @@
-ext/sctp/usrsctp/usrsctplib/