On Thu, 2018-08-09 at 19:35 -0700, Eric Anholt wrote: > "Juan A. Suarez Romero" <jasua...@igalia.com> writes: > > > Creates different Docker images containing Mesa built with different > > tools (autotools, meson, scons, etc). > > > > The build is done in 3 levels: the first level creates a base image > > with all the requirements to build Mesa. > > > > The second level (based of the first one), builds different images with > > different versions of LLVM. As Gallium drivers heavily relies on LLVM, > > this will help to test the build with different LLVM versions. > > > > Finally, the latest level creates different images versions of Mesa. > > The main differences is the tool to build them: autotools, meson, scons, > > building Gallium drivers with different LLVM versions, and so on. > > > > As the purpose is just to test that everything can be built correctly, > > all the images are discarded, except one (the autotools), which is > > stored in the registry. Thus, anyone can just pull it locally and test > > against their local system. > > > > In order to build the images, Rocker is used. This is a tool that > > extends the Dockerfiles with new features that are quite interested > > here. The main features we use is the support for templating, and the > > support for mounting external directories during the image building. > > This help to use tools like ccache to improve the build speed. > > > > Signed-off-by: Juan A. Suarez Romero <jasua...@igalia.com> > > --- > > .gitlab-ci.yml | 177 +++++++++++++++++++++++++++++++++ > > gitlab-ci/Rockerfile.base | 199 ++++++++++++++++++++++++++++++++++++++ > > gitlab-ci/Rockerfile.llvm | 57 +++++++++++ > > gitlab-ci/Rockerfile.mesa | 145 +++++++++++++++++++++++++++ > > 4 files changed, 578 insertions(+) > > create mode 100644 .gitlab-ci.yml > > create mode 100644 gitlab-ci/Rockerfile.base > > create mode 100644 gitlab-ci/Rockerfile.llvm > > create mode 100644 gitlab-ci/Rockerfile.mesa > > > > diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml > > new file mode 100644 > > index 00000000000..5cee333dd45 > > --- /dev/null > > +++ b/.gitlab-ci.yml > > @@ -0,0 +1,177 @@ > > +image: docker:latest > > + > > +services: > > + - docker:dind > > + > > +stages: > > + - base > > + - llvm > > + - mesa > > + > > +variables: > > + DOCKER_IMAGE: $CI_REGISTRY_IMAGE > > + CCACHE_DIR: $CI_PROJECT_DIR/../ccache > > + LLVM: "6.0" > > + > > +cache: > > + paths: > > + - ccache/ > > + key: "$CI_JOB_STAGE" > > + > > +before_script: > > + - mkdir -p ccache > > + - rm -fr ../ccache > > + - mv ccache ../ > > + - export MAKEFLAGS=-j$(nproc) > > + - apk --no-cache add libc6-compat > > + - wget > > https://github.com/grammarly/rocker/releases/download/1.3.1/rocker-1.3.1-linux_amd64.tar.gz > > + - tar xvf rocker-1.3.1-linux_amd64.tar.gz > > + - rm rocker-1.3.1-linux_amd64.tar.gz > > + - mv rocker .. > > + - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY > > + > > +after_script: > > + - mv ../ccache ./ > > + > > +.build_llvm: &build_llvm > > + stage: llvm > > + cache: {} > > + script: > > + - ../rocker build -f gitlab-ci/Rockerfile.llvm --var LLVM=$LLVM > > + - docker push $CI_REGISTRY_IMAGE:llvm-$LLVM > > + > > +.build_mesa: &build_mesa > > + stage: mesa > > + script: > > + - ../rocker build -f gitlab-ci/Rockerfile.mesa --var BUILD=$BUILD > > --var LLVM=$LLVM --var TAG=$CI_COMMIT_REF_SLUG . > > + > > +base: > > + stage: base > > + script: > > + - DOCKERFILE_SHA256=$(cat gitlab-ci/Rockerfile.base | sha256sum | cut > > -c-64) > > + - IMAGE_DOCKERFILE_SHA256=$(./gitlab-ci/inspect-remote-image.sh > > gitlab-ci-token $CI_BUILD_TOKEN $CI_PROJECT_PATH "base" > > ".config.Labels[\"dockerfile.sha256\"]" || echo -n "<notfound>") > > + - if [ "$DOCKERFILE_SHA256" != "$IMAGE_DOCKERFILE_SHA256" ] ; then > > FORCE_BUILD=true ; fi > > + - if [ "$FORCE_BUILD" ] ; then ../rocker build -f > > gitlab-ci/Rockerfile.base --var DOCKERFILE_SHA256=$DOCKERFILE_SHA256 ; fi > > + - if [ "$FORCE_BUILD" ] ; then docker push $CI_REGISTRY_IMAGE:base ; fi > > I think this patch file was a previous version, as patch 2 removes lines > that aren't in this block and replaces them with these ones? >
Not sure which lines do you mean. In patch 2 we remove two lines in the "build_llvm" job, but we don't touch "base" job. > > +llvm:3.3: > > + variables: > > + LLVM: "3.3" > > + <<: *build_llvm > > How big do all these images end up being? Do we have any size limits on > what our CI can be uploading? > According to the registry[1], the base image requires 226Mb, while each of the LLVM images require between 250 and 360 Mb. But as docker images share layers, I'm not sure this is a good measure. For the size limits, Daniel can answer. But I think space wasn't a big problem. [1] https://gitlab.freedesktop.org/jasuarez/mesa/container_registry > > diff --git a/gitlab-ci/Rockerfile.base b/gitlab-ci/Rockerfile.base > > new file mode 100644 > > index 00000000000..a0cb5e5290d > > --- /dev/null > > +++ b/gitlab-ci/Rockerfile.base > > @@ -0,0 +1,199 @@ > > +# > > +# Base image for building Mesa. > > +# > > +# ~~~ > > +# rocker build -f Rockerfile.base [--attach] [--pull] > > +# ~~~ > > +# > > +# Environment variables that are used in the build: > > +# - DOCKER_IMAGE: name of the final image to be tagged (default: > > mesa:base) > > +# - MAKEFLAGS: flags to pass to make (e.g., "-j8") > > +# - CCACHE_DIR: ccache directory (e.g, ~/.ccache) > > +# > > + > > +{{ $image := (or .Env.DOCKER_IMAGE "mesa") }} > > + > > +FROM ubuntu:xenial > > + > > +LABEL maintainer "Juan A. Suarez Romero <jasua...@igalia.com>" > > + > > +ENV LC_ALL=C.UTF-8 > > + > > +RUN apt-get update > > \ > > + && apt-get --no-install-recommends -y install autoconf gcc g++ sudo > > cmake patch git \ > > + automake pkg-config libtool-bin bison flex python-pip > > libpthread-stubs0-dev wget \ > > + libxau-dev libx11-dev libxext-dev libxdamage-dev libx11-xcb-dev > > gettext xutils-dev \ > > Do we want to install libx11-xcb-dev if we're also building our own libxcb? This is something I need to review. > > > + zlib1g-dev scons libelf-dev libxvmc-dev libvdpau-dev libva-dev > > libclc-dev ccache \ > > + libpciaccess-dev libxxf86vm-dev python-setuptools python-wheel bzip2 > > make pciutils \ > > + mesa-common-dev libexpat1-dev xz-utils libedit-dev libffi-dev > > libunwind-dev \ > > mesa-common-dev also feels funny, but I'm guessing you're planning on > building things like piglit in this image eventually. Correct :) This Dockerfile is mostly the same as we use in our system, that allow us to build (and run!) piglit and vk-gl-cts. But I'll review the dependencies to strictly use what we need here. > > > +RUN wget > > https://xorg.freedesktop.org/releases/individual/proto/glproto-1.4.14.tar.bz2 > > \ > > + && tar -jxvf glproto-1.4.14.tar.bz2 > > \ > > + && rm glproto-1.4.14.tar.bz2 > > \ > > + && cd glproto-1.4.14 > > \ > > + && ./configure > > \ > > + && make > > \ > > + && sudo make install > > \ > > + && sudo ldconfig > > \ > > + && sudo rm -fr ../glproto-1.4.14 > > + > > +RUN wget > > https://xorg.freedesktop.org/releases/individual/proto/dri2proto-2.8.tar.bz2 > > \ > > + && tar -jxvf dri2proto-2.8.tar.bz2 > > \ > > + && rm dri2proto-2.8.tar.bz2 > > \ > > + && cd dri2proto-2.8 > > \ > > + && ./configure > > \ > > + && make > > \ > > + && sudo make install > > \ > > + && sudo ldconfig > > \ > > + && sudo rm -fr ../dri2proto-2.8 > > The various protocol repos are now deprecated, and the common xorgproto > has replaced them (complete with meson build system). > > That doesn't have to change now, but if you end up respinning it might > be nice. > In the current Travis file I still see glproto and dri2proto are still installed. And configure.ac seems to use them. Same for meson.build, which seems to use them when building drm platform. > > +RUN wget https://xcb.freedesktop.org/dist/xcb-proto-1.13.tar.bz2 > > \ > > + && tar -jxvf xcb-proto-1.13.tar.bz2 > > \ > > + && rm xcb-proto-1.13.tar.bz2 > > \ > > + && cd xcb-proto-1.13 > > \ > > + && ./configure > > \ > > + && make > > \ > > + && sudo make install > > \ > > + && sudo ldconfig > > \ > > + && sudo rm -fr ../xcb-proto-1.13 > > + > > +RUN wget https://xcb.freedesktop.org/dist/libxcb-1.13.tar.bz2 > > \ > > + && tar -jxvf libxcb-1.13.tar.bz2 > > \ > > + && rm libxcb-1.13.tar.bz2 > > \ > > + && cd libxcb-1.13 > > \ > > + && ./configure > > \ > > + && make > > \ > > + && sudo make install > > \ > > + && sudo ldconfig > > \ > > + && sudo rm -fr ../libxcb-1.13 > > + > > +RUN wget > > https://xorg.freedesktop.org//releases/individual/proto/renderproto-0.11.1.tar.bz2 > > \ > > + && tar -jxvf renderproto-0.11.1.tar.bz2 > > \ > > + && rm renderproto-0.11.1.tar.bz2 > > \ > > + && cd renderproto-0.11.1 > > \ > > + && ./configure > > \ > > + && make > > \ > > + && sudo make install > > \ > > + && sudo ldconfig > > \ > > + && sudo rm -fr ../renderproto-0.11.1 > > + > > +RUN wget > > https://xorg.freedesktop.org/releases/individual/lib/libXrender-0.9.10.tar.bz2 > > \ > > + && tar -jxvf libXrender-0.9.10.tar.bz2 > > \ > > + && rm libXrender-0.9.10.tar.bz2 > > \ > > + && cd libXrender-0.9.10 > > \ > > + && ./configure > > \ > > + && make > > \ > > + && sudo make install > > \ > > + && sudo ldconfig > > \ > > + && sudo rm -fr ../libXrender-0.9.10 > > Huh? What's using libXRender? I need to review this. > > > +RUN export DRM_VERSION=`cat /home/local/mesa/configure.ac | egrep > > ^LIBDRM.*REQUIRED| cut -f2 -d= | sort -nr | head -n 1` \ > > + && wget https://dri.freedesktop.org/libdrm/libdrm-$DRM_VERSION.tar.bz2 > > \ > > + && tar -jxvf libdrm-$DRM_VERSION.tar.bz2 > > \ > > + && rm libdrm-$DRM_VERSION.tar.bz2 > > \ > > + && cd libdrm-$DRM_VERSION > > \ > > + && ./configure --enable-freedreno --enable-vc4 > > --enable-etnaviv-experimental-api --enable-tegra-experimental-api \ > > + && make > > \ > > + && sudo make install > > \ > > + && sudo ldconfig > > \ > > + && sudo rm -fr ../libdrm-$DRM_VERSION > > \ > > + && unset DRM_VERSION > > It looks like we've bumped libdrm versions maybe 5 times this year? It > doesn't seem worth inflicting libdrm rebuild on every Mesa commit to > save the image rebuilds less than once a month. > I'm fine with moving it to the base system. We need to ensure it is updated properly when we bump up the required version. I just used the current approach as it is the same as the one we use in Travis. > If we don't move it to the base image, we should probably at least > switch to the meson build for it to reduce the build times. > Agree on this. Either if we move it or not to the base image, switching to meson is a big win. > That said, this all seems like a great start, and I'd be happy to see it > land as-is so it can be incrementally improved. I'll review all the dependencies in the base system. Thanks for the feedback! J.A. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev