mirror of
https://github.com/tbabej/taskwiki.git
synced 2025-08-18 21:33:07 +02:00
tests: Refactor Dockerfile to multi-stage (more caching during development)
The previous refactor traded build step caching for smaller image size, which in turn made fast caching of built images possible, and allowed us to speed up CI builds. But almost any change in Dockerfile required full rebuild of everything (vim & taskwarrior), so changes to the Dockerfile became more painful. This commit refactors the Dockerfile to use multi-stage builds, which brings build caching back: vim & taskwarrior are built in separate stages, which are cached step by step, and then the build artifacts are copied into the main tests image and runtime dependencies are installed. There's a catch, of course: --cache-from doesn't work with multi-stage images unless the experimental BuildKit backend and its inline cache export are enabled. This requires docker 19.03, which shouldn't be hard to obtain but isn't installed by default on Travis CI.
This commit is contained in:
parent
ae588783c1
commit
13ee57540e
2 changed files with 65 additions and 78 deletions
3
.github/workflows/tests.yaml
vendored
3
.github/workflows/tests.yaml
vendored
|
@ -36,7 +36,8 @@ jobs:
|
|||
) | sha256sum | read -r tag _
|
||||
docker login "$DOCKER_REGISTRY" -u "$GITHUB_USER" -p "$GITHUB_TOKEN" || :
|
||||
docker pull "$DOCKER_CACHE_IMAGE":"$tag" || :
|
||||
docker build \
|
||||
DOCKER_BUILDKIT=1 docker build \
|
||||
--build-arg BUILDKIT_INLINE_CACHE=1 \
|
||||
--cache-from "$DOCKER_CACHE_IMAGE":"$tag" \
|
||||
${ALPINE_VERSION:+--build-arg ALPINE_VERSION="$ALPINE_VERSION"} \
|
||||
${PYTHON_VERSION:+--build-arg PYTHON_VERSION="$PYTHON_VERSION"} \
|
||||
|
|
140
Dockerfile
140
Dockerfile
|
@ -1,105 +1,91 @@
|
|||
ARG ALPINE_VERSION=3.12
|
||||
ARG PYTHON_VERSION=3
|
||||
|
||||
FROM python:${PYTHON_VERSION}-alpine${ALPINE_VERSION}
|
||||
|
||||
ARG TASK_VERSION=v2.5.1
|
||||
ARG VIM_VERSION=v8.2.0716
|
||||
ARG VIMWIKI_VERSION=master
|
||||
|
||||
RUN set -ex \
|
||||
&& apk add --no-cache --virtual .taskwiki-test-deps \
|
||||
git \
|
||||
make \
|
||||
tzdata \
|
||||
xvfb-run \
|
||||
&& ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime \
|
||||
&& true
|
||||
|
||||
RUN set -ex \
|
||||
\
|
||||
&& : install vim $VIM_VERSION \
|
||||
\
|
||||
&& apk add --no-cache --virtual .vim-build-deps \
|
||||
FROM python:${PYTHON_VERSION}-alpine${ALPINE_VERSION} AS build
|
||||
|
||||
|
||||
FROM build AS build-vim
|
||||
RUN apk add --no-cache \
|
||||
gcc \
|
||||
git \
|
||||
gtk+3.0-dev \
|
||||
libxt-dev \
|
||||
make \
|
||||
musl-dev \
|
||||
ncurses-dev \
|
||||
patchelf \
|
||||
&& cd /usr/src \
|
||||
&& git clone --depth 1 --recurse-submodules --shallow-submodules --branch $VIM_VERSION \
|
||||
https://github.com/vim/vim \
|
||||
&& cd vim \
|
||||
&& sed -i -e '/#\s*undef _POSIX_THREADS/d' src/if_python3.c \
|
||||
&& ./configure --prefix=/opt/vim --enable-pythoninterp --enable-python3interp --enable-gui=gtk3 \
|
||||
&& make -j$(nproc) \
|
||||
&& make install \
|
||||
&& rm -rf /usr/src/vim \
|
||||
&& patchelf --print-needed /opt/vim/bin/* \
|
||||
| grep -v '^libpython' \
|
||||
| sort -u \
|
||||
| sed -e 's/^/so:/' \
|
||||
| xargs -rt apk add --no-cache --virtual .vim-runtime-deps \
|
||||
\
|
||||
&& : install taskwarrior $TASK_VERSION \
|
||||
\
|
||||
&& apk add --no-cache --virtual .taskwarrior-build-deps \
|
||||
ncurses-dev
|
||||
ARG VIM_VERSION
|
||||
RUN git clone --depth 1 --recurse-submodules --shallow-submodules \
|
||||
--branch $VIM_VERSION https://github.com/vim/vim /usr/src/vim
|
||||
WORKDIR /usr/src/vim
|
||||
# "backport" https://github.com/vim/vim/commit/16d7eced1a08565a9837db8067c7b9db5ed68854
|
||||
RUN sed -i -e '/#\s*undef _POSIX_THREADS/d' src/if_python3.c
|
||||
RUN ./configure --prefix=/opt/vim --enable-pythoninterp --enable-python3interp --enable-gui=gtk3
|
||||
RUN make -j$(nproc)
|
||||
RUN make install
|
||||
|
||||
|
||||
FROM build AS build-taskwarrior
|
||||
RUN apk add --no-cache \
|
||||
cmake \
|
||||
g++ \
|
||||
gcc \
|
||||
git \
|
||||
make \
|
||||
patchelf \
|
||||
util-linux-dev \
|
||||
&& cd /usr/src \
|
||||
&& git clone --depth 1 --recurse-submodules --shallow-submodules --branch $TASK_VERSION \
|
||||
https://github.com/GothenburgBitFactory/taskwarrior \
|
||||
&& cd taskwarrior \
|
||||
&& cmake -DCMAKE_INSTALL_PREFIX=/opt/taskwarrior -DCMAKE_BUILD_TYPE=release -DENABLE_SYNC=OFF . \
|
||||
&& make -j$(nproc) \
|
||||
&& make install \
|
||||
&& rm -rf /usr/src/taskwarrior \
|
||||
&& patchelf --print-needed /opt/taskwarrior/bin/* \
|
||||
| sort -u \
|
||||
| sed -e 's/^/so:/' \
|
||||
| xargs -rt apk add --no-cache --virtual .taskwarrior-runtime-deps \
|
||||
\
|
||||
&& : install vimwiki $VIMWIKI_VERSION \
|
||||
\
|
||||
&& mkdir -p /root/.vim/bundle \
|
||||
&& cd /root/.vim/bundle \
|
||||
&& git clone --depth 1 --recurse-submodules --shallow-submodules --branch $VIMWIKI_VERSION \
|
||||
https://github.com/vimwiki/vimwiki \
|
||||
\
|
||||
&& : install python test dependencies \
|
||||
\
|
||||
&& apk add --no-cache --virtual .python-coverage-build-deps \
|
||||
util-linux-dev
|
||||
ARG TASK_VERSION
|
||||
RUN git clone --depth 1 --recurse-submodules --shallow-submodules \
|
||||
--branch $TASK_VERSION https://github.com/GothenburgBitFactory/taskwarrior /usr/src/taskwarrior
|
||||
WORKDIR /usr/src/taskwarrior
|
||||
RUN cmake -DCMAKE_INSTALL_PREFIX=/opt/taskwarrior -DCMAKE_BUILD_TYPE=release -DENABLE_SYNC=OFF .
|
||||
RUN make -j$(nproc)
|
||||
RUN make install
|
||||
|
||||
|
||||
FROM build AS build-pip
|
||||
# coverage needs to build a C extensions, otherwise it's slow
|
||||
RUN apk add --no-cache \
|
||||
gcc \
|
||||
musl-dev \
|
||||
&& pip install \
|
||||
musl-dev
|
||||
RUN pip install --root=/opt/pip-root \
|
||||
coverage \
|
||||
coveralls \
|
||||
pytest \
|
||||
pytest-cov \
|
||||
pytest-xdist \
|
||||
https://github.com/liskin/vimrunner-python/archive/8c19ff88050c09236e7519425bfae33c687483df.zip \
|
||||
\
|
||||
&& : clean up build dependencies \
|
||||
\
|
||||
&& apk del --no-network .taskwarrior-build-deps \
|
||||
&& apk del --no-network .vim-build-deps \
|
||||
&& apk del --no-network .python-coverage-build-deps \
|
||||
&& true
|
||||
https://github.com/liskin/vimrunner-python/archive/8c19ff88050c09236e7519425bfae33c687483df.zip
|
||||
COPY requirements.txt /tmp/taskwiki/requirements.txt
|
||||
RUN pip install --root=/opt/pip-root \
|
||||
-r /tmp/taskwiki/requirements.txt
|
||||
|
||||
|
||||
FROM build AS tests
|
||||
RUN apk add --no-cache \
|
||||
git \
|
||||
make \
|
||||
patchelf \
|
||||
tzdata \
|
||||
xvfb-run
|
||||
RUN ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime
|
||||
|
||||
COPY --from=build-vim /opt/vim/ /opt/vim/
|
||||
COPY --from=build-taskwarrior /opt/taskwarrior/ /opt/taskwarrior/
|
||||
COPY --from=build-pip /opt/pip-root/ /
|
||||
|
||||
# install runtime deps of vim/taskwarrior
|
||||
RUN patchelf --print-needed /opt/*/bin/* \
|
||||
| grep -v '^libpython' \
|
||||
| sort -u \
|
||||
| sed -e 's/^/so:/' \
|
||||
| xargs -rt apk add --no-cache
|
||||
ENV PATH=/opt/vim/bin:/opt/taskwarrior/bin:$PATH
|
||||
RUN set -ex \
|
||||
&& task --version \
|
||||
&& vim --version \
|
||||
&& true
|
||||
RUN task --version && vim --version
|
||||
|
||||
ARG VIMWIKI_VERSION
|
||||
RUN git clone --depth 1 --recurse-submodules --shallow-submodules \
|
||||
--branch $VIMWIKI_VERSION https://github.com/vimwiki/vimwiki /root/.vim/bundle/vimwiki
|
||||
|
||||
COPY requirements.txt /root/.vim/bundle/taskwiki/
|
||||
RUN pip install -r /root/.vim/bundle/taskwiki/requirements.txt
|
||||
WORKDIR /root/.vim/bundle/taskwiki
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue