实施 CI/CD 是否需要先决条件步骤?

Does implementing CI/CD require prerequisite steps?

我正在尝试了解 CI/CD 策略。

许多 CI/CD 文章提到它是构建、测试、部署阶段的自动化服务。

我想知道 CI/CD 概念是否有任何先决条件步骤?

例如,如果我制作了一个自动构建和部署的简单工具,但测试步骤是手动的 - 这可以考虑 CI/CD 吗?

首先应该提到一个小细节:“CI/CD”中的“D”可以表示“交付”或“部署”。出于这个问题的考虑,我们将接受这两个术语作为相对可互换的——但请注意,其他人可能会应用更狭义的定义,具体取决于您指的是哪个“D”,该定义可能会略有不同。有关其他上下文,请参阅:

For example, if I make a simple tool that automatically builds and deploys, but test step is manual - can this be considered CI/CD?

让我们分解一下。事先,让我们确定什么可以被认为是“CI/CD”。足够简单:如果您的(自动化)流程正在实践 CI(持续集成)和 CD(持续部署),那么我们可以将解决方案视为某种形式的“CI/CD”。

我们需要对 CI 和 CD(见上文 link)进行一些定义,这可能因意见而异。但是,如果问题是这个 是否可以 被认为是 CI/CD,我们可以继续进行 popular/accepted 定义的最低公分母/最低限度,并自由地应用这些定义作为它们与 CI/CD.

的原则相关

在这种情况下,让我们继续确定构成成分是否存在。

是否在实践持续集成?

是的。这个场景正在实践持续集成。从最基本的意义上讲,持续集成是确保您正在进行的工作定期(持续)集成(测试)。

整个想法是为了解决集成(测试)太不频繁的后果。如果您进行了很多更改并且从不尝试 build/test 软件,那么这些更改中的任何一个都可能会破坏构建,但是直到集成(测试)发生的时间点您才会知道。

您定期集成更改并确保软件仍在构建。这在实践中是明确的CI

但是没有自动化测试?!

有人可能会反对“如果你不是 运行 传统上认为的测试(单元|集成|烟雾|等)作为自动化过程的一部分,它不是CI”——这显然是错误的陈述。

即使在这种情况下您提到您的“测试”步骤是手动的,但仍然公平地说,只需 构建 您的应用程序就足以满足基本定义持续集成意义上的“测试”。成功地构建(例如编译)你的代码本身就是一个测试。您正在有效地测试“它能否构建”。如果您的代码更改破坏了 compile/build 流程,您的 CI 流程会在提交代码后立即告诉您 - 这就是 CI 的实际效果。

就像代码更改可能会破坏单元测试一样,它们也可能会破坏编译过程——使您的构建自动化 测试您的更改不会破坏构建,因此,一种持续集成,毫无疑问。

当然,您的产品 可能会因您的更改而损坏,即使它编译成功。甚至这些软件缺陷可能已经被足够的单元测试发现了。但是对于 具有 适当单元测试的项目,甚至具有“100% 代码覆盖率”的项目也是如此。我们当然不会认为有测试差距的项目没有实践CI。测试间隙的大小不区分CI和非CI;与定义无关。

底线:构建你的软件练习(integrates/tests)你的代码更改,即使只是最小的显着程度。在持续的基础上这样做是持续集成的一种形式。

是否连续 Deployment/Delivery 正在练习

是的。很明显,在这种情况下,如果您 deploying/delivering 您的软件以自动化方式 'production environment' ,那么您至少拥有 CI/CD 的“CD”组件在某种程度上。您的测试可能是手动的这一事实并不重要。

与上述类似,理性的人可能会根据细节对实施的有效性提出异议,但无法证明这种做法是非 CD,根据定义。

结论:这种做法可以算作“CI/CD”吗?

是的。 CI 和 CD 的两个元素至少以最小程度存在。所使用的做法可能不能合理地称为非 CI 或非 CD。因此,应该得出结论,这种描述的做法可以被视为“CI/CD”。

我认为不言而喻,所描述的 CI/CD 流程存在差距,可以从改进中获益,并且由于缺乏自动化测试和其他功能,无法获得 robust CI/CD 进程可以提供。但是,这不会以任何方式呈现进程 non-CICD。在实践中肯定是CI/CD;它是特别 还是 稳健 CI/CD 实践是一个主题。

does CI/CD concept have any prerequisites step(s)?

不,应用 CI/CD 概念没有特定的先决条件(例如编写自动化软件测试)。您可以独立应用 CI 和 CD,无需任何先决条件。

为了进一步说明,让我们考虑一个更小的项目,其中包含“CI/CD”...

CD 可以像提交到 GitHub Pages. If that same Pages repo, for example, uses Jekyll, then you have CI, too, as GitHub will build your project automatically in addition to deploying it and inform you of build errors 的主分支存储库一样简单。

在这个基本示例中,实现“CI/CD”唯一需要做的就是将 Jekyll 项目代码提交到 GitHub Pages 存储库。没有先决条件。

甚至在某些情况下,您可以准确地将项目视为具有 CI 过程,而 CI 过程甚至可能根本不构建任何软件!例如,CI 可以只包含代码风格检查或其他琐碎的检查,例如检查文件末尾的换行符。当项目只包含这些类型的检查时,我们仍然会称该检查过程为“CI”,这不会是对过程的不准确描述。