From 8446009e7c889ad52d3d48b7fa82f8249edf3cf4 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Sat, 28 Mar 2020 11:17:38 +0100 Subject: [PATCH] ci: Use ci-templates to create the container image This puts the project more in line with other projects at freedesktop.org, and most importantly improves the caching of container images. Signed-off-by: Tomeu Vizoso --- ci/.gitlab-ci.yml | 75 ++++---------- ci/{Dockerfile => build-container.sh} | 139 +++++++++++++------------- ci/run_ci_locally.sh | 6 +- ci/run_test_suite.sh | 2 + ci/run_tests.sh | 68 ++++++------- 5 files changed, 121 insertions(+), 169 deletions(-) rename ci/{Dockerfile => build-container.sh} (52%) diff --git a/ci/.gitlab-ci.yml b/ci/.gitlab-ci.yml index 254aed5..3325f07 100644 --- a/ci/.gitlab-ci.yml +++ b/ci/.gitlab-ci.yml @@ -1,25 +1,12 @@ -image: docker:latest - -cache: - paths: - - ccache - variables: - DOCKER_DRIVER: overlay -# When running CI jobs, don't allow -# HW backed renderes, due to the -# variability it introduces. -# RENDER_DEVICE: /dev/dri/renderD128 - -.docker-setup: &docker-setup - - mkdir -p ccache - - mkdir -p results - - export DOCKER_IMAGE_DIGEST=$(cat results/docker_image_digest.txt) - - echo $DOCKER_IMAGE_DIGEST - - echo core > /proc/sys/kernel/core_pattern || true - - echo 0 > /proc/sys/kernel/core_uses_pid || true - - if [[ -n "$RENDER_DEVICE" ]]; then RD_CONFIG="--device=$RENDER_DEVICE -e RENDER_DEVICE=$RENDER_DEVICE"; fi - - echo RD_CONFIG=$RD_CONFIG + FDO_DISTRIBUTION_TAG: "2020-03-30" + FDO_DISTRIBUTION_VERSION: buster + TEST_IMAGE: "$CI_REGISTRY_IMAGE/debian/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG" + +include: + - project: 'freedesktop/ci-templates' + ref: 4a73f030d0602042cfa44ed94dc5e744b52f57aa + file: '/templates/debian.yml' stages: - build @@ -28,51 +15,23 @@ stages: build docker image: stage: build - services: - - docker:dind - before_script: - - mkdir -p results - script: - - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY - - time docker pull $CI_REGISTRY_IMAGE:latest || true - - - docker build - --build-arg KNOWN_GOOD_MESA=$MESA_COMMIT - --build-arg MESA_REPO=$MESA_REPO - -t $CI_REGISTRY_IMAGE - --cache-from $CI_REGISTRY_IMAGE:latest ci - - - docker history $CI_REGISTRY_IMAGE:latest - - - time docker push $CI_REGISTRY_IMAGE:latest 2>&1 | tee results/docker_push_log.txt - - - "grep -o 'digest: sha256:[0-9a-f]\\+' results/docker_push_log.txt | - cut -f 2 -d ' ' | - tee results/docker_image_digest.txt" + extends: .fdo.container-ifnot-exists@debian + stage: build + variables: + GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image + FDO_DISTRIBUTION_EXEC: 'bash ci/build-container.sh' only: - branches - tags - merge_requests - schedules - artifacts: - when: always - paths: - - results/ - - .tests_base: - services: - - docker:dind - before_script: - *docker-setup + image: $TEST_IMAGE + variables: + NUM_THREADS: 4 script: - - docker run - --ulimit core=99999999999:99999999999 - $RD_CONFIG - -v $PWD:/virglrenderer - $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST - bash -c "/virglrenderer/ci/run_tests.sh $TEST_SUITE" + - ci/run_tests.sh $TEST_SUITE - echo -e "\nThat's all folks\n" only: - branches diff --git a/ci/Dockerfile b/ci/build-container.sh similarity index 52% rename from ci/Dockerfile rename to ci/build-container.sh index e72fe09..3416781 100644 --- a/ci/Dockerfile +++ b/ci/build-container.sh @@ -1,30 +1,32 @@ -FROM debian:buster-slim +#!/bin/bash -ENV DEBIAN_FRONTEND=noninteractive -ENV GOPATH=/usr/local/go -ENV PATH=$PATH:/usr/local/go/bin -ENV LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/local/lib/x86_64-linux-gnu -ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:/usr/local/share/pkgconfig:/usr/local/lib/x86_64-linux-gnu/pkgconfig -ENV LDFLAGS="-L/usr/local/lib64 -L/usr/local/lib/ -L/usr/local/lib/x86_64-linux-gnu" -ENV CC="gcc-8" -ENV CXX="g++-8" -ENV CFLAGS="-g3" -ENV CXXFLAGS="-g3" -ENV GIT_DATE="`date +%Y-%m-%d -d \"15 months ago\"`" -ENV MESA_DEBUG=1 +set -e +set -o xtrace +export DEBIAN_FRONTEND=noninteractive +export GOPATH=/usr/local/go +export PATH=$PATH:/usr/local/go/bin +export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/local/lib/x86_64-linux-gnu +export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:/usr/local/share/pkgconfig:/usr/local/lib/x86_64-linux-gnu/pkgconfig +export LDFLAGS="-L/usr/local/lib64 -L/usr/local/lib/ -L/usr/local/lib/x86_64-linux-gnu" +export CC="gcc-8" +export CXX="g++-8" +export CFLAGS="-g3" +export CXXFLAGS="-g3" +export GIT_DATE="`date +%Y-%m-%d -d \"15 months ago\"`" +export MESA_DEBUG=1 -RUN echo 'path-exclude=/usr/share/doc/*' > /etc/dpkg/dpkg.cfg.d/99-exclude-cruft -RUN echo 'path-exclude=/usr/share/man/*' >> /etc/dpkg/dpkg.cfg.d/99-exclude-cruft -RUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d -RUN echo 'exit 101' >> /usr/sbin/policy-rc.d -RUN chmod +x /usr/sbin/policy-rc.d +echo 'path-exclude=/usr/share/doc/*' > /etc/dpkg/dpkg.cfg.d/99-exclude-cruft +echo 'path-exclude=/usr/share/man/*' >> /etc/dpkg/dpkg.cfg.d/99-exclude-cruft +echo '#!/bin/sh' > /usr/sbin/policy-rc.d +echo 'exit 101' >> /usr/sbin/policy-rc.d +chmod +x /usr/sbin/policy-rc.d -RUN echo deb-src http://deb.debian.org/debian buster main >> /etc/apt/sources.list -RUN echo deb http://deb.debian.org/debian buster-backports main >> /etc/apt/sources.list -RUN apt-get update && \ - apt-get -y install ca-certificates && \ - apt-get -y install --no-install-recommends \ +echo deb-src http://deb.debian.org/debian buster main >> /etc/apt/sources.list +echo deb http://deb.debian.org/debian buster-backports main >> /etc/apt/sources.list +apt-get update +apt-get -y install ca-certificates +apt-get -y install --no-install-recommends \ autoconf \ busybox \ ccache \ @@ -52,6 +54,7 @@ RUN apt-get update && \ lld-8 \ llvm-8-dev \ mesa-utils \ + meson \ nasm \ ninja-build \ procps \ @@ -75,32 +78,28 @@ RUN apt-get update && \ xserver-xorg-core \ xterm \ xvfb \ - zlib1g-dev && \ - apt-get -y build-dep --no-install-recommends \ + zlib1g-dev +apt-get -y build-dep --no-install-recommends \ libepoxy-dev \ libdrm \ mesa \ piglit \ - virglrenderer && \ - apt-get -y remove valgrind && \ - rm -rf /var/lib/apt/lists/* + virglrenderer +apt-get -y remove valgrind +rm -rf /var/lib/apt/lists/* -RUN pip3 install meson - -ARG KNOWN_GOOD_FAKEMACHINE=c4752ddf3343 -RUN go get -v github.com/tomeuv/fakemachine/cmd/fakemachine -RUN go install -x github.com/tomeuv/fakemachine/cmd/fakemachine - -ENV BATTERY_VERSION=0.1.23 -WORKDIR /battery -RUN wget "https://github.com/VoltLang/Battery/releases/download/v${BATTERY_VERSION}/battery-${BATTERY_VERSION}-x86_64-linux.tar.gz" && \ +export BATTERY_VERSION=0.1.23 +mkdir /battery +pushd /battery +wget "https://github.com/VoltLang/Battery/releases/download/v${BATTERY_VERSION}/battery-${BATTERY_VERSION}-x86_64-linux.tar.gz" && \ tar xzvf battery-${BATTERY_VERSION}-x86_64-linux.tar.gz && \ rm battery-${BATTERY_VERSION}-x86_64-linux.tar.gz && \ mv battery /usr/local/bin -WORKDIR / +popd -WORKDIR /volt -RUN git clone --depth=1 https://github.com/VoltLang/Watt.git && \ +mkdir /volt +pushd /volt +git clone --depth=1 https://github.com/VoltLang/Watt.git && \ git clone --depth=1 https://github.com/VoltLang/Volta.git && \ git clone --depth=1 https://github.com/Wallbraker/dEQP.git && \ battery config --release --lto Volta Watt && \ @@ -109,16 +108,16 @@ RUN git clone --depth=1 https://github.com/VoltLang/Watt.git && \ battery build && \ cp dEQP/deqp /usr/local/bin && \ rm -rf /volt -WORKDIR / +popd # To avoid this error: # error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function. -RUN git config --global http.postBuffer 1048576000 +git config --global http.postBuffer 1048576000 -ARG KNOWN_GOOD_CTS -ENV KNOWN_GOOD_CTS ${KNOWN_GOOD_CTS:-6c709dc9a99b70572aceb0f7698ab044383ff948} -WORKDIR /VK-GL-CTS -RUN git clone --shallow-since="$GIT_DATE" https://github.com/KhronosGroup/VK-GL-CTS.git . && \ +export KNOWN_GOOD_CTS=${KNOWN_GOOD_CTS:-6c709dc9a99b70572aceb0f7698ab044383ff948} +mkdir /VK-GL-CTS +pushd /VK-GL-CTS +git clone --shallow-since="$GIT_DATE" https://github.com/KhronosGroup/VK-GL-CTS.git . && \ git checkout ${KNOWN_GOOD_CTS} && \ git log --oneline -n 1 && \ python3 external/fetch_sources.py && \ @@ -128,12 +127,12 @@ RUN git clone --shallow-since="$GIT_DATE" https://github.com/KhronosGroup/VK-GL- make -j$(nproc) && \ find . -name CMakeFiles | xargs rm -rf && \ find . -name lib\*.a | xargs rm -rf -WORKDIR / +popd -ARG KNOWN_GOOD_PIGLIT -ENV KNOWN_GOOD_PIGLIT ${KNOWN_GOOD_PIGLIT:-645e15dc84fb48c1f270e322af61d7c716f1c45c} -WORKDIR /piglit -RUN git clone --shallow-since="$GIT_DATE" https://gitlab.freedesktop.org/mesa/piglit.git . && \ +export KNOWN_GOOD_PIGLIT=${KNOWN_GOOD_PIGLIT:-645e15dc84fb48c1f270e322af61d7c716f1c45c} +mkdir /piglit +pushd /piglit +git clone --shallow-since="$GIT_DATE" https://gitlab.freedesktop.org/mesa/piglit.git . && \ git checkout ${KNOWN_GOOD_PIGLIT} && \ git log --oneline -n 1 && \ cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release . && \ @@ -141,12 +140,12 @@ RUN git clone --shallow-since="$GIT_DATE" https://gitlab.freedesktop.org/mesa/pi rm -rf /usr/local/lib/piglit/generated_tests/spec/arb_vertex_attrib_64bit && \ rm -rf /usr/local/lib/piglit/generated_tests/spec/glsl-4.20 && \ rm -rf /piglit -WORKDIR / +popd -ARG KNOWN_GOOD_EPOXY -ENV KNOWN_GOOD_EPOXY ${KNOWN_GOOD_EPOXY:-5d818164dd2ab87b0054641f1446bc552a602320} -WORKDIR /epoxy -RUN git clone --shallow-since="$GIT_DATE" https://github.com/anholt/libepoxy.git . && \ +export KNOWN_GOOD_EPOXY=${KNOWN_GOOD_EPOXY:-5d818164dd2ab87b0054641f1446bc552a602320} +mkdir /epoxy +pushd /epoxy +git clone --shallow-since="$GIT_DATE" https://github.com/anholt/libepoxy.git . && \ git checkout ${KNOWN_GOOD_EPOXY} && \ git log --oneline -n 1 && \ mkdir -p build && \ @@ -154,11 +153,12 @@ RUN git clone --shallow-since="$GIT_DATE" https://github.com/anholt/libepoxy.git meson configure build/ -Dprefix=/usr/local -Dlibdir=lib && \ ninja -C build/ install >/dev/null && \ rm -rf /epoxy -WORKDIR / +popd -ARG KNOWN_GOOD_DRM=libdrm-2.4.100 -WORKDIR /drm -RUN git clone --shallow-since="$GIT_DATE" https://gitlab.freedesktop.org/mesa/drm.git . && \ +export KNOWN_GOOD_DRM=libdrm-2.4.100 +mkdir /drm +pushd /drm +git clone --shallow-since="$GIT_DATE" https://gitlab.freedesktop.org/mesa/drm.git . && \ git checkout ${KNOWN_GOOD_DRM} && \ git log --oneline -n 1 && \ mkdir -p build && \ @@ -166,16 +166,15 @@ RUN git clone --shallow-since="$GIT_DATE" https://gitlab.freedesktop.org/mesa/dr meson configure build/ -Dprefix=/usr/local -Dlibdir=lib && \ ninja -C build/ install >/dev/null && \ rm -rf /drm -WORKDIR / +popd -ARG KNOWN_GOOD_MESA -ENV KNOWN_GOOD_MESA ${KNOWN_GOOD_MESA:-e924181ea89e5e261f8aa24564c32ed22941e752} -RUN echo $KNOWN_GOOD_MESA -ARG MESA_REPO -ENV MESA_REPO ${MESA_REPO:-https://gitlab.freedesktop.org/mesa/mesa.git} -RUN echo $MESA_REPO -WORKDIR /mesa -RUN git clone --shallow-since="$GIT_DATE" ${MESA_REPO} . && \ +export KNOWN_GOOD_MESA=${KNOWN_GOOD_MESA:-e924181ea89e5e261f8aa24564c32ed22941e752} +echo $KNOWN_GOOD_MESA +export MESA_REPO=https://gitlab.freedesktop.org/mesa/mesa.git +echo $MESA_REPO +mkdir /mesa +pushd /mesa +git clone --shallow-since="$GIT_DATE" ${MESA_REPO} . && \ git checkout ${KNOWN_GOOD_MESA} && \ git log --oneline -n 1 && \ mkdir -p build && \ @@ -183,5 +182,5 @@ RUN git clone --shallow-since="$GIT_DATE" ${MESA_REPO} . && \ meson configure build/ -Dprefix=/usr/local -Dplatforms=drm,x11,wayland,surfaceless -Ddri-drivers=i965 -Dgallium-drivers=swrast,virgl,radeonsi -Dbuildtype=debugoptimized -Dllvm=true -Dglx=dri -Dgallium-vdpau=false -Dgallium-va=false -Dvulkan-drivers=[] -Dlibdir=lib && \ ninja -C build/ install >/dev/null && \ rm -rf /mesa -WORKDIR / +popd diff --git a/ci/run_ci_locally.sh b/ci/run_ci_locally.sh index a2e4101..d5f0acc 100755 --- a/ci/run_ci_locally.sh +++ b/ci/run_ci_locally.sh @@ -6,7 +6,7 @@ cd ${VIRGL_PATH} DOCKER_DRIVER=overlay2 -DOCKER_IMAGE=virglrenderer/ci +DOCKER_IMAGE=${DOCKER_IMAGE:-registry.freedesktop.org/virgl/virglrenderer/debian/buster:latest} if [[ -z $NUM_THREADS ]] ; then # If not forced use slightly less than half of available threads @@ -31,8 +31,6 @@ echo LOCAL_VIRGL=$LOCAL_VIRGL rm -rf $VIRGL_PATH/results mkdir -p $VIRGL_PATH/results -time docker build -t $DOCKER_IMAGE -f ci/Dockerfile --cache-from $DOCKER_IMAGE:latest ci - time docker run \ -it \ --ulimit core=99999999999:99999999999 \ @@ -40,5 +38,5 @@ time docker run \ $RD_CONFIG \ $LOCAL_MESA \ $LOCAL_VIRGL \ - $DOCKER_IMAGE:latest \ + $DOCKER_IMAGE \ bash -c "/virglrenderer/ci/run_tests.sh --make-check --deqp-gl-gl-tests --deqp-gl-gles-tests --deqp-gles-gl-tests --deqp-gles-gles-tests --piglit-gl --piglit-gles" 2>&1 | tee results/log.txt diff --git a/ci/run_test_suite.sh b/ci/run_test_suite.sh index f51607d..321e18d 100755 --- a/ci/run_test_suite.sh +++ b/ci/run_test_suite.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -x + # Setup paths and import util functions . $(dirname $(readlink -f "$0"))/util.sh diff --git a/ci/run_tests.sh b/ci/run_tests.sh index 7fa87f4..2f2db61 100755 --- a/ci/run_tests.sh +++ b/ci/run_tests.sh @@ -16,8 +16,10 @@ run_setup() export NUM_THREADS echo "Using $NUM_THREADS threads" - export CCACHE_BASEDIR=/virglrenderer - export CCACHE_DIR=/virglrenderer/ccache + export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/local/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH + + export CCACHE_BASEDIR="$(pwd)" + export CCACHE_DIR="$(pwd)/ccache" export PATH="/usr/lib/ccache:$PATH" mkdir -p $CCACHE_DIR ccache -s @@ -32,10 +34,8 @@ run_setup() export SOFTWARE_ONLY=1 fi - set +x - if [[ $LOCAL_MESA ]]; then - cd $LOCAL_MESA && \ + pushd $LOCAL_MESA mkdir -p build && \ meson build/ && \ meson configure build/ -Dprefix=/usr/local -Dplatforms=drm,x11,wayland,surfaceless -Ddri-drivers=i965 -Dgallium-drivers=swrast,virgl,radeonsi,r600 -Dbuildtype=debugoptimized -Dllvm=true -Dglx=dri -Dgallium-vdpau=false -Dgallium-va=false -Dvulkan-drivers=[] -Dlibdir=lib && \ @@ -44,45 +44,35 @@ run_setup() meson setup --wipe build/ ninja -C build/ install -j $NUM_THREADS || exit 1 fi + popd fi - VIRGL_PATH="/virglrenderer" - rm -rf $VIRGL_PATH/results/ - mkdir -p $VIRGL_PATH/results/ + rm -rf ./results/ + mkdir -p ./results/ if [ "x$use_meson" = "x" ]; then - if [ -d "$VIRGL_PATH" ]; then - cd $VIRGL_PATH - ./autogen.sh --prefix=/usr/local --enable-debug --enable-tests --enable-autotools - make -j$NUM_THREADS install - fi + ./autogen.sh --prefix=/usr/local --enable-debug --enable-tests --enable-autotools + make -j$NUM_THREADS install else - if [ -d "$VIRGL_PATH" ]; then - cd $VIRGL_PATH - mkdir build - if [ "x$use_clang_fuzzer" = "x1" ]; then - CC=clang-8 - FUZZER=-Dfuzzer=true - fi - - meson build/ -Dprefix=/usr/local -Ddebug=true -Dtests=true --fatal-meson-warnings $FUZZER - ninja -C build -j$NUM_THREADS install - fi + mkdir build + if [ "x$use_clang_fuzzer" = "x1" ]; then + export CC=clang-8 + export FUZZER=-Dfuzzer=true + fi + + meson build/ -Dprefix=/usr/local -Ddebug=true -Dtests=true --fatal-meson-warnings $FUZZER + ninja -C build -j$NUM_THREADS install fi - - CI_DIR=$(dirname $(readlink -f "$0")) - cd $CI_DIR } run_make_check() { run_setup ( - cd /virglrenderer - mkdir -p /virglrenderer/results/make_check + mkdir -p ./results/make_check VRENDTEST_USE_EGL_SURFACELESS=1 make -j$NUM_THREADS check --no-print-directory RET=$? - cp tests/test*.log /virglrenderer/results/make_check/ + cp tests/test*.log ./results/make_check/ return $RET ) } @@ -91,11 +81,10 @@ run_make_check_meson() { run_setup meson ( - cd /virglrenderer/build - mkdir -p /virglrenderer/results/make_check_meson - VRENDTEST_USE_EGL_SURFACELESS=1 ninja -j$NUM_THREADS test + mkdir -p ./results/make_check_meson + VRENDTEST_USE_EGL_SURFACELESS=1 ninja -Cbuild -j$NUM_THREADS test RET=$? - cp /virglrenderer/build/meson-logs/testlog.txt /virglrenderer/results/make_check_meson/ + cp ./build/meson-logs/testlog.txt ./results/make_check_meson/ return $RET ) } @@ -104,11 +93,12 @@ run_make_check_clang_fuzzer() { run_setup meson fuzzer ( - cd /virglrenderer/build - mkdir -p /virglrenderer/results/make_check_clang_fuzzer + mkdir -p ./results/make_check_clang_fuzzer + pushd ./build VRENDTEST_USE_EGL_SURFACELESS=1 ninja -j$NUM_THREADS test RET=$? - cp /virglrenderer/build/meson-logs/testlog.txt /virglrenderer/results/make_check_clang_fuzzer/ + cp ./meson-logs/testlog.txt ../results/make_check_clang_fuzzer/ + popd return $RET ) } @@ -148,9 +138,11 @@ run_deqp() BACKENDS="${BACKENDS} --backend vtest-gpu" fi + pushd ci ./run_test_suite.sh --deqp ${TEST_SUITE} \ --host-${OGL_BACKEND} \ ${BACKENDS} + popd return $? } @@ -170,9 +162,11 @@ run_piglit() BACKENDS="${BACKENDS} --backend vtest-gpu" fi + pushd ci ./run_test_suite.sh --piglit --gles2 --gles3 \ --host-${OGL_BACKEND} \ ${BACKENDS} + popd return $? }