This commit is contained in:
asp_ly 2024-12-29 11:09:50 +08:00
parent 8e4a9bb695
commit 20da0c0bc1
2 changed files with 27 additions and 18 deletions

View File

@ -17,8 +17,7 @@ import { Badge } from "@/components/ui/badge";
import { useToast } from "@/components/ui/use-toast"; import { useToast } from "@/components/ui/use-toast";
import { Separator } from "@/components/ui/separator"; import { Separator } from "@/components/ui/separator";
import type { JenkinsInstance, JenkinsView, SyncType } from './types'; import type { JenkinsInstance, JenkinsView, SyncType } from './types';
import { getJenkinsInstances, getJenkinsViews, syncJenkinsData } from './service'; import { getJenkinsInstances, getJenkinsViews, syncViews, syncJobs, syncBuilds } from './service';
import { SyncStatus } from '@/pages/Deploy/External/types';
const JenkinsManagerList: React.FC = () => { const JenkinsManagerList: React.FC = () => {
const [jenkinsList, setJenkinsList] = useState<JenkinsInstance[]>([]); const [jenkinsList, setJenkinsList] = useState<JenkinsInstance[]>([]);
@ -83,11 +82,19 @@ const JenkinsManagerList: React.FC = () => {
if (!currentJenkinsId) return; if (!currentJenkinsId) return;
setSyncing(prev => ({ ...prev, [type]: true })); setSyncing(prev => ({ ...prev, [type]: true }));
try { try {
await syncJenkinsData(currentJenkinsId, type); switch (type) {
await loadJenkinsList(); case 'views':
if (type === 'views') { await syncViews(currentJenkinsId);
await loadViews(); await loadViews(); // 重新加载视图数据
break;
case 'jobs':
await syncJobs(currentJenkinsId);
break;
case 'builds':
await syncBuilds(currentJenkinsId);
break;
} }
await loadJenkinsList(); // 重新加载实例<E5AE9E><E4BE8B>据以更新同步时间
toast({ toast({
title: "同步成功", title: "同步成功",
duration: 3000, duration: 3000,
@ -134,16 +141,12 @@ const JenkinsManagerList: React.FC = () => {
onValueChange={handleJenkinsChange} onValueChange={handleJenkinsChange}
> >
<SelectTrigger className="w-[300px]"> <SelectTrigger className="w-[300px]">
<SelectValue placeholder="Select a Jenkins instance"/> <SelectValue placeholder="选择 Jenkins 实例"/>
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
{jenkinsList.map(jenkins => ( {jenkinsList.map(jenkins => (
<SelectItem key={jenkins.id} value={String(jenkins.id)}> <SelectItem key={jenkins.id} value={String(jenkins.id)}>
<div className="flex items-center gap-2"> {jenkins.name}
<Badge variant={jenkins.syncStatus === SyncStatus.SUCCESS ? "outline" : "secondary"}>
{jenkins.name}
</Badge>
</div>
</SelectItem> </SelectItem>
))} ))}
</SelectContent> </SelectContent>

View File

@ -1,10 +1,8 @@
import request from '@/utils/request'; import request from '@/utils/request';
import type { JenkinsInstance, JenkinsView, SyncType } from './types'; import type { JenkinsInstance, JenkinsView } from './types';
import { getExternalSystems } from '@/pages/Deploy/External/service'; import { getExternalSystems } from '@/pages/Deploy/External/service';
import { SystemType } from '@/pages/Deploy/External/types'; import { SystemType } from '@/pages/Deploy/External/types';
const BASE_URL = '/api/v1/jenkins-manager';
// 获取 Jenkins 实例列表 // 获取 Jenkins 实例列表
export const getJenkinsInstances = () => export const getJenkinsInstances = () =>
getExternalSystems({ getExternalSystems({
@ -61,6 +59,14 @@ export const getJenkinsViews = (jenkinsId: string) =>
} }
]); ]);
// 同步 Jenkins 数据 // 同步视图
export const syncJenkinsData = (jenkinsId: string, type: SyncType) => export const syncViews = (externalSystemId: string) =>
request.post<void>(`${BASE_URL}/${jenkinsId}/sync/${type}`); request.post<void>(`/api/v1/jenkins-manager/${externalSystemId}/sync-views`);
// 同步任务
export const syncJobs = (externalSystemId: string) =>
request.post<void>(`/api/v1/jenkins-manager/${externalSystemId}/sync-jobs`);
// 同步构建
export const syncBuilds = (externalSystemId: string) =>
request.post<void>(`/api/v1/jenkins-manager/${externalSystemId}/sync-builds`);