From df1b3c78adb5a1185ad2206fdd1dff1eb2598ee7 Mon Sep 17 00:00:00 2001 From: AvivGuiser Date: Wed, 18 Mar 2026 22:34:48 +0200 Subject: [PATCH] fix(jenkins): scope multi-branch build collection to current project (#8430) The branch jobs query in collectMultiBranchJobApiBuilds selected all WorkflowJob entries across all multi-branch pipelines for a connection, causing builds to be duplicated and misattributed. Filter by _raw_data_params to collect only the current project's branch jobs. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/plugins/jenkins/tasks/build_collector.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/plugins/jenkins/tasks/build_collector.go b/backend/plugins/jenkins/tasks/build_collector.go index 0d792c61454..a1ae7498754 100644 --- a/backend/plugins/jenkins/tasks/build_collector.go +++ b/backend/plugins/jenkins/tasks/build_collector.go @@ -146,12 +146,17 @@ func collectMultiBranchJobApiBuilds(taskCtx plugin.SubTaskContext) errors.Error logger := taskCtx.GetLogger() // Jobs added through the multi-branch workflow have _raw_data_table set to "jenkins_api_jobs". - // This check works, but it's not very robust. It would be better to use a more explicit check like a "source" column. + // Filter by _raw_data_params to scope to only this multi-branch project's branch jobs, + // preventing cross-project data mixing when multiple multi-branch pipelines exist. + jobParams := plugin.MarshalScopeParams(JenkinsApiParams{ + ConnectionId: data.Options.ConnectionId, + FullName: data.Options.JobFullName, + }) clauses := []dal.Clause{ dal.Select("j.full_name,j.name,j.path,j.class,j.url"), dal.From("_tool_jenkins_jobs as j"), - dal.Where(`j.connection_id = ? and j.class = ? and j._raw_data_table = ?`, - data.Options.ConnectionId, WORKFLOW_JOB, fmt.Sprintf("_raw_%s", RAW_JOB_TABLE)), + dal.Where(`j.connection_id = ? and j.class = ? and j._raw_data_table = ? and j._raw_data_params = ?`, + data.Options.ConnectionId, WORKFLOW_JOB, fmt.Sprintf("_raw_%s", RAW_JOB_TABLE), jobParams), } cursor, err := db.Cursor(clauses...) if err != nil {