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 upgrade
和CMake
安装命令作为CI/CD 管道脚本的一部分.这意味着每次 CI/CD 管道运行时,它:(a) 获取 docker 图像,(b) 启动容器,(c) 运行 yum
并安装依赖项。
有人可以向我提供一份清单,列出这两种方法的所有优点、缺点和技术影响吗?我能想到的是方法 (1) 在 CI/CD 构建期间花费的时间较少,但与此同时,用户必须负责构建和托管自定义 Docker 图像。
这两种方法中的任何一种都被认为是不好的做法吗?
根据我的用例,你能帮我选择哪种方法适合我吗?
仅供参考:我主要对 GitLab 和 GitHub Actions CI/CD 服务感兴趣。
我肯定会选择 1。)
选项 2.) 在我看来有缺点,它
- 需要更多 CPU(你重复做某事),更多时间,更多带宽,
- 是更多的错误 prone/unreliable(分发包回购的每一个小网络中断都会导致构建失败,或者这个级别的所有其他问题。你想保留你的 CI/CD 管道尽可能专注于软件本身的构建。也许那是最重要的部分。如果构建失败,你的办公室应该亮起一个大红灯。你不希望这种情况发生在愚蠢的网络错误上,而只是为了重要的代码错误!
- 可能更不确定,因此您可能每次都安装不同版本的已安装软件包...
- 从理论上讲,出于安全原因,做一个经过验证和安全的 "master" 并使用它也是有意义的。每次安装(如果未验证)都可能引入安全漏洞...
如果您从事专业软件开发,就像您一样,无论如何您都需要一个 Docker/Container 存储库来上传您的构建工件,通常打包为容器。所以我会构建一个 "golden plate" "build container" 并将其放入您的存储库中,并将其用作 CI/CD 管道中构建的基础。但如果此选项太难,则从选项 2) 开始。
我刚刚开始尝试 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 upgrade
和CMake
安装命令作为CI/CD 管道脚本的一部分.这意味着每次 CI/CD 管道运行时,它:(a) 获取 docker 图像,(b) 启动容器,(c) 运行 yum
并安装依赖项。
有人可以向我提供一份清单,列出这两种方法的所有优点、缺点和技术影响吗?我能想到的是方法 (1) 在 CI/CD 构建期间花费的时间较少,但与此同时,用户必须负责构建和托管自定义 Docker 图像。
这两种方法中的任何一种都被认为是不好的做法吗?
根据我的用例,你能帮我选择哪种方法适合我吗?
仅供参考:我主要对 GitLab 和 GitHub Actions CI/CD 服务感兴趣。
我肯定会选择 1。)
选项 2.) 在我看来有缺点,它
- 需要更多 CPU(你重复做某事),更多时间,更多带宽,
- 是更多的错误 prone/unreliable(分发包回购的每一个小网络中断都会导致构建失败,或者这个级别的所有其他问题。你想保留你的 CI/CD 管道尽可能专注于软件本身的构建。也许那是最重要的部分。如果构建失败,你的办公室应该亮起一个大红灯。你不希望这种情况发生在愚蠢的网络错误上,而只是为了重要的代码错误!
- 可能更不确定,因此您可能每次都安装不同版本的已安装软件包...
- 从理论上讲,出于安全原因,做一个经过验证和安全的 "master" 并使用它也是有意义的。每次安装(如果未验证)都可能引入安全漏洞...
如果您从事专业软件开发,就像您一样,无论如何您都需要一个 Docker/Container 存储库来上传您的构建工件,通常打包为容器。所以我会构建一个 "golden plate" "build container" 并将其放入您的存储库中,并将其用作 CI/CD 管道中构建的基础。但如果此选项太难,则从选项 2) 开始。