开源 CLI dsctl 将 DolphinScheduler 的 REST API 封装为统一命令,可用于批量管理工作流、Git 版本化、CI/CD 发布及故障恢复。结构化输出和可审计调用也便于 AI Agent 安全接入。
作者 | 刘晓东,全家便利店算法工程师
翻译与编辑 | Debra Chen

dsctl 是一款由社区维护的第三方 CLI 工具,通过 REST API 操作 Apache DolphinScheduler®。工程师、Shell 脚本、CI/CD 流水线和 AI 智能体(下文简称“智能体”)均可使用同一套命令。该项目基于 Apache License 2.0 开源。
项目仓库:GitHub Repository
Apache DolphinScheduler Web UI 非常适合设计、查看和监控工作流。然而,当团队转向自动化时,工程团队仍然需要更多能力:
CLI 通过提供自动化、批量操作和可编程能力,弥补了 Web UI 之外的空白。
dsctl 覆盖以下命令:
帮助命令还提供了专为智能体设计的导航指引:


dsctl 位于调用方和 REST API 之间。它屏蔽了不同版本之间的 API 差异,并且可以与各种自动化工具集成。
dsctl 要求使用 Python 3.11 或更高版本。安装后,首先通过 dsctl version 验证版本:
python -m pip install -U dolphinscheduler-cli
dsctl version
最简单的配置方式是使用三个环境变量:
export DS_API_URL="https://dolphinscheduler.example.com/dolphinscheduler"
export DS_API_TOKEN="..."
export DS_VERSION="3.4.1"
dsctl doctor
dsctl project list
dsctl workflow list --project etl-prod
DS_VERSION 必须始终与服务器上运行的确切版本一致。doctor 会对网络连接、身份验证、版本兼容性和本地上下文执行只读检查。
对于多集群环境,可以使用 dotenv 文件在不同环境之间切换。显式传入 --env-file 时,指定的文件会成为独立的配置源;当前进程中的 DS_* 变量不会用作回退值。该文件应包含所有必需的连接设置,而文件中未指定的可选值将使用 dsctl 的内置默认值。
dsctl --env-file prod.env workflow list --project etl-prod
dsctl --env-file staging.env workflow list --project etl-staging
dsctl 允许使用易读的 YAML 文件表示工作流。以下示例是对下面这条命令输出内容的节选与修改:
dsctl template workflow --raw
workflow:
name: example-workflow
project: etl-prod
description: Example workflow definition
global_params:
bizdate: "${system.biz.date}"
release_state: OFFLINE
tasks:
- name: extract
type: SHELL
command: |
echo "extract step"
worker_group: default
depends_on: []
- name: load
type: SHELL
command: |
echo "load step"
depends_on:
- extract
任务、命令和依赖关系都可以直接存储在 Git 中。创建并发布工作流可以拆分为五个明确的步骤:
dsctl template workflow --raw > workflow.yaml
dsctl lint workflow workflow.yaml
dsctl workflow create --file workflow.yaml --project etl-prod --dry-run
dsctl workflow create --file workflow.yaml --project etl-prod
dsctl workflow online example-workflow --project etl-prod
lint 仅执行本地校验,不会连接集群。--dry-run 不会向目标系统发送写请求,但它可能会读取项目、现有工作流或调度信息,以生成准确的执行计划。它保证不会修改任何远程状态。
现有工作流可以遵循以下流程:
导出 → 修改 YAML → 编辑
dsctl workflow export daily-etl --project etl-prod > workflow.yaml
# Modify workflow.yaml
dsctl workflow edit daily-etl --project etl-prod --file workflow.yaml --dry-run
dsctl workflow edit daily-etl --project etl-prod --file workflow.yaml
将工作流迁移到新环境时,如果目标工作流尚不存在,请使用 workflow create。如果工作流已经存在,则使用 workflow edit。
运行时故障排查也使用同样明确的上下文:
dsctl workflow run daily-etl --project etl-prod
dsctl workflow-instance watch 901 --project etl-prod --timeout-seconds 0
dsctl task-instance list --workflow-instance 901 --project etl-prod
dsctl task-instance log 902 --tail 500 --raw
dsctl workflow-instance recover-failed 901 --project etl-prod
watch 默认最多等待 600 秒。--timeout-seconds 0 表示持续等待。日志默认返回最后 200 行,而示例中显式请求了 500 行。
默认情况下,dsctl 成功返回的 JSON 响应始终包含以下字段:
以下是输出内容的节选:
{
"action": "project.list",
"ok": true,
"data": {
"total": 1,
"totalList": [
{"name": "stock-etl", "defCount": 3}
]
},
"resolved": {
"page_no": 1,
"page_size": 100,
"search": "stock"
},
"warnings": [],
"warning_details": []
}
在 JSON 模式下,成功结果和警告会写入 stdout。其他输出模式会将警告或分页摘要写入 stderr。当脚本需要可靠地解析字段时,建议结合使用 JSON 输出和 jq。
命令还可以在需要时说明自身的用法:
dsctl workflow run --help
dsctl schema --command workflow.run
dsctl capabilities --action workflow.run
每条具体命令的帮助信息都会说明参数来自命令行参数、环境变量还是本地上下文,从而避免智能体依靠猜测:

