在自动构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
但是你的编译数据不能从外面得到,因为他们住在容器内。 所以你应该在主Dockerfile
的cmake
命令之后上传caching:
RUN cmake... && tar ... && curl ... && ninja ... && rm ...
如果curl
或tar不可用,只需使用包pipe理器将它们添加到容器中( qgis/qgis3-build-deps
基于Ubuntu 16.04,所以它们应该可用)。