名称: asc-workflow
描述: 使用 asc workflow 和 .asc/workflow.json 定义、验证和运行仓库本地多步骤自动化工作流。适用于从车道工具迁移、连接CI管道或编排可重复的 asc + shell发布流程,支持钩子、条件执行和子工作流。
asc workflow
当您需要在CLI内部使用车道式自动化时,请使用此技能,通过:
asc workflow runasc workflow validateasc workflow list
此功能最适合确定性自动化,它驻留在您的仓库中,可在PR中审查,并且可以在本地和CI中以相同方式运行。
命令发现
- 始终使用
--help来确认标志和子命令:asc workflow --helpasc workflow run --helpasc workflow validate --helpasc workflow list --help
端到端流程
- 编写
.asc/workflow.json - 验证结构和引用:
asc workflow validate
- 发现可用工作流:
asc workflow listasc workflow list --all(包括私有助手)
- 预览执行而不产生副作用:
asc workflow run --dry-run beta
- 使用运行时参数执行:
asc workflow run beta BUILD_ID:123456789 GROUP_ID:abcdef
文件位置和格式
- 默认路径:
.asc/workflow.json - 覆盖路径:
asc workflow run --file ./path/to/workflow.json <名称> - 支持JSONC注释 (
//和/* ... */)
输出和CI合同
stdout: 结构化JSON结果 (status,steps, 持续时间)stderr: 步骤命令输出、钩子输出、干运行预览asc workflow validate始终打印JSON并在无效时返回非零值
这支持机器安全检查:
asc workflow validate | jq -e '.valid == true'
asc workflow run beta BUILD_ID:123 GROUP_ID:xyz | jq -e '.status == "ok"'
架构(功能支持的内容)
顶级键:
env: 全局默认值before_all: 在步骤之前运行一次的命令after_all: 在步骤成功后运行一次的命令error: 当任何失败发生时运行的命令workflows: 命名工作流映射
工作流键:
descriptionprivate(不可直接运行)envsteps
步骤形式:
- 字符串简写:
"echo hello"-> 运行步骤 - 对象包含:
run: shell命令workflow: 调用子工作流name: 报告标签if: 条件变量名with: 仅用于工作流调用步骤的环境覆盖
运行时参数 (KEY:VALUE / KEY=VALUE)
asc workflow run <名称> [KEY:VALUE ...]支持两种分隔符:VERSION:2.1.0VERSION=2.1.0
- 如果两种分隔符都存在,第一个获胜。
- 重复键采用最后写入胜出。
- 在步骤命令中,通过shell扩展引用参数 (
$VAR)。 - 避免在
.asc/workflow.json中放置机密;通过CI机密/环境传递它们。
运行后标志
asc workflow run 在工作流名称后也接受核心标志:
--dry-run--pretty--file
示例:
asc workflow run beta --dry-runasc workflow run beta --file .asc/workflow.json BUILD_ID:123
执行语义
before_all在步骤执行前运行一次after_all仅在步骤成功时运行error在失败时运行(步骤失败、前/后钩子失败)- 子工作流作为调用步骤的一部分内联执行
- 最大子工作流嵌套深度为16
环境优先级
主工作流运行:
definition.env<workflow.env< CLI参数
子工作流调用步骤 ("workflow": "...", "with": {...}):
- 子工作流
env默认值 - 调用者环境(包括CLI参数)覆盖
- 步骤
with覆盖所有
子工作流和私有工作流
- 使用
"workflow": "<名称>"调用助手工作流。 - 使用
"private": true用于仅助手工作流。 - 私有工作流:
- 不能直接运行
- 可以被其他工作流调用
- 在
asc workflow list中隐藏,除非使用--all
- 验证捕获未知工作流引用和循环引用。
条件 (if)
- 在步骤上添加
"if": "VAR_NAME"。 - 步骤仅在
VAR_NAME为真时运行。 - 真值:
1,true,yes,y,on(不区分大小写)。 if查找的解析顺序:- 合并的工作流环境/参数
os.Getenv(VAR_NAME)
干运行行为
asc workflow run --dry-run <名称>不执行命令。- 它将预览打印到
stderr。 - 干运行显示原始命令(无环境扩展),有助于避免预览中的机密泄漏。
Shell行为
- 运行步骤在bash可用时使用
bash -o pipefail -c。 - 回退是当bash不可用时使用
sh -c。 - 因此,管道在大多数CI shell中当bash存在时正确失败。
实用编写规则
- 将工作流文件保持在版本控制中。
- 在可能的情况下,在步骤命令中使用ID以实现确定性自动化。
- 在步骤内部的破坏性
asc操作中使用--confirm。 - 先验证,然后干运行,再真实运行。
- 保持钩子轻量级并注意副作用。
{
"env": {
"APP_ID": "123456789",
"VERSION": "1.0.0"
},
"before_all": "asc auth status",
"after_all": "echo workflow_done",
"error": "echo workflow_failed",
"workflows": {
"beta": {
"description": "将构建分发到TestFlight组并通知",
"env": {
"GROUP_ID": ""
},
"steps": [
{
"name": "list_builds",
"run": "asc builds list --app $APP_ID --sort -uploadedDate --limit 5"
},
{
"name": "list_groups",
"run": "asc testflight beta-groups list --app $APP_ID --limit 20"
},
{
"name": "add_build_to_group",
"if": "BUILD_ID",
"run": "asc builds add-groups --build $BUILD_ID --group $GROUP_ID"
},
{
"name": "notify",
"if": "SLACK_WEBHOOK",
"run": "echo sent_release_notice"
}
]
},
"release": {
"description": "提交版本进行App Store审核",
"steps": [
{
"workflow": "sync-metadata",
"with": {
"METADATA_DIR": "./metadata"
}
},
{
"name": "submit",
"run": "asc submit create --app $APP_ID --version $VERSION --build $BUILD_ID --confirm"
}
]
},
"sync-metadata": {
"private": true,
"description": "私有助手工作流(仅通过工作流步骤可调用)",
"steps": [
{
"name": "migrate_validate",
"run": "echo METADATA_DIR_is_$METADATA_DIR"
}
]
}
}
}
有用调用
# 验证并在无效文件时使CI失败
asc workflow validate | jq -e '.valid == true'
# 显示可发现的工作流
asc workflow list --pretty
# 包括私有助手
asc workflow list --all --pretty
# 预览真实运行
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"'