# 运行

Tuist 采用持续发布系统，每当有意义的变更合并到主分支时，系统就会自动发布新版本。这种方法可确保改进内容迅速送达用户，而无需维护人员进行人工干预。

## 概述

我们持续发布三个主要组件：
- **Tuist CLI** - 命令行工具
- **Tuist 服务器** - 后台服务
- **Tuist 应用程序** - macOS 和 iOS 应用程序（iOS 应用程序仅持续部署到 TestFlight，请参阅
  [此处](#app-store-release)）。

每个组件都有自己的发布管道，每次推送到主分支时都会自动运行。

## 工作原理

### 1.承诺公约

我们使用 [Conventional Commits](https://www.conventionalcommits.org/)
来构建提交信息。这样，我们的工具就能理解变更的性质，确定版本升级，并生成适当的变更日志。

格式：`类型（范围）：描述`

#### 承诺类型及其影响

| 类型    | 描述       | 版本影响           | 示例                             |
| ----- | -------- | -------------- | ------------------------------ |
| `绝技`  | 新功能或能力   | 小版本升级（x.Y.z）   | `feature(cli)：添加对 Swift 6 的支持` |
| `定格`  | 错误修复     | 补丁版本的提升（x.y.Z） | `fix(app): 解决打开项目时崩溃的问题`       |
| `文档`  | 文件更改     | 未发布            | `文档：更新安装指南`                    |
| `风格`  | 代码样式更改   | 未发布            | `style：用 swiftformat 格式化代码`    |
| `重构`  | 代码重构     | 未发布            | `重构（服务器）：简化认证逻辑`               |
| `敷衍`  | 性能改进     | 补丁版本提升         | `perf(cli): 优化依赖关系解析`          |
| `测试`  | 测试增加/更改  | 未发布            | `测试：为缓存添加单元测试`                 |
| `苦差事` | 维护任务     | 未发布            | `苦差事：更新依赖关系`                   |
| `ci`  | CI/CD 变化 | 未发布            | `CI：为发布添加工作流程`                 |

#### 突破性变化

破坏性修改会触发主要版本升级（X.0.0），应在提交正文中注明：

```
feat(cli): change default cache location

BREAKING CHANGE: The cache is now stored in ~/.tuist/cache instead of .tuist-cache.
Users will need to clear their old cache directory.
```

### 2.变化检测

每个组件都使用 [git cliff](https://git-cliff.org/) 来运行：
- 分析自上次发布以来的提交情况
- 按范围（客户端、应用程序、服务器）过滤提交
- 确定是否存在可发布的变更
- 自动生成更新日志

### 3.释放管道

检测到可释放更改时：

1. **版本计算** ：流水线确定下一个版本号
2. **更新日志生成** ：git cliff 从提交信息中创建更新日志
3. **构建过程** ：构建和测试组件
4. **发布创建** ：创建包含工件的 GitHub 发布版本
5. **发布** ：更新推送至软件包管理器（如用于 CLI 的 Homebrew）

### 4.范围过滤

每个组件只有在有相关变更时才会发布：

- **CLI**: 提交范围为`(cli)` 或无范围
- **应用程序** ：包含`(app) 的提交` 范围
- **服务器** ：`(服务器)` 范围的提交

## 编写良好的提交信息

由于提交信息会直接影响发布说明，因此编写清晰、描述性强的信息非常重要：

### 做：
- 使用现在时态："添加功能 "而不是 "增加功能"
- 简明扼要，但要有描述性
- 当更改是针对特定组件时，应包括范围
- 适用时引用问题：`fix(cli)：解决构建缓存问题 (#1234)`

### 不要
- 使用 "修复错误 "或 "更新代码 "等含糊不清的信息
- 在一次提交中混合多个不相关的更改
- 忘记包含中断更改信息

### 突破性变化

对于破坏性更改，请在提交正文中包含`BREAKING CHANGE:` ：

```
feat(cli): change cache directory structure

BREAKING CHANGE: Cache files are now stored in a new directory structure.
Users need to clear their cache after updating.
```

## 发布工作流程

发布工作流程在
- `.github/workflows/cli-release.yml` - CLI 版本
- `.github/workflows/app-release.yml` - 应用程序版本
- `.github/workflows/server-release.yml` - 服务器版本

每个工作流程：
- 通过推动主电源运行
- 可手动触发
- 使用 git cliff 进行变更检测
- 处理整个发布流程

## 监测释放情况

您可以通过以下方式监测发布情况：
- [GitHub发布页面](https://github.com/tuist/tuist/releases)。
- 工作流程运行的 GitHub 操作选项卡
- 每个组件目录中的更新日志文件

## 益处

这种持续发布方法提供了

- **快速交付** ：更改合并后立即送达用户
- **减少瓶颈** ：无需等待手动发布
- **清晰的沟通** ：从提交信息中自动生成更新日志
- **一致的流程** ：所有组件的发布流程相同
- **质量保证** ：只发布经过测试的更改

## 故障排除

如果释放失败：

1. 检查 GitHub 操作日志，查看工作流程是否失败
2. 确保提交信息遵循常规格式
3. 验证所有测试通过
4. 检查组件是否成功构建

用于需要立即发布的紧急修复：
1. 确保您的承诺有明确的范围
2. 合并后，监控发布工作流程
3. 如有需要，触发手动释放装置

## 应用商店发布

虽然 CLI 和服务器遵循上述持续发布流程，但**iOS 应用程序** 是一个例外，因为苹果公司的 App Store 审核流程是这样的：

- **手动发布** ：iOS 应用程序的发布需要手动提交到 App Store
- **审核延迟** ：每个版本都必须通过苹果公司的审核流程，可能需要 1-7 天的时间
- **批量更改** ：在每个 iOS 版本中，通常会将多个更改捆绑在一起
- **TestFlight** ：测试版可在应用商店发布前通过 TestFlight 发布
- **发布说明** ：必须专为应用程序商店指南编写

iOS 应用程序仍然遵循相同的提交约定，并使用 git cliff 生成更新日志，但实际向用户发布的频率较低，而且是手动发布。