schema 提供精确且机器可读的契约;capabilities 提供当前环境中可用的能力和校验信息;--columns、较小的分页参数和 --compact 有助于减少不必要的输出;next_actions 和 action_index 在适用时会提供有边界的导航指引。它们属于操作建议,并不代表授权;这些能力让 dsctl 既可以直接用于 Shell 脚本,也可以作为其他自动化平台背后的统一执行入口。
这两种场景使用同一套 dsctl 命令。主动开发始于工程师的目标,而受控恢复则始于事故告警。
在 Codex 和 Claude Code 等 AI 编程工具中,工程师可以直接描述目标:
为订单数据库创建一个每日增量工作流。每天凌晨 2:00 运行,并在失败时通知数据团队。先运行 lint 和 dry-run,确认后再发布。
智能体首先使用 --help 和 schema 确认参数,随后生成工作流 YAML,完成 lint 和 dry-run 校验,并在发布前等待工程师作出决定。

该仓库包含一个 dsctl Skill(面向智能体的操作指南),用于帮助智能体查询参数、执行命令和验证结果。以 Claude Code 为例:
git clone https://github.com/sketchmind/dolphinscheduler-cli
mkdir -p ~/.claude/skills
cp -r dolphinscheduler-cli/skills/dsctl ~/.claude/skills/
团队还可以加入自己的 DAG 和数据仓库规范。下面是两个可以写入团队 Skill 的规则示例:
这些 Skills 告诉 AI 智能体如何遵循团队标准,而权限则由运行时环境控制。
场景 2:告警驱动的受控恢复
如果 OpenClaw 等 AI 智能体运行时能够接收和处理群消息,团队就可以创建一个专门处理告警会话的 AI 智能体,将特定频道绑定到它,并在其工作区中放置 AGENTS.md 和 Skills。详细配置可参阅 OpenClaw 的 Agent 文档。
以 DolphinScheduler 3.4.1 为例,可以通过 Webhook 或“Script”类型的告警实例,将告警发送到飞书、Slack 等群聊平台。当运行时收到一条 @ 消息时,它会启动一个会话。AI 智能体首先使用 dsctl 定位失败实例、列出失败任务,并在需要时读取日志,然后给出建议的响应方案。
如果告警由另一个机器人发送,则必须在频道配置中明确允许机器人消息,并限制允许的群组和发送者。对于 OpenClaw,请参阅其飞书频道文档。
除了通用的 dsctl Skill,团队还可以准备一个事故响应 Skill。其规则部分可以写成:
workflow-instance digest, failed tasks, and necessary log tails before determining the failure type

