Skip to content

fix: 同步master分支代码 - #852

Merged
Mianhuatang8 merged 29 commits into
TencentBlueKing:feat/replace_canvas_sdkfrom
Mianhuatang8:feat/replace_canvas_sdk
Aug 5, 2026
Merged

fix: 同步master分支代码#852
Mianhuatang8 merged 29 commits into
TencentBlueKing:feat/replace_canvas_sdkfrom
Mianhuatang8:feat/replace_canvas_sdk

Conversation

@Mianhuatang8

Copy link
Copy Markdown
Collaborator

No description provided.

guohelu and others added 29 commits May 14, 2026 12:06
* feat: 流程支持HTTP回调 --story=132632590
# Reviewed, transaction id: 79669

* feat: 补充测试用例 --story=132632590
# Reviewed, transaction id: 79862

* fix: 修改流程http请求review问题 --story=132632590
# Reviewed, transaction id: 80139

* fix: 修复测试用例失败问题 --story=132632590
# Reviewed, transaction id: 80141

* feat: 补充事务逻辑 --story=132632590
# Reviewed, transaction id: 80165
* feat: 增加子流程节点循环执行机制 --story=130003551
# Reviewed, transaction id: 80116

* fix: 修改循环变量输出配置及sdk版本 --story=130003551
# Reviewed, transaction id: 80238

* fix: 修复单侧失败问题 --story=130003551
# Reviewed, transaction id: 80240

* fix: 修改循环次数校验逻辑 --story=130003551
# Reviewed, transaction id: 80269

* fix: 修复代码中硬编码问题 --story=130003551
# Reviewed, transaction id: 80278
TencentBlueKing#739)

* feat: 支持get_task_list网关接口支持按照task_id_list进行过滤 --story=1070120217134346248
# Reviewed, transaction id: 80423

* fix: task_id_list 传参改为 GET 重复 key 形式 --story=1070120217134346248

- 调整传参方式:?task_id_list=1&task_id_list=3
- 在 GetTaskListSerializer 中通过 to_internal_value 适配 QueryDict.getlist
- 校验 min_length=1, max_length=50
- 同步更新单元测试、接口文档及 api-resources.yml
# Reviewed, transaction id: 80436
* feat: 补充网关接口 --story=130003551
# Reviewed, transaction id: 80881

* fix: 修复单侧失败问题 --story=130003551
# Reviewed, transaction id: 80884

* fix: 修复单侧失败问题 --story=130003551
# Reviewed, transaction id: 80885
…eKing#751)

新增 MAKO_TEMPLATE_NAME_WHITELIST_MODE 配置(off/warn/enforce,默认 enforce)
与 MAKO_TEMPLATE_NAME_EXTRA_WHITELIST 配置(默认包含 _system / _loop /
_inner_loop),并绑定到 BambooSettings,启用 bamboo-engine 侧的根标识符
白名单 + 危险 attr 链路拦截。

修复风险:
1. ${self.module.cache.util.os.popen("cmd").read()} 通过 Mako 内部命名空间
   reach 到 os 模块。
2. ${os.path.os.popen("cmd").read()}(os.path 内部 import os)以及
   ${datetime.sys.modules["os"].popen("cmd").read()} 等通过白名单根名
   反向引用 os/sys 触达进程原语的攻击面。
3. ${context._kwargs / context._with_template} 等 Mako Context 半私有通道。

灰度建议:
线上先把 BKFLOW_MAKO_WHITELIST_MODE=warn 跑若干天,按日志确认无业务误伤,
再切 enforce。回滚直接将该环境变量改回 off 即可(不需要发版)。

依赖侧需先升级 bamboo-pipeline 到带 ``WhitelistNameVisitor`` 的版本,否则该
配置对运行时无效(仅设置 BambooSettings 属性,不影响其它流程)。

Co-authored-by: Cursor <cursoragent@cursor.com>
…#753)

* fix: 节点丢失outgoing和incoming导致流程保存失败 --story=134904270
# Reviewed, transaction id: 81469

