diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05a417c78f..13a2aa9239 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,6 +37,7 @@ variables: INDENT_AMD64_SUFFIX: 'amd64/gst-indent' COMMITLINT_AMD64_SUFFIX: 'amd64/commitlint' WINDOWS_AMD64_SUFFIX: 'amd64/windows' + ABI_CHECK_AMD64_SUFFIX: 'amd64/abi-check' WINDOWS_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH" WINDOWS_UPSTREAM_IMAGE: "$CI_REGISTRY/$FDO_UPSTREAM_REPO/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH" @@ -263,6 +264,28 @@ windows amd64 docker: tags: - gst-mac-arm +.abi-check image: + variables: + CCACHE_DIR: !reference [".fedora image", "variables", CCACHE_DIR] + FDO_DISTRIBUTION_VERSION: !reference [".fedora image", "variables", FDO_DISTRIBUTION_VERSION] + FDO_REPO_SUFFIX: !reference [".fedora image", "variables", FDO_REPO_SUFFIX] + FDO_BASE_IMAGE: '$CI_REGISTRY_IMAGE/$FDO_REPO_SUFFIX:$FEDORA_TAG-$GST_UPSTREAM_BRANCH' + FDO_DISTRIBUTION_TAG: "abi-check-$ABI_CHECK_TAG-$GST_UPSTREAM_BRANCH" + FDO_DISTRIBUTION_PACKAGES: 'libabigail' + FDO_DISTRIBUTION_EXEC: 'GIT_BRANCH=$CI_COMMIT_REF_NAME GIT_URL=$CI_REPOSITORY_URL bash ci/docker/abi-check/prepare.sh' + ABI_CHECK_CACHE: '/abi-check-cache' + +abi-check docker: + # placeholder-job has very minimal CPU available and may overrun the job + # timeout if an image rebuild (which builds GStreamer) needs to be performed. + #tags: [ 'placeholder-job' ] + stage: 'preparation' + extends: + - '.abi-check image' + - '.fdo.container-build@fedora' + needs: + - 'fedora amd64 docker' + # ---- Preparation ----- # # # gst-indent!! @@ -701,6 +724,26 @@ build macos: -Dgst-plugins-good:cairo=enabled -Dgst-plugins-good:soup=enabled +abi-check: + stage: 'build' + extends: + - '.abi-check image' + - '.fdo.suffixed-image@fedora' + - '.build' + needs: + - "trigger" + - 'abi-check docker' + script: + - $CI_PROJECT_DIR/ci/scripts/abi-check.sh build/ + variables: + ABI_CHECK_DIR: 'abi-dumps' + artifacts: + expire_in: "7 days" + when: "always" + paths: + - 'meson-logs/' + - '$ABI_CHECK_DIR' + # ---- Tests ----- # .test: diff --git a/.gitlab-image-tags.yml b/.gitlab-image-tags.yml index 3815be34a3..d6726794cc 100644 --- a/.gitlab-image-tags.yml +++ b/.gitlab-image-tags.yml @@ -13,4 +13,6 @@ variables: LINT_TAG: '2024-02-20.0' + ABI_CHECK_TAG: '2024-11-18.0' + WINDOWS_TAG: '2024-11-12.0' diff --git a/ci/docker/abi-check/install-abi-check-cache.sh b/ci/docker/abi-check/install-abi-check-cache.sh new file mode 100644 index 0000000000..126d99acef --- /dev/null +++ b/ci/docker/abi-check/install-abi-check-cache.sh @@ -0,0 +1,13 @@ +#! /bin/bash + +set -eux + +meson_args="${MESON_ARGS:-}" + +install_prefix=/tmp/install +MESON_ARGS="${meson_args} --prefix ${install_prefix} --optimization=g" ./ci/scripts/build.sh build/ +ninja -C build/ install + +find ${install_prefix}/lib64 -type f -iname *libgst*.so.* -print0 | xargs -0 -I '{}' bash ./ci/scripts/save-abi.sh {} ${ABI_CHECK_CACHE} + +rm -rf $install_prefix diff --git a/ci/docker/abi-check/prepare.sh b/ci/docker/abi-check/prepare.sh new file mode 100644 index 0000000000..21468bb3cd --- /dev/null +++ b/ci/docker/abi-check/prepare.sh @@ -0,0 +1,5 @@ +#! /bin/bash + +set -eux + +bash ./ci/docker/abi-check/install-abi-check-cache.sh diff --git a/ci/scripts/abi-check.sh b/ci/scripts/abi-check.sh new file mode 100755 index 0000000000..201601f1ee --- /dev/null +++ b/ci/scripts/abi-check.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -eux + +builddir="$1" + +meson_args="${MESON_ARGS:-}" + +if [[ -z "$builddir" ]]; then + echo "Usage: build.sh " + exit 1 +fi + +echo ${ABI_CHECK_CACHE} +echo ${ABI_CHECK_DIR} + +# nproc works on linux +# sysctl for macos +_jobs=$(nproc || sysctl -n hw.ncpu) +jobs="${FDO_CI_CONCURRENT:-$_jobs}" + +install_prefix=/tmp/install +MESON_ARGS="${meson_args} --prefix ${install_prefix} --optimization=g" ./ci/scripts/build.sh build/ +ninja -C $builddir install + +find ${install_prefix}/lib64 -type f -iname *libgst*.so.* -print0 | xargs -0 -I '{}' bash ${CI_PROJECT_DIR}/ci/scripts/save-abi.sh {} ${ABI_CHECK_DIR} + +fail_file=abi-compare-failure +if ! find ${ABI_CHECK_CACHE} -type f -print0 | xargs -0 -I '{}' bash ${CI_PROJECT_DIR}/ci/scripts/compare-abi.sh {} ${CI_PROJECT_DIR}/${ABI_CHECK_DIR}/ ${fail_file} +then + echo ABI comparison failed for the following modules! + cat ${fail_file} + rm -rf $install_prefix + exit 1; +fi + +rm -rf $install_prefix diff --git a/ci/scripts/compare-abi.sh b/ci/scripts/compare-abi.sh new file mode 100755 index 0000000000..fabb94ba79 --- /dev/null +++ b/ci/scripts/compare-abi.sh @@ -0,0 +1,24 @@ +#! /bin/bash + +set -eux + +old_abi=${1} +output_dir=${2} +output_fail_file=${3} +upstream_branch=${GST_UPSTREAM_BRANCH:-} + +module=$(basename ${old_abi}) + +opts="--drop-private-types" +if [ "x$upstream_branch" = "xmain" ] +then + # don't error out on added symbols + opts="${opts} --no-added-syms" +fi + +mkdir -p ${output_dir} +if ! abidiff ${opts} ${old_abi} ${output_dir}/${module} +then + echo ${module} >> ${output_fail_file} + exit 1; +fi diff --git a/ci/scripts/save-abi.sh b/ci/scripts/save-abi.sh new file mode 100755 index 0000000000..fa4afb13fe --- /dev/null +++ b/ci/scripts/save-abi.sh @@ -0,0 +1,10 @@ +#! /bin/bash + +set -eux + +filename=${1} +output_dir=${2} +module=$(basename ${filename} | cut -f1,2 -d'.') + +mkdir -p ${output_dir} +abidw -o ${output_dir}/${module}.abi --drop-private-types ${filename}