跳过主要内容

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包,并尝试记住哪个分支匹配上传的构建。发布成功,但只有因为一两个人知道每个步骤的内容,才会成功。随着这些人的忙碌,规模化就会停止。

合适的 持续集成设置 用可重复的管道取代脆弱的仪式。马丁·福勒的CI定义仍然抓住了核心思想,团队成员至少每天将更改合并到共享代码库中,并且每次集成都由自动构建验证,以便错误尽快浮现 福勒的原始持续集成文章. 对于Capacitor和Electron应用来说,这种纪律甚至更为重要,因为一个构建可以同时处理Web资产、原生包装器、签名凭证和实时更新发布

目录

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

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

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

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

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

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

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

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

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

这是一个工具,如 Capgo的CI好处概述 适合在这里,因为价值不是抽象的。它是从手动打包到控制、可重复的交付中移动的能力,而不会失去对改变的可见性。

选择合适的CI提供者

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

A好的供应商还必须适应发布路径,而不仅仅是构建步骤。Capacitor和Electron团队经常处理原生应用签名、工件推送和实时更新发布在同一管道中,因此CI系统必须将这些步骤分开,而不使工作流难以审计。如果运行器模型弱,签名材料会被复制得太自由。如果工件处理不当,您会失去对已发送内容的信心。这是泛型CI指南通常会跳过的部分。

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

GitHub Actions是如果源代码已经存储在GitHub中的情况下最低摩擦选择。工作流程位于应用code旁边,这使得审查和拥有变得简单,而且该平台支持Linux、Windows和macOS运行器在CI工具比较中描述的源代码控制和运行器模型。 GitHub Actions运行器模型和SCM耦合对于混合团队来说,这很重要,因为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 进行源代码控制和注册表存储,管道会感觉更加集成且更容易审计。如果不是,那么设置成本可能会超过方便性,尤其是当您开始为 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 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.

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

构建您的管道配置

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

一个GitHub Actions形状确实是可行的

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

  1. 检出
  2. 安装依赖项
  3. lint和单元测试
  4. 构建web资产
  5. 同步本机项目
  6. 打包平台artifacts
  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__

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

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

许多指南都在谈论依赖扫描,但忽略了CI系统本身。这是一个错误。如果一个被破坏的运行器可以打印机密、改变签名步骤或在上传之前交换一个工件,那么应用code可以是完美的干净并仍然安全地部署。

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

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

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

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

安全CI管道最佳实践图表

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

常见管道故障和如何解决它们

大多数Capacitor和Electron项目中的CI故障都是几个重复犯错误的症状。如果npm安装不稳定,运行环境通常会漂移。如果Xcode超时,作业通常会在本机构建开始之前做太多。如果Gradle耗尽内存,打包步骤通常会尝试在一个执行器中做太多。

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

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

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

Gradle内存问题 通常是由于Android和Web任务共享同一个工作引起的。在Android构建阶段保持专注,避免将不相关的shell命令嵌入同一个步骤。

Electron打包错误 通常是由于本机模块不匹配或打包环境内缺少系统依赖引起的。保持构建容器固定,验证本机依赖安装之前打包,并且不要在签名之后重建工件。

快速修复胜过英雄式调试

当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是活跃的,通过Capgo将修复发送给用户,而不是等待几天的应用商店审批。用户在后台接收更新,而原生变化保持在正常的审批路径中。

来自马丁的人性化支持

立即开始

最新博客文章

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