Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

[Bug][Blueprint] Cron-triggered pipelines use a sanitized plan after PATCH /blueprints, gitextractor fails with masked credentials

Đang mở
#9,243 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 3 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
1-2 ngày
Mức phù hợp với người mới
56/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
go
Lĩnh vực
backend, devops

Hướng nghiên cứu

Read backend/server/services/blueprint.go around PatchBlueprint, saveBlueprint, and reloadBlueprint, then inspect SanitizeBlueprint and pluginOptionSanitizers in backend/server/services/pipeline.go. Trace how the cron job and API response share the blueprint plan, then review existing blueprint service tests. Done means cron runs after a PATCH use the stored credentials while the API response still masks them.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Search before asking
  • I had searched in the issues and found no similar issues.
What happened

After updating an advanced-mode blueprint through the API (PATCH /blueprints/:id), the next pipeline started by the cron schedule runs with a sanitized (masked) plan. Every gitextractor task fails with:

subtask Clone Git Repo ended unexpectedly
git cmd [git clone https://git:*****@<gitlab-host>/<group>/<repo>.git /tmp/gitextractorXXXX --bare] failed
remote: HTTP Basic: Access denied. ...

The token stored in the database is correct:

  • Triggering the same blueprint manually (POST /blueprints/:id/trigger) clones every repo fine.
  • After a lake restart, cron runs work again until the next PATCH.

In our case it was 1330/1330 gitextractor tasks failing in a cron run, while the same repos cloned fine in a manual run of the same plan a few hours earlier.

Root cause (v1.0.3-beta15, still present on main):

  1. PatchBlueprint → saveBlueprint → reloadBlueprint(blueprint) registers the cron job with the same pointer:
    cronManager.AddJob(blueprint.CronConfig, &BlueprintJob{blueprint}) (backend/server/services/blueprint.go).
  2. Right after saving, PatchBlueprint calls SanitizeBlueprint(blueprint) on that same object to build the API response.
  3. The gitextractor sanitizer (pluginOptionSanitizers in backend/server/services/pipeline.go) replaces the password in options["url"] with * in place.
  4. When the cron fires, BlueprintJob.Run() calls createPipelineByBlueprint(bj.Blueprint, ...), which for advanced mode uses blueprint.Plan as is. The new pipeline gets the masked URL.

TriggerBlueprint and ReloadBlueprints (at startup) load the blueprint from the DB, which is why manual runs and runs after a restart are fine. Normal-mode blueprints are not affected, because their plan is regenerated from the connections on each run.

What do you expect to happen

Cron-triggered pipelines should use the stored (unsanitized) plan, the same as manual triggers. Sanitizing the API response should not change the object the scheduler holds.

How to reproduce
  1. Create an advanced-mode blueprint with a gitextractor task whose url contains credentials (https://git:<token>@host/group/repo.git), with enable: true, isManual: false and a cron, e.g. */5 * * * *.
  2. Update it through the API, e.g. PATCH /blueprints/:id with {"cronConfig": "*/5 * * * *"} or with a new plan.
  3. Wait for the cron to fire.
  4. The gitextractor task fails with HTTP Basic: Access denied, and the pipeline's task options show the masked URL.
  5. Trigger the same blueprint with POST /blueprints/:id/trigger: it succeeds.
Anything else

Possible fixes, either of:

  • In BlueprintJob.Run(), reload the blueprint from the DB by id before creating the pipeline.
  • In PatchBlueprint (and other handlers that sanitize after saveBlueprint), sanitize a deep copy rather than the object passed to reloadBlueprint. SanitizeBlueprint writes into blueprint.Plan[i][j], and the option maps are shared.

Workaround: set the blueprint to manual and trigger it from an external scheduler with POST /blueprints/:id/trigger, or restart lake after every blueprint update.

Version

v1.0.3-beta15 (helm chart 1.0.3-beta15). Code verified unchanged on main.

Are you willing to submit PR?
  • Yes I am willing to submit a PR!
Code of Conduct
Ngôn ngữ chính
Go
Star
3.2k
Fork
824
Merge trung bình
2 ngày 22 giờ
Pull request đã merge (30 ngày)
46

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

  • Không có Dockerfile hay tệp Docker Compose
  • Có mẫu pull request
  • Không có hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của apache/devlake

Tất cả issue của apache/devlake

Issue tương tự

Thêm issue về Go

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.