|
| 1 | +# GitHub Actions 自动发布 NuGet 包说明 |
| 2 | + |
| 3 | +## 功能说明 |
| 4 | + |
| 5 | +当同时满足以下条件时,会自动触发发布: |
| 6 | +1. 提交的 commit message 包含 `release version` |
| 7 | +2. 提交者邮箱是 `lbhdr@outlook.com` |
| 8 | + |
| 9 | +满足条件后会自动: |
| 10 | +1. 生成版本号(格式:`主版本号.年后两位.月日.时分`,例如:`2.25.1225.1430`) |
| 11 | +2. 更新所有可发布项目的版本号 |
| 12 | +3. 构建和打包所有项目 |
| 13 | +4. 发布到 NuGet |
| 14 | +5. 创建 GitHub Release |
| 15 | + |
| 16 | +## 版本号格式 |
| 17 | + |
| 18 | +- **格式**:`主版本号.年后两位.月日.时分` |
| 19 | +- **当前主版本号**:`2` |
| 20 | +- **示例**: |
| 21 | + - `2.25.1225.1430` = Version 2, Year 2025, Dec 25, 14:30 UTC |
| 22 | + - `2.25.0101.0900` = Version 2, Year 2025, Jan 01, 09:00 UTC |
| 23 | + |
| 24 | +## 配置步骤 |
| 25 | + |
| 26 | +### 1. 设置 NuGet API Key |
| 27 | + |
| 28 | +1. 访问 [NuGet.org](https://www.nuget.org/) |
| 29 | +2. 登录你的账户 |
| 30 | +3. 点击右上角用户名 → **API Keys** |
| 31 | +4. 创建新的 API Key 或使用现有的 |
| 32 | +5. 复制 API Key |
| 33 | + |
| 34 | +### 2. 在 GitHub 仓库中设置 Secret |
| 35 | + |
| 36 | +1. 打开你的 GitHub 仓库 |
| 37 | +2. 进入 **Settings** → **Secrets and variables** → **Actions** |
| 38 | +3. 点击 **New repository secret** |
| 39 | +4. 名称:`NUGET_API_KEY` |
| 40 | +5. 值:粘贴你的 NuGet API Key |
| 41 | +6. 点击 **Add secret** |
| 42 | + |
| 43 | +## 使用方法 |
| 44 | + |
| 45 | +### 触发发布 |
| 46 | + |
| 47 | +在提交代码时,需要同时满足以下条件才能触发自动发布: |
| 48 | + |
| 49 | +1. **Commit message 包含 `release version`**(不区分大小写) |
| 50 | +2. **提交者邮箱是 `lbhdr@outlook.com`** |
| 51 | + |
| 52 | +示例: |
| 53 | + |
| 54 | +```bash |
| 55 | +# 确保 Git 配置的邮箱是 lbhdr@outlook.com |
| 56 | +git config user.email "lbhdr@outlook.com" |
| 57 | + |
| 58 | +# 提交代码(commit message 包含 release version) |
| 59 | +git commit -m "release version: 更新功能说明" |
| 60 | +git push origin main |
| 61 | +``` |
| 62 | + |
| 63 | +或者: |
| 64 | + |
| 65 | +```bash |
| 66 | +git commit -m "fix: 修复bug release version" |
| 67 | +git push origin main |
| 68 | +``` |
| 69 | + |
| 70 | +**注意**: |
| 71 | +- Commit message 中只要包含 `release version`(不区分大小写)即可 |
| 72 | +- 提交者邮箱必须是 `lbhdr@outlook.com`(区分大小写) |
| 73 | +- 如果 commit message 包含 `release version` 但提交者邮箱不是 `lbhdr@outlook.com`,workflow 会跳过发布 |
| 74 | + |
| 75 | +### 发布流程 |
| 76 | + |
| 77 | +1. **检查 commit message**:workflow 会检查最后一个 commit 的 message |
| 78 | +2. **生成版本号**:基于当前 UTC 时间生成版本号 |
| 79 | +3. **更新项目文件**:自动更新所有可发布项目的 `.csproj` 文件中的版本号 |
| 80 | +4. **构建和打包**:构建 Release 版本并生成 NuGet 包 |
| 81 | +5. **发布到 NuGet**:自动推送所有包到 NuGet.org |
| 82 | +6. **创建 GitHub Release**:自动创建带标签的 GitHub Release |
| 83 | + |
| 84 | +## 会发布的项目 |
| 85 | + |
| 86 | +以下项目会被自动更新版本号并发布: |
| 87 | + |
| 88 | +1. `Cyaim.WebSocketServer` - 主库 |
| 89 | +2. `Cyaim.WebSocketServer.MessagePack` - MessagePack 扩展 |
| 90 | +3. `Cyaim.WebSocketServer.Dashboard` - Dashboard 监控 |
| 91 | +4. `Cyaim.WebSocketServer.Cluster.StackExchangeRedis` - StackExchange.Redis 集群扩展 |
| 92 | +5. `Cyaim.WebSocketServer.Cluster.RabbitMQ` - RabbitMQ 集群扩展 |
| 93 | +6. `Cyaim.WebSocketServer.Cluster.FreeRedis` - FreeRedis 集群扩展 |
| 94 | +7. `Cyaim.WebSocketServer.Cluster.Hybrid` - 混合集群扩展 |
| 95 | +8. `Cyaim.WebSocketServer.Cluster.Hybrid.Implementations` - 混合集群实现 |
| 96 | + |
| 97 | +**注意**:`Sample` 和 `Tests` 目录下的项目不会被发布。 |
| 98 | + |
| 99 | +## 查看发布状态 |
| 100 | + |
| 101 | +1. 进入 GitHub 仓库的 **Actions** 标签页 |
| 102 | +2. 查看 `Release NuGet Packages` workflow 的运行状态 |
| 103 | +3. 如果成功,可以在: |
| 104 | + - **NuGet.org** 查看发布的包 |
| 105 | + - **GitHub Releases** 查看创建的 Release |
| 106 | + |
| 107 | +## 故障排除 |
| 108 | + |
| 109 | +### 发布失败 |
| 110 | + |
| 111 | +1. **检查 NuGet API Key**:确保 `NUGET_API_KEY` secret 已正确设置 |
| 112 | +2. **检查 commit message**:确保包含 `release version`(不区分大小写) |
| 113 | +3. **检查提交者邮箱**:确保 Git 配置的邮箱是 `lbhdr@outlook.com`(区分大小写) |
| 114 | + ```bash |
| 115 | + # 查看当前 Git 邮箱 |
| 116 | + git config user.email |
| 117 | + |
| 118 | + # 设置 Git 邮箱为 lbhdr@outlook.com |
| 119 | + git config user.email "lbhdr@outlook.com" |
| 120 | + |
| 121 | + # 全局设置(可选) |
| 122 | + git config --global user.email "lbhdr@outlook.com" |
| 123 | + ``` |
| 124 | +4. **查看 workflow 日志**:在 Actions 页面查看详细的错误信息和检查结果 |
| 125 | + |
| 126 | +### 版本号格式错误 |
| 127 | + |
| 128 | +如果版本号格式不符合预期,检查: |
| 129 | +- 系统时间是否正确 |
| 130 | +- workflow 文件中的版本号生成逻辑 |
| 131 | + |
| 132 | +### 包已存在错误 |
| 133 | + |
| 134 | +如果包已存在,workflow 会使用 `--skip-duplicate` 参数跳过,不会报错。 |
| 135 | + |
| 136 | +## 自定义配置 |
| 137 | + |
| 138 | +### 修改主版本号 |
| 139 | + |
| 140 | +编辑 `.github/workflows/release-nuget.yml`,修改: |
| 141 | + |
| 142 | +```yaml |
| 143 | +MAJOR_VERSION=2 # 改为你需要的版本号 |
| 144 | +``` |
| 145 | + |
| 146 | +### 修改触发条件 |
| 147 | + |
| 148 | +编辑 `.github/workflows/release-nuget.yml`,修改 commit message 检查逻辑: |
| 149 | + |
| 150 | +```yaml |
| 151 | +if echo "$COMMIT_MSG" | grep -qi "release version"; then |
| 152 | + # 可以改为其他触发条件 |
| 153 | +fi |
| 154 | +``` |
| 155 | + |
| 156 | +### 添加更多项目 |
| 157 | + |
| 158 | +在 `Update version in all project files` 步骤中添加项目路径: |
| 159 | + |
| 160 | +```yaml |
| 161 | +PROJECTS=( |
| 162 | + "Cyaim.WebSocketServer/YourNewProject/YourNewProject.csproj" |
| 163 | + # ... 其他项目 |
| 164 | +) |
| 165 | +``` |
| 166 | + |
| 167 | +## 注意事项 |
| 168 | + |
| 169 | +⚠️ **重要提示**: |
| 170 | + |
| 171 | +1. **版本号唯一性**:确保同一时间只触发一次发布,避免版本号冲突 |
| 172 | +2. **API Key 安全**:不要将 API Key 提交到代码仓库 |
| 173 | +3. **测试发布**:首次使用前,建议先在测试分支测试 |
| 174 | +4. **时间同步**:版本号基于 UTC 时间,确保服务器时间正确 |
| 175 | + |
0 commit comments