This is an automated email from the ASF dual-hosted git repository.
klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
The following commit(s) were added to refs/heads/main by this push:
new 5fcd33990 fix: sonarqube: missing api/users/search endpoint (#8813)
5fcd33990 is described below
commit 5fcd33990f81592d903cf4654b8253b0faf26409
Author: Pavel Sturc <[email protected]>
AuthorDate: Wed Apr 1 14:54:49 2026 +0200
fix: sonarqube: missing api/users/search endpoint (#8813)
---
backend/plugins/sonarqube/impl/impl.go | 1 +
backend/plugins/sonarqube/tasks/accounts_collector.go | 11 ++++++++++-
backend/plugins/sonarqube/tasks/task_data.go | 1 +
3 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/backend/plugins/sonarqube/impl/impl.go
b/backend/plugins/sonarqube/impl/impl.go
index 5c1a77486..a6d6bd258 100644
--- a/backend/plugins/sonarqube/impl/impl.go
+++ b/backend/plugins/sonarqube/impl/impl.go
@@ -136,6 +136,7 @@ func (p Sonarqube) PrepareTaskData(taskCtx
plugin.TaskContext, options map[strin
Options: op,
ApiClient: apiClient,
TaskStartTime: time.Now(),
+ IsCloud: connection.IsCloud(),
}
// even we have project in _tool_sonaqube_projects, we still need to
collect project to update LastAnalysisDate
var apiProject *models.SonarqubeApiProject
diff --git a/backend/plugins/sonarqube/tasks/accounts_collector.go
b/backend/plugins/sonarqube/tasks/accounts_collector.go
index 6bb02272e..0a30b57f0 100644
--- a/backend/plugins/sonarqube/tasks/accounts_collector.go
+++ b/backend/plugins/sonarqube/tasks/accounts_collector.go
@@ -36,11 +36,20 @@ func CollectAccounts(taskCtx plugin.SubTaskContext)
errors.Error {
logger := taskCtx.GetLogger()
logger.Info("collect accounts")
rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx,
RAW_ACCOUNTS_TABLE)
+
+ // SonarCloud removed api/users/search - use
organizations/search_members instead
+ // The "organization" query param is auto-added by PrepareApiClient
+ urlTemplate := "users/search"
+ if data.IsCloud {
+ urlTemplate = "organizations/search_members"
+ logger.Info("using organizations/search_members for SonarCloud")
+ }
+
collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{
RawDataSubTaskArgs: *rawDataSubTaskArgs,
ApiClient: data.ApiClient,
PageSize: 100,
- UrlTemplate: "users/search",
+ UrlTemplate: urlTemplate,
Query: func(reqData *helper.RequestData) (url.Values,
errors.Error) {
query := url.Values{}
query.Set("p", fmt.Sprintf("%v", reqData.Pager.Page))
diff --git a/backend/plugins/sonarqube/tasks/task_data.go
b/backend/plugins/sonarqube/tasks/task_data.go
index e898befa0..06cb83dd5 100644
--- a/backend/plugins/sonarqube/tasks/task_data.go
+++ b/backend/plugins/sonarqube/tasks/task_data.go
@@ -37,6 +37,7 @@ type SonarqubeTaskData struct {
ApiClient *api.ApiAsyncClient
LastAnalysisDate *time.Time
TaskStartTime time.Time
+ IsCloud bool
}
func DecodeAndValidateTaskOptions(options map[string]interface{})
(*SonarqubeOptions, errors.Error) {