* fix: 节点丢失outgoing和incoming导致流程保存失败 --story=134904270
# Reviewed, transaction id: 81471
- 新增 prototype-wireframe skill:wiremd 线框 + Mermaid 流程图 + 全页截图 + TAPD 提设计需求
- 新增 .ai/docs/guides/prototyping-workflow.md 操作指南(工具链/语法/渲染/截图/Figma/提设计需求)
- 重写 prototypes/README.md 为 wiremd 产物目录约定
- 删除旧 skill:prototype-generator、ui-prototype(通用设计原则随迁到新 skill)

Co-authored-by: Cursor <cursoragent@cursor.com>
…eframe-workflow

docs(prototype): 统一原型产出为 wiremd 流程并废弃旧原型工具
…iew-master

fix(ci): 加固可信贡献者自动代码审查
* feat: 增加循环子画布节点 --story=135418928

* feat: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 82268

* fix: 删除调试代码 --story=135418928
# Reviewed, transaction id: 82269

* feat: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 82306

* fix: 循环节点配置快照输出参数隐藏 --story=135556123
# Reviewed, transaction id: 82515

* fix: 循环子节点坐标偏移 --story=135572675
# Reviewed, transaction id: 82543

* fix: 子节点任务执行状态未正确渲染 --story=135662854

* fix: 分组内节点快捷面板关闭时机不正确 --story=135662908

* fix: 代码优化 --story=135418928
# Reviewed, transaction id: 82627

* fix: 代码优化 --story=135418928
# Reviewed, transaction id: 82633

* fix: 遍历请求接口更换为批量获取 --story=135722570
# Reviewed, transaction id: 82733

* fix: 自动排版循环节点初始化导致出现无关节点问题修复 --story=135418928
# Reviewed, transaction id: 82738

* feat: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 82833

* fix: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 83007

* fix: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 83008

* fix: 子画布节点配置调整 --story=136067494
# Reviewed, transaction id: 83099

* fix: 子画布节点配置调整 --story=136067494
# Reviewed, transaction id: 83100

* fix: 子画布节点配置调整 --story=136067494
# Reviewed, transaction id: 83145

* fix: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 83213

* fix: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 83215

* fix: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 83230

* fix: 增加循环子画布节点 --story=135418928
# Reviewed, transaction id: 83231

* fix: 补充参数 --story=135418928
# Reviewed, transaction id: 83282

* fix: 测试问题修复 --story=135418928
# Reviewed, transaction id: 83324

* fix: 测试问题修复 --story=135418928
# Reviewed, transaction id: 83341

* fix: 子画布禁止使用子流程节点以及版本管理子流程更新提示问题处理 --story=135418928
# Reviewed, transaction id: 83382

* fix: 遍历获取更改为批量获取版本信息接口 --story=135418928
# Reviewed, transaction id: 83387

* fix: 子流程中使用子画布问题修复 --story=135418928
# Reviewed, transaction id: 83409

* fix: 子流程中使用子画布问题修复 --story=135418928
# Reviewed, transaction id: 83410

* fix: 子流程中使用子画布问题修复 --story=135418928
# Reviewed, transaction id: 83427

* fix: 子流程中使用子画布问题修复 --story=135418928
# Reviewed, transaction id: 83428

* fix: 子流程中使用子画布问题修复 --story=135418928
# Reviewed, transaction id: 83430

* fix: 补充子画布遮挡节点校验 --story=135418928
# Reviewed, transaction id: 83512

* fix: 补充子画布遮挡节点校验 --story=135418928
# Reviewed, transaction id: 83518

* fix: 子画布测试问题修复 --story=135418928
# Reviewed, transaction id: 83635

* fix: 子画布测试问题修复 --story=135418928
# Reviewed, transaction id: 83637

* fix: 循环子流程mock时隐藏输出参数配置 --story=135418928
# Reviewed, transaction id: 83678

* fix: 子流程节点配置输出参数增加提示 --story=135418928
# Reviewed, transaction id: 83691

* fix: 子流程节点配置输出参数增加提示 --story=135418928
# Reviewed, transaction id: 83758

* fix: 代码优化 --story=135418928
# Reviewed, transaction id: 83772
…ngine-logs

fix: 避免引擎日志重复写入

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review Summary

本 PR 将 master 分支代码同步过来,包含多个功能新增:模板级别 Webhook 支持、子流程循环迭代、OTEL 自定义 Span 属性、权限模型扩展、Mako 模板白名单等。整体代码质量良好,以下是发现的需要关注的问题:

Critical Issues

