在自动构buildDocker云中使用ccache

我在Docker云上使用自动构build来编译C ++应用程序并将其提供给图像。 编译时间很长(2-3小时),github上的提交频繁(每天大约10到30次)。

有没有办法保持大楼caching(使用ccache)不知何故?

据我了解,dockercaching是无用的,因为源代码的变化,将不会使用生成ccache的编译层。 或者我们可以调整一些数据返回到第一层?

任何其他解决scheme 把它推到什么地方?


这是Dockerfile:

# CACHE_TAG is provided by Docker cloud # see https://docs.docker.com/docker-cloud/builds/advanced/ # using ARG in FROM requires min v17.05.0-ce ARG CACHE_TAG=latest FROM qgis/qgis3-build-deps:${CACHE_TAG} MAINTAINER Denis Rouzaud <denis.rouzaud@gmail.com> ENV CC=/usr/lib/ccache/clang ENV CXX=/usr/lib/ccache/clang++ ENV QT_SELECT=5 COPY . /usr/src/QGIS WORKDIR /usr/src/QGIS/build RUN cmake \ -GNinja \ -DCMAKE_INSTALL_PREFIX=/usr \ -DBINDINGS_GLOBAL_INSTALL=ON \ -DWITH_STAGED_PLUGINS=ON \ -DWITH_GRASS=ON \ -DSUPPRESS_QT_WARNINGS=ON \ -DENABLE_TESTS=OFF \ -DWITH_QSPATIALITE=ON \ -DWITH_QWTPOLAR=OFF \ -DWITH_APIDOC=OFF \ -DWITH_ASTYLE=OFF \ -DWITH_DESKTOP=ON \ -DWITH_BINDINGS=ON \ -DDISABLE_DEPRECATED=ON \ .. \ && ninja install \ && rm -rf /usr/src/QGIS WORKDIR / 

您应该尝试从第三方服务中保存和恢复您的caching数据: – 一个像Amazon S3的在线对象存储 – 一个简单的FTP服务器 – 一台可以连接到Internet的ssh机器

我假设你的caching数据存储在“〜/ .ccache”目录中

使用Docker多阶段构build

从一段时间以来,Docker支持多阶段构build ,您可以尝试使用它来实现一个Dockerfile的解决scheme:

警告:我没有testing过

 # STAGE 1 - YOUR ORIGINAL DOCKER FILE CUSTOMIZED # CACHE_TAG is provided by Docker cloud # see https://docs.docker.com/docker-cloud/builds/advanced/ # using ARG in FROM requires min v17.05.0-ce ARG CACHE_TAG=latest FROM qgis/qgis3-build-deps:${CACHE_TAG} as builder MAINTAINER Denis Rouzaud <denis.rouzaud@gmail.com> ENV CC=/usr/lib/ccache/clang ENV CXX=/usr/lib/ccache/clang++ ENV QT_SELECT=5 COPY . /usr/src/QGIS WORKDIR /usr/src/QGIS/build # restore cache RUN curl -o ccache.tar.bz2 http://my-object-storage/ccache.tar.bz2 RUN tar -xjvf ccache.tar.bz2 COPY --from=downloader /.ccache ~/.ccache RUN cmake \ -GNinja \ -DCMAKE_INSTALL_PREFIX=/usr \ -DBINDINGS_GLOBAL_INSTALL=ON \ -DWITH_STAGED_PLUGINS=ON \ -DWITH_GRASS=ON \ -DSUPPRESS_QT_WARNINGS=ON \ -DENABLE_TESTS=OFF \ -DWITH_QSPATIALITE=ON \ -DWITH_QWTPOLAR=OFF \ -DWITH_APIDOC=OFF \ -DWITH_ASTYLE=OFF \ -DWITH_DESKTOP=ON \ -DWITH_BINDINGS=ON \ -DDISABLE_DEPRECATED=ON \ .. \ && ninja install # save the current cache online WORKDIR ~/ RUN tar -cvjSf ccache.tar.bz2 .ccache RUN curl -T ccache.tar.bz2 -X PUT http://my-object-storage/ccache.tar.bz2 # STAGE 2 FROM alpine:latest # YOUR CUSTOM LOGIC TO CREATE THE FINAL IMAGE WITH ONLY REQUIRED BINARIES # USE THE FROM IMAGE YOU NEED, this is only an example # Eg: # COPY --from=builder /usr/src/QGIS/build/YOUR_EXECUTABLE /usr/bin # ... 

在阶段2中,您将构build将推送到您的存储库的最终图像。

使用Docker云钩子

另一个但不太清楚的方法是使用Docker Cloud pre_build挂钩文件来下载caching数据:

 #!/bin/bash echo "=> Downloading build cache data" curl -o ccache.tar.bz2 http://my-object-storage/ccache.tar.bz2 # eg Amazon S3 like service cd / tar -xjvf ccache.tar.bz2 

很明显,你可以使用专用的docker镜像来运行curl,或者在本脚本中将本地目录作为卷装入本地目录。

然后,在构build过程中,复制.ccache提取的文件夹,在cmake调用之前使用COPY命令:

 WORKDIR /usr/src/QGIS/build COPY /.ccache ~/.ccache RUN cmake ... 

为了做到这一点,你应该find一种方法来在构build之后上传你的caching数据,你可以使用post_build钩子文件轻松做到这一点:

 #!/bin/bash echo "=> Uploading build cache data" tar -cvjSf ccache.tar.bz2 ~/.ccache curl -T ccache.tar.bz2 -X PUT http://my-object-storage/ccache.tar.bz2 

但是你的编译数据不能从外面得到,因为他们住在容器内。 所以你应该在主Dockerfilecmake命令之后上传caching:

 RUN cmake... && tar ... && curl ... && ninja ... && rm ... 

如果curl或tar不可用,只需使用包pipe理器将它们添加到容器中( qgis/qgis3-build-deps基于Ubuntu 16.04,所以它们应该可用)。