Skip to content
text
# Related Code
.github/workflows/release.yml           - 语义化发布
.github/workflows/build-multi-platform.yml - 多平台构建
.github/workflows/update-homebrew.yml   - Homebrew 更新
scripts/homebrew-update.sh              - Homebrew 脚本

CI/CD 流程

流程概览

Semantic Release

工作原理

基于 Conventional Commits 自动计算版本号:

提交类型版本影响示例
feat:minor (0.X.0)feat: add ModelScope support
fix:patch (0.0.X)fix: handle network timeout
BREAKING CHANGEmajor (X.0.0)不适用(major_on_zero=false)

配置

toml
# pyproject.toml
[tool.semantic_release]
version_toml = ["pyproject.toml:project.version"]
upload_to_pypi = false
upload_to_release = false  # 由 build workflow 处理
hvcs = "github"
commit_message = "chore(release): v{version}"

发布判断逻辑

yaml
# .github/workflows/release.yml:57-88
BEFORE_SHA=$(git rev-parse HEAD)
semantic-release version
AFTER_SHA=$(git rev-parse HEAD)

if [ "$BEFORE_SHA" != "$AFTER_SHA" ]; then
    # 有新提交 = 有新版本
    semantic-release publish
fi

为什么用 SHA 比较?

避免重复发布。如果版本已存在,semantic-release version 不会创建新提交。

多平台构建

构建矩阵

yaml
# .github/workflows/build-multi-platform.yml
strategy:
  matrix:
    include:
      - os: macos-latest
        arch: arm64
      - os: macos-13
        arch: x86_64
      - os: windows-latest
        arch: x86_64

构建流程

产物命名

平台文件名
macOS ARM64hf-model-downloader-arm64.dmg
macOS Intelhf-model-downloader-x86_64.dmg
Windowshf-model-downloader.exe

Homebrew 自动更新

触发条件

仅在 release.yml 创建新版本时触发:

yaml
# .github/workflows/release.yml:90-104
trigger-build:
  needs: release
  if: needs.release.outputs.released == 'true'

更新脚本

bash
# scripts/homebrew-update.sh
# 1. 下载 DMG
# 2. 计算 SHA256
# 3. 更新 Cask 文件
# 4. 创建 PR 到 homebrew-tap 仓库

Cask 结构

ruby
# samzong/homebrew-tap/Casks/hf-model-downloader.rb
cask "hf-model-downloader" do
  version "0.6.1"

  on_arm do
    url "https://github.com/.../hf-model-downloader-arm64.dmg"
    sha256 "..."
  end

  on_intel do
    url "https://github.com/.../hf-model-downloader-x86_64.dmg"
    sha256 "..."
  end
end

所需 Secrets

Secret用途
GH_TOKEN创建 Release、推送版本提交
GH_PAT触发其他 workflow、更新 Homebrew

为什么需要两个 Token?

  • GH_TOKEN: 仓库内操作(创建 release)
  • GH_PAT: 跨仓库操作(触发 workflow、更新 homebrew-tap)

故障排除

Release 未触发

检查点:

  1. 提交是否符合 Conventional Commits 格式
  2. 是否推送到 main 分支
  3. GH_TOKEN 是否有效

构建失败

bash
# 本地复现
make build
make dmg

Homebrew 更新失败

检查 GH_PAT 是否有 repo 权限访问 samzong/homebrew-tap