跳过主要内容
移动 更新 CI/CD

持续集成设置(Capacitor 和 Electron 应用)

掌握 CapacitorJS 和 Electron 应用程序的持续集成设置。学习管道配置、签名、 artifact 管理和 Capgo 实时更新。

持续集成设置(Capacitor 和 Electron 应用)

您通常可以通过以下方式判断一个混合应用团队是否已经超出了其构建过程。有人仍然登录到 Mac,点击 Xcode,导出 Android artifact,手动签署 Electron 包,并尝试记住哪个分支匹配上传的构建。发布成功,但只有因为一两个人知道每个步骤的内容,才会成功。随着这些人的繁忙,停止扩展。

一个合适的 持续集成设置 取代了脆弱的仪式的可重复管道。马丁·福勒的 CI 定义仍然捕捉到了核心思想,团队成员至少每天将更改合并到共享代码库中,每次集成都由自动构建验证,以便错误尽快浮现 福勒的原始持续集成文章. That discipline matters even more for Capacitor and Electron apps, where one build can touch web assets, native wrappers, signing credentials, and live update publishing in the same run.

目录

为什么您的 Capacitor 和 Electron 应用需要一个真正的 CI pipeline

起始点通常是熟悉的。开发者在本地运行 web 构建,同步 Capacitor,打开 Xcode 或 Android Studio,导出一个签名的二进制文件,并将其放入共享驱动器或聊天线程中。它感觉高效,直到第一次构建只在一个机器上工作,证书到期没有警告,还是一个队员从一个陈旧的 branch 发布,因为手动步骤没有写下来。

这痛苦不仅仅是速度,还有可重复性

福勒的基本规则仍然解释了为什么这个过程会失败。一个可信的CI设置将所有内容放在版本控制中,自动化构建,构建自我测试,触发每次推送到主线,立即修复破损的构建,并保持构建速度 福勒的CI指导。这不是关于“运行测试”,而是关于使发布工作可见、枯燥且难以出错

实践规则: 如果发布依赖于某人记住一个本地命令,它就不是管道

Capacitor团队在三个地方感受到断裂。原生项目文件与Web应用程序脱节,签名凭证成为部落知识,更新路径变得混乱,因为没有人信任哪个捆绑包版本到达测试者。Electron团队遇到类似的问题,当打包依赖于本地OS状态,原生依赖项或开发人员的临时签名设置时

一个真正的管道给你一个共享的真相。它每次都运行相同的检查,使用干净的运行器,并留下了艺术品和日志,告诉你什么改变了。这就是“我们构建了它”和“我们可以证明我们构建了什么”的区别

为什么live update工作流程适合这里

一旦管道可复现,live update 发布就成为同一发布流程的一部分,而不是人们在记得时运行的单独脚本。对于混合团队来说,这很重要,因为 Web 资产、JavaScript 修复和配置更改不需要等待完整的应用商店周期。结构化的 CI 流程使得可以只构建一次、只验证一次,然后将相同的输出推送到正确的渠道,并且具有可追踪性。

这也是工具__CAPGO_KEEP_0__的 CI 优势概述 Capgo的CI优势概述 选择适合混合应用的 CI 提供商

对于混合应用,提供商选择比纯 Web 工作更重要。只需要 Linux 运行器且

可以容忍一些粗糙边缘的管道。需要 macOS 运行 iOS 签名、Docker 运行 Electron 打包以及必须永远不泄露到日志中的机密的管道需要更紧密的运行器控制、更清晰的隔离和更安全的权限模型。 npm install __CAPGO_KEEP_0__’s CI benefits overview

A不仅要适应构建步骤,还要适应发布路径。 Capacitor 和 Electron 团队经常处理原生应用签名、 artifact 推送和 live update 发布的整个流程,因此 CI 系统必须将这些步骤分开,而不使流程难以审计。如果运行器模型较弱,签名材料就会被复制得太随意。如果 artifact 处理不当,您会失去对已发货产品的信心。这是通用 CI 指南通常会忽略的部分。

GitHub Actions 适合已经生活在 GitHub 的团队。

GitHub Actions 是如果源代码已经存放在 GitHub 中的团队的最低摩擦选择。工作流程位于应用 code 旁边,使审查和拥有变得简单,而且该平台支持 Linux、Windows 和 macOS 运行器在 CI 工具比较中描述的源代码控制和运行器模型。 GitHub Actions 运行器模型和 SCM Coupling对于混合团队来说,这很重要,因为 iOS 构建需要 macOS,而 Electron 打包通常更适合在 Linux 或 Windows 任务中保持容器化。同时也更容易将签名密钥限制在需要它们的工作流中。

The trade-off is that GitHub Actions can become noisy if you treat every job the same. It works well for teams that already use GitHub for code review, branch protection, and release ownership. It is less attractive if your build, registry, and deployment controls live somewhere else and you want the CI system to own more of the release process. For a lot of mobile teams, the convenience still wins because the workflow file and the code review happen in the same place.

当仓库和交付存储在一起时,GitLab CI 就会变得强大。

GitLab CI 适用于希望将仓库、管道和环境跟踪在一起的团队。它支持共享或自管理的运行器,并且在平台模型中包含了部署阶段,这使得当同一团队拥有构建、测试和发布orchestration时变得实用。 GitLab CI 平台模型这种设置有助于在不散布决策在不同系统中的情况下分离签名、打包和发布审批。

这种权衡是组织层面的。如果您的团队已经使用 GitLab 进行源代码控制和注册表存储,管道会感觉更加集成且更容易审计。如果不是,那么设置成本可能会超过方便性,尤其是当您开始为 iOS 签名配置 macOS 运行器或保持 live update 发布与同一发布过程保持一致时。对于想要一个具体的 GitLab 模式的团队来说 Capgo 的 GitLab 构建和发布指南 因为它展示了如何将构建和发布步骤绑定在一起而不将管道转变为手动清单的参考。

CircleCI 适合那些想要托管灵活性的团队。

CircleCI usually makes sense when a team wants managed execution with a strong ecosystem around packaging and build automation. Its cloud executors and self-hosted options make it flexible across GitHub, GitLab, and Bitbucket repos, and that portability helps when a hybrid team moves between customers or codebases CircleCI 执行模型. 对于 Capacitor 和 Electron 工作的好处是,可以将构建逻辑保持紧凑,同时使用提供商功能选择执行器和作业隔离。

然而,这种可移植性可能会掩盖复杂性。一旦添加 macOS 签名、 artifact 推送和更新发布,仍然需要有纪律的机密处理和明确的作业边界。CircleCI 适合那些想要托管运行器并愿意学习一些提供商特定工作流模型以实现这一点的团队。

标准 GitHub 操作 GitLab CI CircleCI
Capacitor/Electron 构建支持 适合 GitHub-优先团队,具有 macOS、Linux 和 Windows 运行器 适合已经在 GitLab 上使用共享或自主管理的运行器的团队 强大的多 SCM 主机支持
配置容易 如果 code 已经在 GitHub 中,则低摩擦 紧密的平台集成,但最佳体验需要整个堆栈都在 GitLab 中 灵活的,但需要更多的供应商特定设置
免费层限制 最佳选择是公共 GitHub 仓库,尤其适合小项目 最佳价值来自 GitLab 已经是系统记录 经常选择管理执行而不是最小设置成本

一个比较表格,展示 GitHub Actions、GitLab CI 和 CircleCI 的特性,用于构建混合应用

The right choice usually comes down to where the code already lives and which runner types you need most often. A Capacitor app under iOS shipping pressure benefits from easy macOS access. An Electron-heavy product with predictable packaging can prioritize Docker-friendly jobs and artifact handling instead. If you also publish live updates from the same pipeline, choose the provider that keeps release permissions and signing steps easiest to separate.

一个有用的方法是用一个问题来比较它们。它能否在不使用麻烦的工作方式的情况下运行您需要的本机作业,能否控制机密,团队成员能否在不打开第二个wiki页面的情况下阅读配置?

构建您的管道配置

混合管道在cheap检查失败时工作最佳,expensive运行者在需要时才会被调用。linting、单元测试和web构建应该在macOS开始编译iOS或Electron打包生成一个签名的artifact之前完成。这种顺序可以避免破坏的更改耗尽运行时间,并且符合CI模式:快速检查先行,后续更重的套件,最后一次构建在推广相同的artifact通过后续阶段 JetBrains CI/CD最佳实践.

一个GitHub Actions形状确实有效

一个实用的布局保持简单和可预测:

  1. 检出
  2. 安装依赖项
  3. lint和单元测试
  4. 构建web资产
  5. 同步本机项目
  6. 打包平台artifact
  7. 上传文件

这段序列会将破损的code远离昂贵的本机作业。它还使缓存行为更容易理解,因为npm、Gradle和包管理器缓存只有在依赖图表已经有效时才起作用。

一个紧凑的GitHub Actions作业通常遵循以下结构,即使项目细节发生变化:

  • 安装一次: 恢复Node和包缓存之前 npm ci.
  • 验证早期: 运行lint和单元测试之前任何本机构建。
  • 构建Web输出: 创建Capacitor和Electron都使用的资产包。
  • 分支到平台作业: 让iOS、Android和Electron打包只在共享步骤通过后运行。
  • 发布文件 将签名输出、日志和元数据分开上传。

您延迟的本地工作越多,直到共享检查通过,失败的成本就越低。

对于同时发布移动和桌面目标的团队,通常会将这些目标分开,通常会将管道分成可管理的和嘈杂的。 Xcode 失败很昂贵,因为它们消耗 macOS 分钟和开发人员的注意力,而失败的 lint 任务几乎是免费的。 将所有内容放在一个大型作业中,通常会随着构建开始处理真实签名、更新发布和发布权限而变得过时。

GitLab 和 CircleCI 可以镜像相同的逻辑。

GitLab CI 可以清晰地映射到阶段作业,CircleCI 也可以,尽管语法不同。 重要的是要在所有三个工具中保持相同的管道形状。 一个源构建会向下游作业提供输入,然后每个本地打包步骤都会消耗相同的 code 状态,而不是从头开始重建。

如果您使用 Docker 进行 Electron 打包,请将容器镜像固定以保持环境可复现。如果您构建 iOS,请将 macOS 任务隔离并将证书步骤与编译步骤分开,以便失败模式保持明显。如果您运行 Android 构建,请保持 Gradle 缓存稳定并避免将不相关的包安装混合到同一个 shell 步骤中。

对于一个 Capacitor-oriented 的版本的设置,请参阅 Capacitor 的管道设置指南。 Capgo 的管道设置指南是一个有用的伴侣。 一个图表,展示了使用 __CAPGO_KEEP_1__ Actions 构建 __CAPGO_KEEP_0__ 和 Electron 应用程序的五步连续集成管道。

一个图表展示了一个五步的持续集成管道,用于构建Capacitor和 Electron 应用程序使用GitHub Actions。

Code 签名和 artifact 管理

签名是许多好管道失败的地方。构建通过,包存在,但发布失败,因为证书丢失,密钥链未释放,或者上传的 artifact 错误。解决方案是将签名视为自己的控制阶段,而不是打包的副作用。

iOS、Android 和 Electron 需要不同的处理

iOS 签名通常意味着证书、配置文件和 macOS 运行状态。Android 需要密钥库管理和您的 Play 发布路径所需的内容。Electron 添加了 code 签名证书,并在 macOS 上进行了可分发的桌面构建的 notarization。每个步骤都应该由管道处理,而不是人类将文件复制到运行器。

