跳过主要内容

CI/CD集成指南:快速发布的指南

了解CI/CD集成和管道如何将code连接到更快、更安全的应用程序部署。

马丁·多纳迪厄

马丁·多纳迪厄

内容营销

CI/CD集成指南:快速发布的指南

CI/CD集成是连接您的code仓库到自动化管道的线路,使每个变更在不进行手动交接的情况下通过构建、测试和发布阶段。到2024年, 83%的开发者 参与 DevOps 相关活动,并将 CI/CD 工具使用与更好的交付性能相关联,包括部署频率、领先时间、变更失败率和恢复服务时间 根据 Cloud Native Computing Foundation 的 State of CI/CD 报告.

如果您是领导一个移动团队,您可能已经感受到“构建通过”和“应用程序安全发布”的差距。发布在 Slack 上看起来很好,但在 11 点时会出现问题,因为需要正确的签名密钥、正确的 branch、正确的商店清单和正确的回滚路径。CI/CD 集成不再是噱头,而是团队发布的操作系统。

目录

每个人都想忘记的发布日

星期二上午,开始修复一个应该简单的热修复。到了星期五晚上,同样的补丁仍然停留在一个 branch 中,因为手动 QA 找到了一个更多的问题,发布说明还没完成,三个人在 Slack 中问着谁有最新的构建。晚上 11 点,on-call 工程师重新运行了发布脚本,没人确定 staging 中的 artifact 是否与源代码控制中的匹配。

这就是 CI/CD 整合要解决的问题。它不仅仅是自动化几个任务,而是连接 源代码控制, 构建服务器, 测试运行器, artifact 存储, 和 部署目标 以便每次提交都可以独立前进。关于 CI/CD 的 Red Hat 概述 __CAPGO_KEEP_0__ 描述了这作为一个自动化的DevOps工作流程,通常包括构建、测试、扫描、打包、推广和部署。

什么时候缺少了连接线

当团队把CI/CD当作一个工具时,他们通常会得到部分自动化,并且仍然保留了风险的交接。Code被合并,但仍然需要有人来触发构建。构建完成,但需要有人复制 artifact 到某个地方。测试环境发布成功,但生产环境需要不同的脚本、不同的凭证和不同的记住如何把所有东西放在一起的人。

实践规则: 如果发布依赖于记忆、侧聊或“知道脚本的人”,那么管道还没有被集成。

Cloud Native Computing Foundation 的 2024 年报告也警告说,使用多个相同类型的工具会损害交付性能,因为互操作性会变得更难 CI/CD 的现状报告. 这在大型团队中很重要,因为集成不是拥有更多工具,而是让工具们同意同一个真实来源。

一个健康的CI/CD设置给你从提交到用户的单一路径。一个弱的设置给你一个岛屿的集合,每个岛屿都有自己的手动桥梁。这种差异在发布日最快地体现出来,正是团队最不需要混乱的时候。

CI 和 CD 的分解

一个图表,展示了软件开发管道中的连续集成和连续交付的概念。

一旦将想法分开,发布流程就变得更容易理解了。 CI 关注频繁合并小的变更并自动检查它们。 CD focuses on keeping validated code ready for release, then deciding whether production receives that code with or without a human approval step.

CI是预备站

持续集成从简单的习惯开始,保持变更小并及时验证。在软件术语中,每次提交或合并请求都会触发自动检查,以便不破坏的code在大规模发布之前就暴露出来。与之类似,忙碌的厨房会在服务开始之前对食材进行分类和检查,只不过这里的“预备”是构建和测试自动化,而不是切好的蔬菜。

Red Hat的CI/CD指南 的操作定义与此模型相符。CI是自动化的构建和测试 discipline,它捕捉到集成问题。较小的变更更容易验证,当某些内容失败时,团队可以不猜测哪部分发布引起了问题而追踪它。

CD有两个含义,团队混淆了它们

持续交付意味着code始终可部署,但仍由人决定何时进行生产。持续部署则进一步一步,自动部署每次通过的变更。这种区别对于合规性、风险承受能力和移动和桌面团队通常需要的发布控制都很重要。

A release manager on a consumer app may prefer continuous delivery because store timing still needs coordination. A backend team with strong automated checks may choose continuous deployment for low-risk services. The right choice depends on governance, not slogans.

对于试图在CI方面加强自动化发布的团队来说 这是一份专注于CI的指南 它保持了集成质量的焦点,这是发布可靠性的起点

CI/CD阶段的比较 Web应用 CapacitorJS移动应用 Electron桌面应用
触发 推送或合并请求开始验证 推送或合并请求开始验证 推送或合并请求开始验证
构建 打包应用 将 web 应用打包为 code,然后将其 wrap 在一个原生 shell 中 编译主和渲染器 code,然后打包桌面应用
测试 单元、集成和 UI 测试 添加 wrapper 和运行时行为的移动设备特定检查 添加打包和应用启动路径的桌面设备特定检查
发布 部署到托管或应用运行时 发布到商店频道或实时更新频道 发布安装程序或实时更新频道
审批 可选人工门控 常用于控制存储和回滚 常用于控制签名和分发

CI/CD pipeline的解剖

一个图表,展示了从源代码到生产环境的软件开发CI/CD pipeline的六个顺序阶段。

A pipeline is just a graph of jobs with inputs and outputs. Once a developer pushes code, a webhook or merge event triggers the first job, then the next job consumes the artifact from that stage, and so on until the release is ready. That’s why CI/CD integration is really a contract between stages, not a mysterious platform feature.

各个阶段的作用

The source-control trigger starts the flow. Build jobs compile the code and resolve dependencies, which is where a lot of hidden breakage shows up. Test jobs then run unit, integration, and UI checks, while security scans look for vulnerable packages or unsafe configurations.

一个好的pipeline会快速失败,并且会告诉你它失败的位置。

之后,打包任务将验证的输出转换为可部署的形式,如容器镜像、签名的APK或IPA、Electron可执行文件或JavaScript包。 CI/CD的HCL概述和实施 CI/CD 整合是有用的,因为它展示了团队如何经常在部分自动化中停下。许多团队都有管道,但并不是每个阶段都完全连接。

为什么阶段边界很重要

如果你无法在每个交接点命名 artifact,调试就变成了猜测。如果在发布阶段失败,需要知道问题是否来自依赖解析、测试不稳定、安全策略还是打包。因此,好的管道设计应该包括从提交到 artifact 到环境的内部追踪。

对于想要了解构建部分如何融入更大流程的团队来说 这个构建为焦点的指南 值得一看。它有助于将构建阶段的责任与发布orchestration的责任区分开来。

CI/CD 如何在移动和桌面应用中有所不同

Web pipeline会让人们误以为CI/CD主要是关于推送一个包到服务器。native delivery改变了规则。使用 CapacitorJS你仍然会构建 web code, 但你也会将其打包到native shell中,然后管理签名和平台特定的发布路径。使用 Electron你会为桌面环境编译应用,然后打包安装程序或可分发文件到你支持的操作系统中。

What changes once the app ships to devices

移动团队需要考虑签名密钥、App Store 和 Play 评审、以及在运行时的更新频道。桌面团队则需要处理安装程序、code 签名以及跨平台的更新行为。共享的模式很明显,但code 可能会通过相同的仓库和构建触发器进行传递,但发布的表面是不同的。

The GitHub 提供的关于优化 CI/CD pipeline 的指导 指向了阶段性测试、特性标志和回滚检查点,这些实践在这种世界中非常合适。这些实践在构建时更为重要,因为构建生活在包装器或安装程序中,因为发布不仅仅是‘code 是否编译通过’,而是‘这个包在真实设备上是否安全运行’。

What mobile and desktop teams add on top

Web 发布通常可以在 staging 或 production 部署时停止。移动发布通常需要额外的层级来处理频道、审批和回滚行为。Electron 团队需要同样的纪律,但使用桌面包装和更新分发代替 App Store 提交。

  • CapacitorJS mobile: Web 包、原生包装器、签名、商店评审和实时更新频道
  • Electron desktop: 主进程构建、渲染器构建、打包的安装程序、签名和更新频道控制
  • Web app: 构建、测试、打包、部署和监控

在CI/CD中,实时更新系统取代了一个侧项目。 如果您的构建可以生成捆绑包,那么您的发布系统仍然需要决定如何安全地将其传递给用户。

核心组件使集成工作

触发器、管道、工件和环境是团队重复学习的四个硬道理。 触发器是启动作业的事件,通常是Git推送或合并请求。 管道是有序的作业集。 工件是经过验证的输出。 环境是输出被推广或保留的地方。

四个组件的简单解释

触发器是Git和自动化之间的握手。 管道定义了运动规则,首先构建,然后测试,然后扫描,然后打包,然后发布。 工件携带了工作的结果前进,这就是为什么同一个捆绑包应该被测试和部署的原因。

环境给您一个安全的地方来分离意图和影响。 Dev、Staging、Beta和Production在这里做了真正的工作。 它们让团队在一个地方证明一个改变,然后在另一个地方的用户依赖它之前。

经验法则: 如果一个环境无法追溯到一个提交和一个工件,那么它就是一个风险,而不是一个安全网。

Capgo在实时更新流程中的位置

对于CapacitorJS和Electron应用,Capgo位于实时更新层,签名的Web包可以发布到频道,更新可以差异化,回滚可以将设备恢复到最后一次已知良好包。因此管道比二进制发布路径更复杂。它变成了一个控制平面,用于在原生应用中管理Web资产。