1. broadcast_task_events 新增 data["template_id"] / data["task_id"] 访问导致 KeyError

  • 文件:bkflow/space/views.py:317-319
  • broadcast_task_events 被修改为访问 data["template_id"]data["task_id"],但现有调用方 bkflow/task/views.py:285 在 pause/resume/revoke 操作时发送的 data 不包含这两个字段,将导致 KeyError 使回调完全失败。
  • 建议:使用 data.get("template_id") 并在值为 None 时跳过模板级别回调,或修改所有调用方统一传入 template_id

2. get_plugin_outputs 使用 json.loads(request.body) 无异常处理

  • 文件:bkflow/apigw/views/get_plugin_outputs.py:42-43
  • 直接 json.loads(request.body) 后通过 data["plugin_id"] 取值,如果请求体非合法 JSON 或缺少 plugin_id,会抛出未捕获的 JSONDecodeErrorKeyError,返回 500 而非友好错误。
  • 建议:定义 Request Serializer 进行参数验证,保持与项目其他 API 一致的风格。

Important Issues

3. delete_template 事务中 raise 裸 Exception

  • 文件:bkflow/apigw/views/delete_template.py:59
  • transaction.atomic() 中使用 raise Exception(...) 来触发回滚。虽然功能正确,但裸 Exception 会被外层 return_json_response 装饰器捕获为通用 500 错误。
  • 建议:定义或复用一个业务异常类(如 ValidationError),使得错误响应更可控。

4. validate_task_id_list 在 validate 方法中做数据转换

  • 文件:bkflow/apigw/serializers/task.py:231-232
  • validate_task_id_listList[int] 转为逗号分隔字符串 "1,2,3"。这种在校验阶段做格式转换的做法违反了 DRF 的设计原则(validate 应只做校验),使得 validated_data["task_id_list"] 的类型与字段声明 (ListField) 不一致,容易误导后续开发者。
  • 建议:在 view 层或 queryset 构建时做转换,或使用 to_internal_value 方法。

5. broadcast_task_events 直接修改了入参 extra_info

  • 文件:bkflow/space/views.py:318-319
  • extra_info = data.get("extra_info") or 后直接 extra_info["delivery_id"] = data["task_id"]。当 data.get("extra_info") 返回的是 request.data 中的原始字典时,这会修改该可变对象,影响上面空间级别回调已使用的 extra_info。虽然 signal.send 是同步调用(空间级别先完成),但这仍是一个隐性副作用。
  • 建议:extra_info = {**(data.get("extra_info") or {}), "delivery_id": data["task_id"]}

6. clear_scope_webhooks 异常处理吞掉错误仅返回 dict

  • 文件:bkflow/utils/webhook.py:87-96
  • 该函数在异常时返回 {"result": False, ...} 而非抛异常。但在 delete_template 中通过 if not result.get("result"): raise Exception(...) 重新触发。这种 "返回错误 dict → 检查并重新抛异常" 的模式增加了遗忘检查返回值的风险。
  • 建议:统一为抛异常方式,由调用方的事务块自然处理回滚。

7. subprocess_plugin 循环逻辑中 self.inner_loop 越界风险

  • 文件:bkflow/pipeline_plugins/components/collections/subprocess_plugin/v1_0_0.py:148,152
  • loop_item_value = list(inputs)[self.inner_loop - 1]items[self.inner_loop - 1] — 如果 self.inner_loop 大于实际列表长度,会触发 IndexError。虽然 min_loop_times 后续用来限制循环次数,但 min_loop_times 是在遍历所有 params 过程中渐进计算的,先遇到的短列表不能保护后续长列表以外的索引。
  • 建议:在索引前增加边界检查,或确保 inner_loop 不超过当前参数值列表长度。

Minor Notes

  • validate_loop_variables 返回 {"has_loop": True/False} 命名有歧义,has_loop=True 实际含义是 "validation passed",建议改为 {"valid": True} 之类。
  • send_task_message 新增 node_id 参数放在 task_idmsg_type 之间,所有现有调用方使用 kwargs 调用所以兼容性OK。
  • 项目 CI workflow 安全加固(PR 作者和 sender 权限校验)是好的实践。

@Mianhuatang8
Mianhuatang8 merged commit 6a08031 into TencentBlueKing:feat/replace_canvas_sdk Aug 5, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants