菜单

构建和发布流程

相关源文件

本文档描述了 Ionic Framework 使用的构建和发布流程,重点介绍了包的构建、版本控制和发布到 NPM 的方式。它涵盖了不同类型的发布(生产、夜间、开发)以及支持它们的底层自动化系统。

概述

Ionic Framework 采用单体仓库结构,其中包含需要协调构建、版本控制和发布的多个包。构建和发布流程使用 GitHub Actions 工作流进行自动化,Lerna 管理包版本控制和依赖项。

来源:.github/workflows/release.yml .github/workflows/nightly.yml .github/workflows/dev-build.yml

单体仓库结构

Ionic Framework 被组织为一个包含多个包的单体仓库,由 Lerna 进行管理。这种方法可以在保持独立版本控制的同时,实现所有包的协调发布。

来源:package.json README.md

发布类型

Ionic Framework 支持不同类型的发布,以满足各种开发需求。

生产发布

这些是稳定、带版本的发布,发布到 latestnext npm 标签。生产发布遵循语义化版本控制,并手动触发。

每日构建版

每天(周一至周五)根据 main 分支的最新更改自动生成构建。这些构建主要用于测试目的,并使用 nightly npm 标签进行发布。

开发版本

可按需触发的构建,用于测试特定更改。它们使用 dev npm 标签发布,并在版本中包含时间戳和 git 提交哈希。

发布类型触发机制版本格式NPM 标签目的
生产手动 (workflow_dispatch)语义化 (x.y.z)latestnext稳定发布
每夜构建计划性(cron: UTC 时间 6:00,周一至周五)x.y.z-nightly.YYYYMMDDnightly每日测试
开发手动 (workflow_dispatch)x.y.z-dev.timestamp.commitdev按需测试

来源:.github/workflows/release.yml .github/workflows/nightly.yml .github/workflows/dev-build.yml

版本管理

Ionic Framework 中的版本管理主要由 Lerna 处理,并辅以额外的自定义脚本用于开发和夜间构建。

生产版本控制

对于生产发布,Ionic 使用语义化版本控制,并可选择性地使用预发布标识符。

来源:.github/workflows/release.yml5-34

夜间和开发版本控制

夜间和开发构建使用特殊的版本控制方案,其中包含时间戳和/或提交哈希。

  • Nightly:<当前版本>-nightly.<YYYYMMDD>
  • 开发:<当前版本>-dev.<时间戳>.<提交哈希>

这些版本控制方案有助于识别代码的精确状态,同时保持与 semver 标准的兼容性。

来源:.github/workflows/nightly.yml22-28 .github/workflows/dev-build.yml19-23

发布工作流

发布流程遵循特定的顺序,以确保依赖项得到正确的构建和发布。

来源:.github/workflows/release-ionic.yml .github/workflows/release.yml36-129

构建顺序和依赖项

发布流程遵循包之间的依赖关系。

  1. 首先,构建并发布 @ionic/core
  2. 核心工件被缓存并可供框架构建使用。
  3. 框架包(@ionic/angular@ionic/react@ionic/vue)并行构建。
  4. 特定于框架的包在父包完成后构建。

这种有序的方法确保每个包都可以访问其依赖的工件。

来源:.github/workflows/release-ionic.yml22-217

缓存机制

在发布过程中,使用自定义的归档机制在作业之间缓存构建工件。

这种缓存机制避免了多次重新构建包的需要,并确保所有发布包的一致性。

来源:.github/workflows/release-ionic.yml34-39 .github/workflows/release-ionic.yml52-58

NPM 发布流程

NPM 发布流程由专门的 GitHub Action 处理,该 Action 执行以下步骤:

  1. 设置 Node.js 环境
  2. 安装依赖项
  3. 构建包
  4. 配置 NPM 认证
  5. 使用指定的标签发布包

每个包都以适当的标签(latest、next、nightly、dev)发布到 NPM,以指示其稳定性级别。

来源:.github/workflows/release-ionic.yml26-33 .github/workflows/release-ionic.yml58-65

发布后操作

所有包发布完成后,会执行一些发布后操作。

GitHub 版本创建

对于生产发布,使用 Lerna 的内置功能创建 GitHub Release。这将根据约定提交(conventional commits)创建发布说明并标记存储库。

lerna version $version --yes --force-publish='*' --conventional-commits --create-release github --preid=$preid

来源:.github/workflows/release.yml65-66

Package Lock 更新

创建发布后,一个单独的作业会更新所有 package-lock.json 文件,以包含新发布的版本。

lerna exec "npm install --package-lock-only"
git add .
git commit -m "chore(): update package lock files"
git push

这确保了未来的构建使用所有包的正确版本。

来源:.github/workflows/release.yml100-105

CDN 缓存清除

发布后,会清除 JSDelivr CDN 缓存,以确保用户获取到最新版本。

curl -X POST https://purge.jsdelivr.net/ -H 'cache-control: no-cache' -H 'content-type: application/json' -d '{
  "path": [
    "/npm/@ionic/core@6/dist/ionic/ionic.esm.js",
    "/npm/@ionic/core@latest/dist/ionic/ionic.esm.js",
    "/npm/@ionic/core@next/dist/ionic/ionic.esm.js",
    "/npm/@ionic/core@6/css/ionic.bundle.css",
    "/npm/@ionic/core@latest/css/ionic.bundle.css"
    "/npm/@ionic/core@next/css/ionic.bundle.css"
  ]}'

这可以确保 CDN 用户立即获得更新的文件。

来源:.github/workflows/release.yml114-128

持续集成与问题管理

Ionic Framework 使用 GitHub Actions 进行持续集成,并使用 GitHub Issue Bot 进行问题管理。这些系统有助于维护代码质量并组织社区贡献。

问题管理自动化

Ionic 使用自定义的 GitHub 机器人来帮助管理问题。

  • 自动分类和标记新问题
  • 关闭支持请求并将其重定向到适当的渠道
  • 处理过时的问题和拉取请求
  • 确保为 Bug 报告提供复现步骤

这种自动化有助于团队高效地专注于处理有效的问题和功能请求。

来源:.github/workflows/label.yml .github/ionic-issue-bot.yml

拉取请求流程

拉取请求会根据它们修改的文件使用 GitHub Labeler 操作自动标记。

这有助于审阅者快速识别拉取请求影响了哪些包。

来源:.github/workflows/label.yml .github/labeler.yml