本文档描述了 Ionic Framework 使用的构建和发布流程,重点介绍了包的构建、版本控制和发布到 NPM 的方式。它涵盖了不同类型的发布(生产、夜间、开发)以及支持它们的底层自动化系统。
Ionic Framework 采用单体仓库结构,其中包含需要协调构建、版本控制和发布的多个包。构建和发布流程使用 GitHub Actions 工作流进行自动化,Lerna 管理包版本控制和依赖项。
来源:.github/workflows/release.yml .github/workflows/nightly.yml .github/workflows/dev-build.yml
Ionic Framework 被组织为一个包含多个包的单体仓库,由 Lerna 进行管理。这种方法可以在保持独立版本控制的同时,实现所有包的协调发布。
Ionic Framework 支持不同类型的发布,以满足各种开发需求。
这些是稳定、带版本的发布,发布到 latest 或 next npm 标签。生产发布遵循语义化版本控制,并手动触发。
每天(周一至周五)根据 main 分支的最新更改自动生成构建。这些构建主要用于测试目的,并使用 nightly npm 标签进行发布。
可按需触发的构建,用于测试特定更改。它们使用 dev npm 标签发布,并在版本中包含时间戳和 git 提交哈希。
| 发布类型 | 触发机制 | 版本格式 | NPM 标签 | 目的 |
|---|---|---|---|---|
| 生产 | 手动 (workflow_dispatch) | 语义化 (x.y.z) | latest 或 next | 稳定发布 |
| 每夜构建 | 计划性(cron: UTC 时间 6:00,周一至周五) | x.y.z-nightly.YYYYMMDD | nightly | 每日测试 |
| 开发 | 手动 (workflow_dispatch) | x.y.z-dev.timestamp.commit | dev | 按需测试 |
来源:.github/workflows/release.yml .github/workflows/nightly.yml .github/workflows/dev-build.yml
Ionic Framework 中的版本管理主要由 Lerna 处理,并辅以额外的自定义脚本用于开发和夜间构建。
对于生产发布,Ionic 使用语义化版本控制,并可选择性地使用预发布标识符。
来源:.github/workflows/release.yml5-34
夜间和开发构建使用特殊的版本控制方案,其中包含时间戳和/或提交哈希。
<当前版本>-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
发布流程遵循包之间的依赖关系。
@ionic/core。@ionic/angular、@ionic/react、@ionic/vue)并行构建。这种有序的方法确保每个包都可以访问其依赖的工件。
来源:.github/workflows/release-ionic.yml22-217
在发布过程中,使用自定义的归档机制在作业之间缓存构建工件。
这种缓存机制避免了多次重新构建包的需要,并确保所有发布包的一致性。
来源:.github/workflows/release-ionic.yml34-39 .github/workflows/release-ionic.yml52-58
NPM 发布流程由专门的 GitHub Action 处理,该 Action 执行以下步骤:
每个包都以适当的标签(latest、next、nightly、dev)发布到 NPM,以指示其稳定性级别。
来源:.github/workflows/release-ionic.yml26-33 .github/workflows/release-ionic.yml58-65
所有包发布完成后,会执行一些发布后操作。
对于生产发布,使用 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.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
发布后,会清除 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 机器人来帮助管理问题。
这种自动化有助于团队高效地专注于处理有效的问题和功能请求。
来源:.github/workflows/label.yml .github/ionic-issue-bot.yml
拉取请求会根据它们修改的文件使用 GitHub Labeler 操作自动标记。
这有助于审阅者快速识别拉取请求影响了哪些包。