建议先启用只读诊断,然后逐步放开少量能够验证执行结果的恢复操作。当告警发生在非工作时间时,AI 智能体可以先整理失败任务、日志和建议操作,使值班工程师不必从头开始排查。
## 6. 行为准则与权限边界
Skills 和 AGENTS.md 只能指导 AI 智能体如何执行任务。真正的限制来自 AI 智能体运行时、dsctl 风险控制以及 Apache DolphinScheduler 的服务端权限(RBAC)。
dsctl 目前提供的安全保障包括:
工作流在执行前可以通过 lint 在本地进行校验;
关键变更支持 dry-run,而调度操作支持 preview 和 explain;
大多数独立资源的破坏性 delete / clear 操作都需要显式传入 --force 标志;
高风险结构性变更会返回 confirmation_required,要求使用 --confirm-risk TOKEN 进行二次确认,并且该 TOKEN 必须绑定当前操作和请求内容;
当前版本不支持的操作会在发送任何请求之前被阻止;
执行后,dsctl 会尽可能回读服务端状态。
--confirm-risk 用于确认当前操作与上一次风险检查的内容一致。在无人值守场景中,哪些命令可以直接执行、哪些需要确认、哪些应被拒绝,取决于实际 AI 智能体运行时配置的权限规则。
以 Claude Code 的权限配置为例,事故恢复场景的初始规则可以写入项目的 .claude/settings.json:
{ "permissions": { "allow": [ "Bash(dsctl doctor:)", "Bash(dsctl schema:)", "Bash(dsctl capabilities:)", "Bash(dsctl workflow-instance digest:)", "Bash(dsctl task-instance log:)" ], "ask": [ "Bash(dsctl workflow-instance edit:)", "Bash(dsctl workflow-instance recover-failed:)", "Bash(dsctl workflow run:)", "Bash(dsctl workflow-instance rerun:)" ], "deny": [ "Bash(dsctl workflow delete:)", "Bash(dsctl task-instance force-success:)", "Bash(dsctl access-token:)" ] } }
这是一个基于标准化调用模式的初始配置。:* 表示匹配该命令及其参数。Claude Code 按 deny → ask → allow 的顺序应用规则。
只读诊断操作会直接执行。恢复和工作流执行操作每次都需要确认。删除、强制成功以及凭据相关操作会被直接阻止。
这些基于前缀的规则只能识别命令文本。在生产环境中,团队还应使用托管配置和执行前检查来识别操作与目标集群,同时对网络、工具和凭据进行隔离。--env-file、绝对路径和包装命令等全局选项也应纳入规则校验。
如果使用 OpenClaw,可以通过其执行策略和沙箱配置实现相同的原则。
在 DolphinScheduler 侧,建议使用专用的低权限账户和令牌。当操作必须通过 dsctl 执行时,应限制 AI 智能体直接访问 REST API。
## 7. 即将推出:dsctl 0.4.0 的多版本支持
即将发布的 dsctl 0.4.0 将提供 15 个精确版本 Profile(兼容性配置),覆盖从 1.3.9 到 3.4.2 的 DolphinScheduler 版本。
目前,3.4.1 是唯一通过全面验证并被视为稳定的 Profile。其余 14 个 Profile 均作为实验性 Profile 提供。这里的“稳定”和“实验性”描述的是 dsctl 对各 Profile 的验证程度,而不是对应 DolphinScheduler 上游版本的质量。
34 个顶层命令入口;
15 个版本共有 174 个操作,总计 2,610 种操作/版本组合。其中:
2,341 种可执行;
14 种受上游语义限制;
255 种在对应的上游版本中不存在。
每种组合都有明确定义的结论:
supported:目标版本中存在该能力,且 dsctl 提供了等效的实现路径;
upstream-limited:上游 API 存在,但无法完整表达稳定版 CLI 所保证的语义;
upstream-absent:对应的上游版本中不存在该能力。
这些结论来自各个精确发布标签的 API 契约,并与 Profile 和验证记录一同维护。

用户可以随时查询当前版本的结果:
dsctl capabilities --action workflow.create dsctl schema --command workflow.create
第一条命令显示该操作是否可用及其验证范围。第二条命令返回准确的参数和约束。
版本 Profile 按精确版本选择。例如,2.0.9 的结论不会自动适用于 2.0.5。
兼容性结论需要测试支撑。项目 CI 会执行代码检查、生成文件一致性检查以及所有离线测试。发布前,最终软件包还必须通过独立的真实集群验证。随后,验证记录会通过 SHA-256 与对应的构建产物绑定。
版本适配代码通过统一工作流生成,从而减少手动维护多个版本所导致的不一致。
dsctl 让版本差异可发现、故障可预测、操作可审计。工程师可以通过 Git 管理工作流,平台团队可以将其集成到 CI/CD 流水线中,AI 智能体也可以使用同一套命令进行诊断和受控操作。
欢迎为项目点 Star、试用并提交 Issue。尤其欢迎仍在运行 DolphinScheduler 早期生产版本的团队贡献真实环境的验证记录。这些贡献将直接帮助改进对应的 Profile。
项目仓库:GitHub Repository
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为