Skip to content

[Bug] DWS app创建机器人应用发布和权限挂钩,无法完全自动化,且不会给管理员发通知审批 #590

Closed as not planned

Description

@Suprock

DWS dev app version publish 审批流程 Bug 报告

环境

  • DWS 版本:v1.0.47 (b63e1b4, 2026-07-05)
  • 企业:*** (ding***)
  • 问题用户:用户A

正常流程(有开发者权限的用户,如用户B)

用户B 在钉钉开放平台有开发者权限,版本发布直接通过,无需审批。

# 1. 创建应用
dws dev app create --name "用户B的HermesBot" --desc "群内智能答疑" --format json --yes
# → unifiedAppId: <app-id>

# 2. 配置机器人
dws dev app robot config --unified-app-id <id> --name "用户B的HermesBot" --mode STREAM --format json --yes
# → configured: true, robotCode: ding***

# 3. 创建版本
dws dev app version create --unified-app-id <id> --desc "启用机器人" --format json --yes
# → versionId: <vid>, versionStatus: INIT

# 4. 发布版本(无需审批)
dws dev app version publish --unified-app-id <id> --version-id <vid> --format json --yes
# → published: true, versionStatus: RELEASE  ← 直接成功

# 5. 获取凭证
dws dev app credentials get --unified-app-id <id> --format json
# → appKey + appSecret

问题流程(无开发者权限的用户,如用户A)

用户A 无开发者权限,版本发布需要选择审批人。前 3 步相同,第 4 步出现差异:

dws dev app version publish --unified-app-id <app-id> \
  --version-id <vid> --format json --yes

实际返回(已精简,敏感信息脱敏):

{
  "published": false,
  "requiresApproval": true,
  "publishable": false,
  "versionStatus": "INIT",
  "approvalMode": "SELECT_APPROVER",
  "terminal": false,
  "mustAskUser": true,
  "message": "版本发布需要选择审批人",
  "approvalOptions": [
    {"index": 1, "key": "A", "name": "***", "userId": "***"},
    {"index": 2, "key": "B", "name": "***", "userId": "***"}
    // ... 共 20 位候选人
  ],
  "nextSteps": [{
    "command": "dws dev app version publish --unified-app-id <id> --version-id <vid> --approver-user-id <userId> --yes --format json",
    "doneWhen": "published=true 或 versionStatus=RELEASE"
  }]
}

调用链复现

通过非交互式环境(--format json --yes)调用:

DWS <user>: dev app create --name *** --desc ***
DWS result [<user>] exit=2 0b:           ← 前3次失败
DWS stderr [<user>]: {                   ← stderr 不完整

DWS result [<user>] exit=0 269b: {...}  ← 第4次成功
DWS result [<user>] exit=0 193b: {...}  ← robot config OK
DWS result [<user>] exit=0 106b: {...}  ← version create OK
DWS result [<user>] exit=0 7767b: {     ← publish 返回审批列表(7767 bytes)
  "published": false,
  "requiresApproval": true,
  ...
}

问题总结

问题 详情
--yes 未生效 带了 --yes 仍要求交互式选择审批人,自动化场景无法继续
exit=0 但 published=false 调用方判断 published 为 false,认为发布失败,实际版本停留在 INIT
无 --approver-user-id 自动化路径 nextSteps 提示需要指定审批人,但自动化工具无法预知审批人 ID
create_app 间歇性失败 同一用户、同一参数,前 3 次 exit=2(stderr 不完整),第 4 次 exit=0

期望行为

  1. --yes 应跳过审批人选择,自动提交审批或自动选第一个可用审批人
  2. 或提供 --approver-user-id auto 自动选择任一审批人
  3. create_app 失败的 stderr 应完整输出错误原因

Activity

  1. haofeng0705 commented on Oct 20, 2026

    @haofeng0705
    Collaborator

    Hi @Suprock,感谢你提供完整的调用链和返回,理解发布流程卡在审批这一步的困扰。

    --yes 只确认本次写操作,不会授予开发者权限、绕过审批或自动选择审批人。 你贴出的 SELECT_APPROVER / INIT 表示仍在等待选人,不能证明审批已提交,也不能据此判断通知失效。--approver-user-id 已受支持,候选人的 userId 就在返回的 approvalOptions 中;审批人需要由你们明确指定,我们不计划增加自动选第一位或 --approver-user-id auto。

    发布流程

    建议先更新。独立安装可使用 dws upgrade;npm 安装可使用 npm install -g dingtalk-workspace-cli。本次核对的正式版为 v1.0.64,beta 为 v1.0.65-beta.2。

    1. 用已有的应用和版本 ID 预检,查看审批要求与候选人:

      dws dev app version check-approval --unified-app-id <id> --version-id <vid> --format json
    2. 需要选人时,从 data.approvalOptions[].userId 中明确选择一位,再预览本次提交:

      dws dev app version publish --unified-app-id <id> --version-id <vid> --approver-user-id <userId> --dry-run --format json
    3. 确认目标、版本和审批人后,把同一命令的 --dry-run 换成 --yes 执行。approvalSubmitted=true / versionStatus=AUDIT / processStatus=UNDER_REVIEW 表示已提交、等待审批;published=true / versionStatus=RELEASE 才表示已发布。

    4. 提交后查询状态,不要在审核中重复 publish:

      dws dev app version status --unified-app-id <id> --version-id <vid> --format json

    v1.0.58 起,dev app 引入了统一 JSON 结果,业务字段位于 data。exit 0 不等于已发布:发布响应的 outcome=pending 表示仍需选人或等待审批,可结合 meta.operation.state 判断。check-approval 的 outcome=success 只表示预检完成。返回的后续命令不含 --yes,需要确认后再追加。

    本次本地模拟响应检查还发现:响应未回传 ID,或已提交后仍带选人字段时,CLI 可能报内部错误或误标待选人。因此若返回异常,请先查询真实版本状态并保留完整响应,不要直接重试发布。这些边界情况尚未在你的组织验证。

    关于 create 失败和通知

    v1.0.47 的 exit 2 属于认证/权限类错误。它的 JSON 错误写在 stderr,是多行内容,第一行就是 {;目前的 dev app --format json 则把完整失败结果写在 stdout。请确认调用方记录了两个流的完整内容,而不是只取第一行。v1.0.54 的 PR #687 改进了凭证解析及被拒绝后的刷新,但没有足够证据确认这就是你遇到的原因。

    本次按“审批选人符合设计、不采纳自动选人”关闭,不代表创建失败或提交后无通知已经验证修复。 我们没有在你的组织执行真实创建或审批。如果最新版仍失败,或明确提交后审批人仍未收到通知,欢迎继续回复或另开 Issue,附上版本、操作系统、完整脱敏 stdout/stderr、错误码/追踪号(如有)、提交回执和时间。请不要包含 token、appSecret 等密钥,我们继续按具体阶段排查。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions