CI/CD:如何 运行 初始设置步骤(yum 升级、deps 安装等)。我应该使用自定义 Docker 图片吗?

CI/CD: How to run the initial setup steps (yum upgrade, deps installation etc). Shoud I use a custom Docker image or not?

我刚刚开始尝试 CI/CD。我想为我的项目创建一个 CI/CD 管道,其中 builds/tests 我在 Linux、MacOS 和 Windows 上的应用程序。对于 Linux 部分,我需要使用特定的 Docker 容器 (quay.io/pypa/manylinux2010_x86_64:latest)。在容器中开始构建之前,我会进行常规设置(例如 yum -y upgrade、安装 CMake 等)。这就是我开始感到困惑的地方。据我所知,在花了一些时间谷歌搜索后,最常见的两种方法如下:

1) 构建一个新的 Docker 容器,它基于 quay.io/pypa/manylinux2010_x86_64:latest 但也安装了其他依赖项。一个示例 Dockerfile 如下所示:

FROM quay.io/pypa/manylinux2010_x86_64:latest

RUN yum -y upgrade \
    yum clean all \
    rm -rf /var/cache/yum \
    git clone https://github.com/Kitware/CMake.git \
    cd CMake \
    git checkout -b build v3.15.3 \
    ./configure \
    make \
    make install \
    cd .. \
    rm -r CMake

此容器构建一次并存储在存储库中。然后,每次 CI/CD 管道运行时,它都会获取并使用此容器。

2) 直接在CI/CD 管道中使用quay.io/pypa/manylinux2010_x86_64:latest 图像并将yum -y upgradeCMake 安装命令作为CI/CD 管道脚本的一部分.这意味着每次 CI/CD 管道运行时,它:(a) 获取 docker 图像,(b) 启动容器,(c) 运行 yum 并安装依赖项。

仅供参考:我主要对 GitLab 和 GitHub Actions CI/CD 服务感兴趣。

我肯定会选择 1。)

选项 2.) 在我看来有缺点,它

  1. 需要更多 CPU(你重复做某事),更多时间,更多带宽,
  2. 是更多的错误 prone/unreliable(分发包回购的每一个小网络中断都会导致构建失败,或者这个级别的所有其他问题。你想保留你的 CI/CD 管道尽可能专注于软件本身的构建。也许那是最重要的部分。如果构建失败,你的办公室应该亮起一个大红灯。你不希望这种情况发生在愚蠢的网络错误上,而只是为了重要的代码错误!
  3. 可能更不确定,因此您可能每次都安装不同版本的已安装软件包...
  4. 从理论上讲,出于安全原因,做一个经过验证和安全的 "master" 并使用它也是有意义的。每次安装(如果未验证)都可能引入安全漏洞...

如果您从事专业软件开发,就像您一样,无论如何您都需要一个 Docker/Container 存储库来上传您的构建工件,通常打包为容器。所以我会构建一个 "golden plate" "build container" 并将其放入您的存储库中,并将其用作 CI/CD 管道中构建的基础。但如果此选项太难,则从选项 2) 开始。