在 Docker 云上的自动生成中使用 ccache



我正在使用Docker云上的自动生成来编译C++应用程序并将其提供在映像中。 编译时间很长(范围 2-3 小时(,github 上的提交很频繁(每天 ~10 到 30 次(。

有没有办法以某种方式保留建筑缓存(使用 ccache(?

据我了解,docker 缓存是无用的,因为由于源代码更改,生成 ccache 的编译层不会被使用。 或者我们可以调整一下,将一些数据带回第一层吗?

还有其他解决方案吗?把它推到某个地方?


这是 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 /

您应该尝试从第三方服务保存和恢复缓存数据: - 像亚马逊S3这样的在线对象存储 - 一个简单的FTP服务器 - 一台带ssh的互联网机器,可以制作scp

我假设您的缓存数据存储在"~/.ccache"目录中

使用 Docker 多阶段构建

从一段时间开始,Docker 支持多阶段构建,您可以尝试使用它通过单个 Dockerfile 实现解决方案:

警告:我还没有测试过

# 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
# E.g.:
# COPY --from=builder /usr/src/QGIS/build/YOUR_EXECUTABLE /usr/bin
# ...

在第 2 阶段,您将构建将推送到存储库的最终映像。

使用 Docker 云钩子

另一种不太清楚的方法可能是使用 Docker Cloudpre_build钩子文件下载缓存数据:

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

显然,您可以使用专用的 docker 映像来运行 curl 或 tar,在此脚本中将本地目录挂载为卷。

然后,在生成期间将.ccache提取的文件夹复制到容器内,在cmake调用之前使用COPY命令:

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

为了做到这一点,你应该找到一种方法在构建后上传你的缓存数据,你可以使用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

但是您的编译数据无法从外部获得,因为它们位于容器内。因此,您应该在主Dockerfile中的cmake命令之后上传缓存:

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

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

相关内容

  • 没有找到相关文章

最新更新