Capgo的管道集成,例如GitHub Actions、GitLab CI/CD、Azure DevOps和Bitbucket Pipelines的文档在其自身材料中,用于自动化从CI到基于频道的发布的构建和部署流程。如果您正在比较发布工具与工作职责或平台期望,高级团队通常希望工程师能够对端到端集成进行推理,而不仅仅是构建脚本。一个具体的例子是Coinbase软件工程师在区块链工作中的集成角色 ,反映了在现实中的组织中发布管道的重要性。对于密钥管理

__CAPGO_KEEP_0__关于在CI/CD管道中管理密钥的指南 Capgo’s guidance on managing secrets in CI/CD pipelines 安全性和合规性在管道中内置

安全性在CI/CD中是一个控制问题,而不是一个复选框。美国国防部对CI/CD环境的指导将管道视为一个受保护的路径,必须在整个端到端保护存储库、构建系统、凭据和工件路线。

__CAPGO_KEEP_1__ 关于CI/CD环境防御的指南. 在产品团队中,这种框架也很有用,因为你信任的管道是最快的管道。

属于流程内部的控制

短期凭证可以减少token泄露的损害。签名的艺术品可以证明bundle或二进制来自预期的管道。SBOM和SCA检查在发布前暴露依赖风险,审计日志使每个操作都可追溯,当审阅者问到什么改变了和谁批准了时。

The CISA和DHS关于CI/CD管道防御的指南 强调了安全扫描、日志记录、签名配置和减少凭证存活时间应该在管道本身。对于金融、医疗保健和电子商务等受监管团队来说,这是正确的思维模式。合规不是事后添加的,而是发布路径的一部分。

安全被添加后,发布仍然应该快速

团队通常会惊慌失措,想象一堆手动门槛。然而,这不是必要的。策略可以在管道中存活,批准可以限制到正确的环境,扫描可以自动运行而不必让每个发布变成会议。

一些团队还选择将签名的bundle作为交付链的一部分,这样就可以保持从构建到设备的完整性检查。关于这一点的实践方面的深入了解 这个CI/CD安全指南 是一个有用的参考。主要思想是相同的,安全应该在交付系统中,而不是围绕它。

发布后故障排除和可观察性

不可见的管道是不可信的管道。失败的构建通常会引发一个简单的问题:它在哪里打破了。坏的发布会问一个更难的问题:失败是来自打包、环境漂移还是更新本身。因此,观察性必须覆盖构建路径和在线发布路径,因为两者都可以引入看起来类似的问题。

重要信号

构建日志告诉你哪个任务失败了。测试抖动模式显示问题是否出现在code还是在周围的基础设施中。部署健康状况告诉你是否发布顺利通过了门户。CNCF报告中的DORA透镜,部署频率、lead时间、变更失败率和恢复服务时间,仍然为团队提供了判断系统是否有帮助的实际方法。 CI/CD报告.

如果您无法在几分钟内回答“什么改变了、在哪里和在哪些设备上”,您的可观察性对于在线更新工作流程太浅了。

发布出现问题时要检查什么

首先将故障的发布与提交历史进行关联。然后检查引入故障的阶段的测试和部署日志。对于在线更新,设备级别的遥测很重要,因为同一个捆绑包在不同设备类别、操作系统版本或应用状态下可能会表现出不同的行为。

Capgo的每台设备日志、采用率指标、版本历史和频道保护措施都是为此类事件审查而设计的。对于警报, Capgo关于在CI/CD管道中添加警报的指南 展示了如何将这些信号转换为通知,而不是等待用户报告问题。

从CI/CD之旅的下一步

CI/CD集成是一项成熟度之旅,而不是一个复选框。通常能够自信地交付的团队已经将基础设施连接起来,然后在上面添加安全性、发布orchestration和回滚纪律。通常会感到紧张的团队将自动化分散在各个地方,但没有一个连接的流程。

成熟度之旅的三个阶段:基础、进阶和高级的图表

快速自我检查有助于。触发器是否自动化?是否有签名的工件?是否可以追溯到一个提交?是否有一个可以在压力下执行的回滚政策?如果答案在任何一个方面模糊,那么下一个改进就很明显。

将管道视为产品,而不是脚本集合。缩短反馈环节,添加风险所在的政策,并在应用架构需要时将交付扩展到实时更新通道。


Capgo帮助团队将CI/CD集成到CapacitorJS和Electron应用的实时更新交付中,使签名的捆绑包、目标频道和回滚保护成为同一发布流程的一部分。如果您的团队正在尝试从手动发布转换为受控更新系统,请访问 Capgo 并看看它如何融入您的管道中。

Capacitor应用的实时更新

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

来自Martin的人性化支持

Capgo gives you the best insights you need to create a truly professional mobile app.