跳过主要内容

Continuous Integration Setup for Capacitor and Electron Apps

Master your continuous integration setup for CapacitorJS and Electron apps. Learn pipeline configs, signing, artifact management, and Capgo live updates.

Continuous Integration Setup for Capacitor and Electron Apps

通常可以通过一个团队的构建过程是否已经超出了来判断。有人仍然需要登录Mac,点击Xcode,导出Android工件,手动签名Electron包,并尝试记住哪个分支匹配上传的构建。发布成功,但只有因为一两个人知道每个步骤的内容,否则就无法扩展。

合适的 持续集成设置 取代了脆弱的仪式化过程,以可重复的管道取而代之。Martin Fowler关于CI的定义仍然抓住了核心思想,团队成员至少每天将更改合并到共享代码库中,并且每次集成都由自动构建验证,因此错误会快速浮现 Fowler的原始持续集成文章.即使对于Capacitor和Electron应用,这种纪律也更为重要,因为一个构建可以触及Web资产,原生包装器,签名凭证,以及同一时间发布实时更新

目录

为什么您的Capacitor和Electron应用程序需要一个真正的CI管道

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

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

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

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

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

A实时管道为您提供了一个共享的真相。它每次都运行相同的检查,使用干净的运行器,并在后台保留了 artifact 和日志,告诉您发生了什么变化。 这就是“我们建造了它”和“我们可以证明我们建造了什么”的区别。

为什么实时更新工作流程自然适合在这里

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

这也是一个像 Capgo的CI利益概述 适合在这里,因为价值不是抽象的。它是从手动打包到控制、可重复的交付而不失去对发生变化的可见性的能力。

选择合适的CI提供者

对于混合应用程序,提供者选择比纯Web工作更重要。一个只需要Linux运行器的管道 npm install 可以容忍一些粗糙的边缘。一个需要macOS进行iOS签名、Docker进行Electron打包和必须永远不泄露到日志中的机密的管道需要更紧密的运行器控制、更清晰的隔离和更安全的权限模型。

A不仅要适应构建步骤,还要适应发布路径。 Capacitor 和 Electron 团队经常处理原生应用签名、 artifact 推送和实时更新发布,这些步骤都需要在同一条流水线中处理,因此 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 在 repo 和交付同时存活的情况下表现最强。

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

如果你的团队已经使用 GitLab 进行源代码控制和注册表存储,那么 pipeline 就会感觉更加集成且更容易审计。如果不是,那么设置成本可能会超过方便性,尤其是当你开始为 iOS 签名配置 macOS 运行器或保持实时更新发布与同一发布流程保持一致时。对于那些想要一个具体的 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 Actions GitLab CI CircleCI
Capacitor/Electron 构建支持 适合 GitHub-优先团队,具有 macOS、Linux 和 Windows 运行器 适合已经在 GitLab 上使用共享或自主管理的运行器的团队 强大的托管支持,涵盖多个 SCM
配置容易 如果 code 已经在 GitHub 中,则低摩擦 紧密的平台集成,但最佳体验需要整个堆栈都在 GitLab 中 灵活,但需要更多的供应商特定设置
免费层限制 最佳选择是公共 GitHub 仓库,尤其适合小项目 最佳价值来自 GitLab 已经是系统记录 经常选择管理执行而不是最小化设置成本

比较图表,展示 GitHub 动作、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.

A __CAPGO_KEEP_0__ 的实用方法是对它们进行比较。可以问一个问题:它能否在不使用麻烦的工作方式的情况下运行您需要的本地作业,能否控制机密信息,能否让您的团队在不打开第二个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 的版本的设置,请参阅 Capgo pipeline 设置指南 一个图表,展示了使用 __CAPGO_KEEP_1__ Actions 构建 __CAPGO_KEEP_0__ 和 Electron 应用程序的五步连续集成管道。

A diagram illustrating a five-step continuous integration pipeline for building Capacitor and Electron applications using 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

一旦构建稳定,Live Update发布通常是堆栈中节省时间最多的部分。混合团队不希望等待商店审查就为了修复副本、发布Web Bug修复或翻转配置标志。CI驱动的Capgo发布步骤处理这些案例而不会将原生发布过程变成瓶颈,并且它保持更新路径与您已经使用的构建控制相同

基于频道的发布使发布保持受控

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

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

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

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

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

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

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

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

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

__CAPGO_KEEP_0__’s __CAPGO_KEEP_1__ Actions integration guide

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

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

许多指南都在谈论依赖扫描,但忽略了CI系统本身。这是一个错误。如果一个被破坏的运行器可以打印机密信息、改变签名步骤或在上传之前交换一个文件,应用code可以是完美的干净,但仍然会将不安全的应用推送到生产环境。安全的管道设计意味着将运行器、配置和凭据视为生产资产。

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

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

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

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

描述了四个最佳实践来安全地保护 CI pipeline,包括扫描依赖项和管理机密。

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

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

大多数 CI 故障在 Capacitor 和 Electron 项目中都是 npm 安装的症状。如果 Xcode 超时,通常是因为任务在 native 构建开始之前做了太多。如果 Gradle 超时,打包步骤通常是在一个执行器中尝试做太多。

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

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

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

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

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

快速修复胜过英勇的调试

当 Capgo 发布错误出现时,首先要检查的是 bundle 版本和渠道状态是否与管道认为它正在发送的匹配。元数据不匹配是自动化实时更新流程中的常见混淆来源。另外,将发布步骤放在管道末尾,确保在上传部分输出之前,构建已经产生了最终资产。

几个习惯能节省时间:

  • 失败早点: 将 lint 和单元测试放在本机打包之前
  • 并行化时安全: iOS、Android和Electron任务不需要等待共享的Web构建。
  • 保留艺术品可见: 如果您无法检查输出,则无法信任发布。
  • 每个任务都应该做好一件事。 如果您的混合应用管道仍然依赖于手动签名、临时上传和少数了解未文档化步骤的人员,那么它的时间来修复流程而不是仅仅修复构建。 __CAPGO_KEEP_0__ 给 __CAPGO_KEEP_1__ 和 Electron 团队提供了自动签名的实时更新、通过通道发布和在同一工作流程中保持可追溯性的方法。访问

If your hybrid app pipeline is still held together by manual signing, ad-hoc uploads, and a few people who know the undocumented steps, it’s time to fix the process instead of just the builds. Capgo gives Capacitor and Electron teams a way to automate signed live updates, route releases through channels, and keep traceability inside the same workflow. Visit Capgo 作者

实时更新Capacitor应用

当一个web层bug在live状态时,通过Capgo将修复直接推送给用户,而不是等待几天的app store审批。用户在后台接收更新,而native层的改变仍然在正常的审批路径中。

来自马丁的专业支持

立即开始

最新博客

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