自动化与脚本
当需要在仓库内用 asc CLI 定义、校验、预览、运行…
用 `.asc/workflow.json` 和 `asc workflow validate/list/run` 管理仓库本地多步自动化,安全执行可重试/超时/条件化步骤并恢复失败运行。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
当需要在仓库内用 asc CLI 定义、特定
解决思路
- 确认命令标志:依次运行 `asc workflow --help`、`asc workflow validate --help`、`asc workflow list --help`、`asc workflow run --help`。
- 创建工作流文件 `.asc/workflow.json`。
- 校验结构和引用:运行 `asc workflow validate`。
- 发现公开工作流:运行 `asc workflow list`。
- 发现所有工作流:运行 `asc workflow list --all`。
- 预览执行:运行 `asc workflow run --dry-run beta BUILD_ID:123456789 GROUP_ID:abcdef`。
- 执行工作流:运行 `asc workflow run beta BUILD_ID:123456789 GROUP_ID:abcdef`。
- 可恢复运行失败时,从 JSON 结果中取 run ID,并用 `asc workflow run release --resume "release-20260312T120000Z-deadbeef"` 恢复。
- 使用 `--resume` 时不要额外传 `KEY:VALUE` 参数;保存的工作流文件、参数和已持久化 outputs 会被复用。
- 默认文件路径为 `.asc/workflow.json`。
- 需要覆盖路径时使用 `asc workflow run --file ./path/to/workflow.json <name>`。
- 工作流文件支持 JSONC 注释。
- 顶层可定义 `before_all`、`after_all`、`error` 钩子。
- 工作流键包括 `description`、`private`、`env`、`steps`。
- 步骤可为字符串简写,如 `"echo hello"`。
- 步骤可用 `run` 执行 shell 命令。
- 步骤可用 `workflow` 调用子工作流。
- 步骤可用 `name` 定义标签。
- 步骤可用 `if` 指定条件变量名。
- 步骤可用 `with` 为 workflow-call 步骤覆盖环境变量。
- 步骤可用 `outputs` 映射从具名 run 步骤的 JSON stdout 提取输出。
- 步骤可用 `retry` 为 run 步骤定义固定延迟重试策略。
- 步骤可用 `timeout` 为 run 步骤定义每次尝试的正时长。
- 运行步骤可声明 outputs;产生 outputs 的命令必须在 stdout 输出 JSON,因此对产生 outputs 的 `asc` 命令传 `--output json`。
- 使用输出引用 `${steps.step_name.OUTPUT_NAME}`。
- 声明 outputs 的步骤必须有可安全引用的 `name`。
- outputs 只允许用于 `run` 步骤,不能用于 workflow-call 步骤。
- 能在同一运行图中一起执行的 workflows,其产生 output 的 name 必须唯一。
- 持久化 outputs 会存入 workflow run state,因此不要把 secrets 映射进 outputs。
- 只对已确定可安全重复的命令添加 retry;runner 不会自行分类命令,也不会自动重试 mutation。
- 示例 retry/timeout:`"retry": {"max_attempts": 3, "delay": "5s"}`,`"timeout": "2m"`。
- `retry.max_attempts` 计入第一次尝试,必须为 2 到 100。
- Retry delays 和 timeouts 必须是正时长且不超过 24 小时。
- `retry` 和 `timeout` 仅适用于 `run` 步骤,不适用于 workflow calls 或 lifecycle hooks。
- 只有 timeout 而无 retry 是终止性的,因为命令可能已在远端完成。
- 同时配对 retry 和 timeout 是明确信号,表示另一次尝试是安全的。
- Resume 需要成功 checkpoint 或带 retry 的失败步骤;output-extraction 失败无法 resume。
- 运行参数:`asc workflow run <name> [KEY:VALUE ...]` 同时支持 `:` 和 `=` 分隔符,例如 `VERSION:2.1.0` 与 `VERSION=2.1.0`。
- 重复 key 采用 last-write-wins。
- 在 shell 命令中通过 shell expansion 引用参数,如 `$VERSION`。
- 主工作流运行的环境变量优先级:`definition.env < workflow.env < CLI params`。
- 使用 `with` 的子工作流调用环境变量优先级:`sub-workflow env < caller env and params < step with`。
- 用 `"if": "VAR_NAME"` 给步骤加条件。
- 真值包括 `1`、`true`、`yes`、`y`、`on`,大小写不敏感。
- 条件查找先检查合并后的 workflow env/params,再检查 process environment。
- 示例工作流结构:顶层 `env` 含 `APP_ID`、`VERSION`、`GROUP_ID`;`before_all` 调 `asc auth status`,`after_all` echo,`error` echo。
- 示例 `beta` 工作流:`resolve_build` 用 `asc builds info --app $APP_ID --latest --platform IOS --output json` 并以 `outputs` 提取 `BUILD_ID` 为 `$.data.id`;`list_groups` 用 `asc testflight groups list --app $APP_ID --limit 20 --output json`;`add_build_to_group` 在 `if: GROUP_ID` 时用 `asc builds add-groups --build-id ${steps.resolve_build.BUILD_ID} --group $GROUP_ID`。
- 示例 `release` 工作流:`validate` 用 `asc validate --app $APP_ID --version $VERSION --platform IOS --output json`;`stage` 用 `asc release stage --app $APP_ID --version $VERSION --build-id $BUILD_ID --metadata-dir ./metadata/version/$VERSION --confirm --output json`;`submit` 在 `if: SUBMIT_FOR_REVIEW` 时用 `asc review submit --app $APP_ID --version $VERSION --build-id $BUILD_ID --confirm --output json`。
- 示例 `publish-appstore` 工作流:`publish` 用 `asc publish appstore --app $APP_ID --ipa ./build/MyApp.ipa --version $VERSION --wait --submit --confirm --output json`。
- 常用校验:`asc workflow validate | jq -e '.valid == true'`。
- 常用列表:`asc workflow list --pretty`;`asc workflow list --all --pretty`。
- 常用 dry-run/run:`asc workflow run --dry-run beta BUILD_ID:123 GROUP_ID:grp_abc`;`asc workflow run beta BUILD_ID:123 GROUP_ID:grp_abc | jq -e '.status == "ok"'`;`asc workflow run release BUILD_ID:123 SUBMIT_FOR_REVIEW:true`;`asc workflow run release --resume "release-20260312T120000Z-deadbeef"`。
- 安全:把 `.asc/workflow.json` 当作代码,只运行可信工作流文件。
- 安全:避免在带 secrets 的情况下运行来自不可信 PR 的工作流。
- 安全:把工作流文件纳入版本控制。
- 安全:先 validate,再 dry-run,最后运行。
- 安全:对会修改状态的步骤使用明确 ID 和 `--confirm`。
- 安全:使用 `asc validate`、`asc release stage`、`asc review submit`、`asc publish appstore`;不要使用已移除的 submission commands。
适用边界 · 注意事项
- 没有安装/配置 `asc` CLI、无法使用 `.asc/workflow.json` 或不属于 App Store Connect/TestFlight 自动化时。
- 需要运行来自不可信 PR 或不可信来源且会接触 secrets 的 workflow 时。
- 只想做与 `asc` 无关的通用 CI 编排且不希望引入该 CLI 时。