gpt4 book ai didi

docker - 在 Docker 云上的自动化构建中使用 ccache

转载 作者:行者123 更新时间:2023-12-02 19:08:22 25 4
gpt4 key购买 nike

我在 Docker 云上使用自动构建来编译 C++ 应用程序并在图像中提供它。编译时间很长(范围为 2-3 小时)并且在 github 上的提交很频繁(每天约 10 到 30 次)。

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

据我了解,docker caching是没有用的,因为源代码更改不会使用产生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 /

最佳答案

您应该尝试通过第三方服务保存和恢复您的缓存数据:- 像 Amazon S3 这样的在线对象存储- 一个简单的 FTP 服务器- 一台带有 ssh 的 Internet 可用机器,用于制作 scp

I'm assuming that your cache data is stored inside the ´~/.ccache´ directory

使用 Docker 多阶段构建

从一段时间以来,Docker 支持 Multi-stage builds您可以尝试使用它通过单个 Dockerfile 实现解决方案:

Warning: I've not tested it

# 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 云 Hook

另一种不太清楚的方法是使用 Docker Cloud pre_build Hook 文件下载缓存数据:

#!/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

Obviously you can use dedicate docker images to run curl or tar mounting the local directory as a volume in this script.

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

WORKDIR /usr/src/QGIS/build

COPY /.ccache ~/.ccache

RUN cmake ...

为了做到这一点,您应该找到一种在构建后上传缓存数据的方法,您可以使用 post_build Hook 文件轻松地做到这一点:

#!/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,所以它们应该可用)。

关于docker - 在 Docker 云上的自动化构建中使用 ccache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45715746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com