对于 iOS,团队通常使用 fastlane match 或在 macOS 运行器上手动安装证书。重要的是要保持一致性,而不是具体的助手。如果您的工作流依赖于开发人员交互式访问密钥链,它将最终在最糟糕的时间打破。

对于 Android,请将密钥库保留在仓库外,并将其作为构建时间的秘密注入。对于 Electron,请将签名步骤保留在打包步骤附近,以避免意外签名陈旧的 artifact。

实用规则: 签名的 artifact 应该是您计划分发的 artifact,签名后应保持该 artifact 不可变。

artifact 管理应保留可追溯性

artifact管理不仅仅是存储。它是如何知道哪个二进制来自哪个提交以及它被发送到哪个频道的。因此,Fowler关于使版本信息可见的老指导在企业CI系统中仍然重要,因为构建ID、部署元数据和发布跟踪帮助团队在后期回答支持问题 Fowler关于可见版本信息的指南.

保留签名输出长时间以便回滚、审计和支持重现,但不要留下无上下文的发布。清晰的命名方案、提交SHA和平台标签可以大大帮助。如果您的管道上传到TestFlight、Google Play内部测试或Electron分发桶,请使上传步骤明确以便可以检查CI中什么被上传

Capgo的 证书管理指南 是相关的,因为同样的纪律也适用于原生签名和更新发布。需要将凭据存储在安全的位置、清洁地旋转并且不要将其回显到日志中

自动化Capgo Live Updates

Once the build is stable, live update publishing is often the part of the stack that saves the most time. Hybrid teams do not want to wait for a store review just to fix copy, ship a web bug fix, or flip a config flag. A CI-driven Capgo publish step handles those cases without turning the native release process into a bottleneck, and it keeps the update path tied to the same controls you already use for builds.

基于频道的发布让发布过程受控

发布到 测试环境 在开发分支的合并和 生产环境 只有在打上标签的发布时才发布。这样可以让测试人员在可预测的频道上工作,同时使生产环境的推送变得有条不紊并且可审查。管道应该将Capgo API作为一个秘密存储下来,安装CLI,打包最新的Web资源,并将更新作为作业的一部分发布。

一个简单的策略在实践中很有效:

  • 开发分支: 推送到测试环境频道。
  • 发布标签: 推送到生产环境频道。
  • 紧急修复分支: 保持发布直到拥有者确认发布意图。

CI 和实时更新相互强化,因为管道已经知道它正在构建哪个提交。使用该元数据在Capgo发布步骤中,以便更新历史保持可读,特别是在您需要回答哪个 Web 支付与特定本机构建相关时。

差异更新和回滚行为很重要

Capgo的更新模型围绕发送仅更改的文件和安全回滚,如果出现问题,自然适合 CI 驱动的发布流程。因此管道不仅仅是交付资产,它还决定了那些资产如何在不同人群和渠道之间移动。对于频繁发布的团队来说,这种控制比一次性手动发布脚本更有用。

来自 https://capgo.app 的截图

我看到的主要错误是将发布步骤视为独立任务。通常会导致有人从笔记本电脑上运行它,这会破坏管道的目的并削弱可追踪性。将其放入 CI,根据分支或标记规则进行门控,并在构建输出中保留发布元数据,以便支持人员可以以后追踪它。

具体到GitHub Actions 模式 Capgo的GitHub Actions 集成指南 保护 CI 管道免受真实威胁

__CAPGO_KEEP_0__

A成功的管道仍然可能不安全。国家安全局和CISA的政府指南将CI/CD安全视为首要问题,建议将安全扫描集成到CI/CD中,保留审计日志,签署CI/CD配置,使用SBOM和SCA,保护机密以防止它们以明文传递,使用灾难恢复测试来确保高可用性。 国家安全局和CISA的CI/CD硬化指南. 这种框架是有用的,因为它与实际团队中发生的错误相匹配,泄露的令牌、被篡改的配置和过度广泛的部署访问。

管道的硬化与应用的硬化不同

