TaskBridge 使用 GitHub Actions 完成持续集成和正式发布。CI 负责校验,Release workflow 负责生成可下载产物、创建 GitHub Release,并同步发布后端 Docker 镜像。
| 文件 | 触发方式 | 用途 |
|---|---|---|
.github/workflows/ci.yml |
推送到 main / master,或创建 Pull Request |
后端测试、Docker 构建、桌面端构建、Android 构建 |
.github/workflows/release.yml |
推送 v* 标签,或手动触发 |
发布自托管部署包、已签名客户端、GHCR 镜像和 Docker Hub 镜像 |
发布工作流会生成:
- 自托管部署包:
TaskBridge-<version>-deployment.zip - 已签名 Android APK:
TaskBridge-<version>-android.apk - 已签名 Windows 安装包:
TaskBridge-<version>-Setup.exe - Windows 自动更新元数据:
latest.yml和安装包.blockmap(仅随已签名安装包发布) - 校验清单:
SHA256SUMS.txt - 后端 GHCR 镜像:
ghcr.io/<owner>/taskbridge:<version> - 后端 GHCR 镜像:
ghcr.io/<owner>/taskbridge:latest - 后端 Docker Hub 镜像:
27xk/taskbridge:<version> - 后端 Docker Hub 镜像:
27xk/taskbridge:latest
latest 默认会在标签发布时生成。手动触发时可以通过 publish_latest 控制是否发布 latest 标签。
部署包始终生成,包含 deploy/、web/、README.md 和 VERSION。构建时会在临时目录把两个 .env*.example 和 Compose fallback 的后端镜像固定到当前发布标签,避免部署包以后被 latest 指向的新镜像改变。未配置签名时,工作流不会上传 unsigned APK 或 Windows 安装包,但部署包和容器镜像仍可正常发布。历史 Release 中名称带 unsigned 的客户端文件只适合开发验证,不应作为普通用户安装包。
通过标签发布:
git tag v0.1.8
git push origin v0.1.8手动发布:
- 打开 GitHub Actions。
- 选择
TaskBridge Release。 - 点击
Run workflow。 - 输入版本号,例如
v0.1.8。 - 按需选择是否发布 Docker
latest标签。
仓库需要允许 GitHub Actions 写入 Release 和 Packages:
- Settings -> Actions -> General -> Workflow permissions
- 选择
Read and write permissions
Docker Hub 同步发布需要配置以下 Secrets:
DOCKERHUB_USERNAMEDOCKERHUB_TOKEN
默认 Docker Hub 镜像名是 27xk/taskbridge。如果要改成其他命名空间,在仓库 Variables 中配置:
DOCKERHUB_IMAGE
例如:
DOCKERHUB_IMAGE=your-dockerhub-name/taskbridge
仓库配置以下 Secrets 后,Release APK 会使用正式签名:
ANDROID_KEYSTORE_BASE64ANDROID_KEYSTORE_PASSWORDANDROID_KEY_ALIASANDROID_KEY_PASSWORD
这些 Secrets 需要成组配置:四项全部存在时会构建已签名 APK,并运行 apksigner verify --verbose --print-certs;只配置其中一部分时 Android 发布 job 会失败。四项都未配置时,Android 测试仍会执行,但公开 Release 不会上传 APK。
生成 ANDROID_KEYSTORE_BASE64:
base64 -w 0 release.keystorePowerShell:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("release.keystore"))仓库配置以下 Secrets 后,Release workflow 会把证书传给 electron-builder:
WINDOWS_CERTIFICATE_BASE64WINDOWS_CERTIFICATE_PASSWORD
生成 WINDOWS_CERTIFICATE_BASE64:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("taskbridge-codesign.pfx"))这两个 Secrets 需要成组配置:两项都存在时会构建签名安装包,并通过 Get-AuthenticodeSignature 检查 .exe 产物;只配置其中一项时 Windows 发布 job 会失败。两项都未配置时,桌面测试和静态检查仍会执行,但公开 Release 不会上传 Windows 安装包或自动更新元数据。
工作流使用默认 GITHUB_TOKEN 发布 GitHub Release 和 GHCR 镜像,不需要额外个人访问令牌。
需要的 workflow 权限:
contents: write:创建或更新 GitHub Release。packages: write:推送 Docker 镜像到 GitHub Container Registry。
Docker Hub 使用 DOCKERHUB_USERNAME 和 DOCKERHUB_TOKEN 登录。建议使用 Docker Hub Access Token,不要使用账号密码。
发布工作流会把仓库 Variables 写入 Android APK 和 Windows 安装包:
TASKBRIDGE_BASE_URLTASKBRIDGE_WS_URL
示例:
TASKBRIDGE_BASE_URL=http://taskbridge.example.com/api/v1/
TASKBRIDGE_WS_URL=ws://taskbridge.example.com/ws/sync
Android 会在构建时写入 BuildConfig,发布后不能在 APK 外部修改。桌面端会把它作为默认值,用户仍可在设置页手动调整。
Release workflow refuses to build public artifacts unless both endpoints are configured as repository Variables, use http:// / https:// and ws:// / wss://, and do not point at localhost or a private network address. 明文 HTTP / WS 可以用于发布构建;本地局域网和临时测试地址仍不能被写进公开发布产物。
检查:
- JDK 是否为 17。
gradlew是否有执行权限。- 是否关闭了国内镜像:
-PTASKBRIDGE_USE_CHINA_MIRRORS=false。 - Android 签名 Secrets 是否完整;四项都缺失时会省略 APK,部分缺失时会失败;已签名 APK 会用
apksigner verify --verbose --print-certs校验。 ANDROID_KEYSTORE_BASE64解码后是否为空。
electron-builder 需要下载 Electron 运行时。配置完整 Windows 签名 Secrets 时,发布工作流会设置:
CSC_LINK=<runner temp>/taskbridge-codesign.pfx
CSC_KEY_PASSWORD=<WINDOWS_CERTIFICATE_PASSWORD>
ELECTRON_CACHE=<workspace>/.cache/electron
ELECTRON_BUILDER_CACHE=<workspace>/.cache/electron-builder
这样可以避免系统缓存目录权限问题。安装包生成后还会执行 Get-AuthenticodeSignature,只有 Authenticode 状态为 Valid 的 .exe 才会作为发布产物上传。未配置 Windows 签名 Secrets 时,工作流会省略安装包,不会把 unsigned .exe 放入公开 Release。
检查:
- GitHub Actions 是否有
packages: write权限。 DOCKERHUB_USERNAME和DOCKERHUB_TOKEN是否已配置。- Docker Hub 仓库命名空间是否存在且账号有推送权限。
- GHCR 包名是否为小写。
backend/Dockerfile是否能在仓库根目录上下文中构建。
发布工作流会先生成自托管部署包;签名配置存在时,再把 Android APK 和 Windows 安装包上传为 workflow artifacts。最后的 Publish GitHub Release job 统一创建 Release 并上传资产。若失败,请先查看 Build deployment bundle、Prepare Android artifact、Prepare desktop artifacts 或 Download build artifacts 步骤日志。
如果 Android、Desktop 或 Docker 任一 job 失败,最后的 Publish GitHub Release job 不会执行,因此 GitHub Releases 页面不会出现新版本。
最终 Release 一定上传部署包和 SHA256SUMS.txt。已签名桌面安装包存在时还会上传 latest.yml 和 .blockmap,前两者用于桌面端 latest channel 自动更新。每次重跑同一标签时,Release job 会先删除旧资产,避免历史 unsigned APK 或 builder-debug.yml 残留;上传后会通过 GitHub CLI 反查必需资产并拒绝禁止文件。校验清单用于核对所有下载文件的 SHA-256 摘要。桌面端运行时默认读取 latest channel,可用 TASKBRIDGE_UPDATE_CHANNEL 指向后续 beta / canary channel,但公开稳定版本必须保持 latest channel。
cd backend
python -m pytest tests -q
python -m pytest tests/test_migrations.py -q
python -m compileall -q app tests tools
python -m tools.openapi_contract --check
python -m ruff check app tests tools
cd ..\desktop
npm run check:security-config
npm run check:desktop-endpoint-config
npm run check:release-readiness
npm run check:release-artifacts
npm run check:desktop-auto-update
npm run check:production-hardening
npm run buildAndroid 和 Docker 需要本地具备对应工具链:
cd android
.\gradlew.bat testDebugUnitTest
.\gradlew.bat :app:assembleDebug
cd ..
docker compose --env-file deploy/.env.example -f deploy/docker-compose.release.yml config