jenkinsClient->isConfigured()) { return response()->json([ 'success' => false, 'message' => 'Jenkins 未配置,请先配置 JENKINS_HOST、JENKINS_USERNAME、JENKINS_API_TOKEN', ], 422); } $projects = Project::getJenkinsNotifyEnabled() ->map(function (Project $project) { return [ 'id' => $project->id, 'slug' => $project->slug, 'name' => $project->name, 'jenkins_job_name' => $project->jenkins_job_name, 'parameters' => $this->jenkinsClient->getParameterDefinitions($project->jenkins_job_name), ]; }) ->values(); return response()->json([ 'success' => true, 'data' => [ 'projects' => $projects, ], ]); } public function trigger(Request $request): JsonResponse { if (! $this->jenkinsClient->isConfigured()) { return response()->json([ 'success' => false, 'message' => 'Jenkins 未配置,请先配置 Jenkins 连接信息', ], 422); } $projectSlugs = Project::getJenkinsNotifyEnabled()->pluck('slug')->all(); $data = $request->validate([ 'builds' => ['required', 'array', 'min:1'], 'builds.*.project_slug' => ['required', 'string', Rule::in($projectSlugs)], 'builds.*.parameters' => ['nullable', 'array'], ]); $projects = Project::getJenkinsNotifyEnabled()->keyBy('slug'); $results = []; $successCount = 0; foreach ($data['builds'] as $build) { /** @var Project $project */ $project = $projects[$build['project_slug']]; $parameters = $this->normalizeParameters($build['parameters'] ?? []); $result = $this->jenkinsClient->triggerBuild($project->jenkins_job_name, $parameters); if ($result['success'] ?? false) { $successCount++; } $results[] = [ 'project_slug' => $project->slug, 'project_name' => $project->name, 'job_name' => $project->jenkins_job_name, 'success' => (bool) ($result['success'] ?? false), 'message' => $result['message'] ?? null, 'queue_url' => $result['queue_url'] ?? null, ]; } return response()->json([ 'success' => $successCount === count($results), 'message' => sprintf('触发完成:成功 %d 个,失败 %d 个', $successCount, count($results) - $successCount), 'data' => [ 'results' => $results, ], ], $successCount > 0 ? 200 : 422); } private function normalizeParameters(array $parameters): array { return collect($parameters) ->filter(fn ($value) => $value !== null && $value !== '') ->map(function ($value) { if (is_array($value)) { return implode(',', array_filter($value, fn ($item) => $item !== null && $item !== '')); } return is_bool($value) ? ($value ? 'true' : 'false') : $value; }) ->filter(fn ($value) => $value !== '') ->all(); } }