许多指南都在谈论依赖扫描,但忽略了CI系统本身。这是一个错误。如果一个受损的运行器可以打印机密,改变签名步骤,或者在上传之前交换一个artifact,应用code可以是完美的干净,但仍然会将不安全的应用部署。

实用的控制措施是简单的:

  • 签署管道配置: 使未经授权的工作流编辑变得明显。
  • 将机密从日志中移除: 不要以明文通过shell输出传递凭据。
  • 限制部署权限: 只有正确的branch或tag才能到达生产环境。
  • 审计运行历史: 保持足够的日志详细信息以重构发生的事情。
  • 扫描构建图像和依赖项: 特别是 Electron 项目使用容器化打包。

身份验证和环境隔离需要纪律

OIDC 基于云身份验证比长期凭证在现代 CI 设置中更合适,因为它缩小了被盗凭证的爆炸半径。分离环境帐户和受限生产访问权限也可以减少意外推广。这些模式特别适合混合团队,因为移动发布管道随着时间的推移会积累更多的权限,而任何人都没有意愿。

一个详细的图表,展示了四种最佳实践来安全 CI pipeline,包括扫描依赖项和管理机密。

即使“工作流水线”仍然是一个问题,如果它容易被篡改。安全 CI 需要同样设计的工作量,如它所运载的应用程序一样,在受管制环境中,这不是可选的。

常见管道故障和如何修复它们

大多数 CI 故障在 Capacitor 和 Electron 项目中都是 npm 安装的症状。如果 runner 环境不稳定,Xcode 超时,Gradle 内存不足,通常都是因为打包步骤试图在一个执行器中做太多。

根据症状而不是工具名称进行诊断

间歇性依赖项安装 通常意味着缓存损坏或不稳定的锁文件工作流程。通过依赖于清洁的安装命令、固定包管理器版本以及将缓存恢复与实际安装步骤分离来修复它。

Xcode 构建失败 通常是由于运行器设置、缺失的模拟器运行时或证书状态引起的。让 macOS 任务从环境验证开始,并将签名步骤隔离,以便可以确定失败是否是编译时还是认证时。

Gradle 内存问题 是 Android 和 web 任务共享同一工作时常见的问题。减少工作重叠、将 Android 构建阶段集中在一起,并不要在同一步骤内埋藏与之无关的 shell 命令。

Electron 打包错误 通常是由于本机模块不匹配或打包环境内缺失的系统依赖项引起的。保持构建容器固定、在打包之前验证本机依赖项安装以及不要在签名后重建 artifact 即可。

快速修复胜过英勇的调试

当 Capgo 发布错误出现时,首先要检查的是 bundle 版本和通道状态是否与管道认为它正在发送的匹配。 metadata 不匹配是自动化 live update 流程中的常见混淆来源。另外,请将发布步骤放在管道末尾,确保在上传之前已经生成了最终资产。

几个习惯能节省时间:

  • 失败早: 将 lint 和单元测试放在本机打包之前
  • 并行化时安全: iOS、Android和Electron任务不需要等待共享的Web构建。
  • 保留艺术品可见: 如果您无法检查输出,则无法信任发布。
  • 每个任务: 一个任务应该做好一件事。

如果您的混合应用管道仍然依赖于手动签名、临时上传和少数了解未文档化步骤的人员,那么它是时候修复流程而不是仅仅修复构建了。 Capgo 给 Capacitor 和 Electron 团队提供了自动签名的实时更新、通过通道发布和在同一工作流内保持可追溯性的方法。访问 Capgo 连接您的构建管道到受控的无线传输并使您的下一个发布变得更不容易破裂。

实时更新 Capacitor 应用

当 web 层面的 bug 在实时更新中,通过 Capgo 发布修复而不是等待几天的 app store 审批。用户在后台接收更新,而原生变化仍然在正常的审批路径中。

最新博客

Capgo 给您创建真正专业的移动应用所需的最佳见解。