import { useState, type FormEvent } from 'react'; import { api, normalBuildAllowed, type AdmissionState, type Build } from './api'; import { Panel, ResourceState, Empty, Status, date, useAction, useResource } from './ui'; import { BuildProvenance, ReleasePanel } from './ReleasePanel'; export const activeBuild = (build: Build) => ['queued', 'running', 'validating'].includes(build.status); function BuildLogs({id, close}: {id: string; close: () => void}) { const logs = useResource(() => api.build(id), id, 5000, activeBuild); return

构建日志

{logs.data && <>

{logs.data.experimental && 实验构建 · 不自动准入}{logs.data.version} ·

{logs.data.error &&

{logs.data.error}

}
{logs.data.logs || '任务尚未输出日志'}
}
; } function Admission({imageId, refresh}: {imageId:string; refresh:() => Promise}) { const [state, setState] = useState('compatible'), [evidence, setEvidence] = useState(''), [confirmed, setConfirmed] = useState(false); const action = useAction(); const submittedEvidence = evidence.trim(), evidenceBytes = new TextEncoder().encode(submittedEvidence).length; const evidenceInvalid = evidenceBytes === 0 || evidenceBytes > 4096; return
{e.preventDefault(); if (!confirmed || evidenceInvalid) return; void action.run(async () => {await api.admitImage(imageId, state, submittedEvidence); setEvidence(''); setConfirmed(false); await refresh();}, '镜像准入策略已更新', '确认依据实际验收结果修改此镜像准入策略?');}}>{action.feedback}

构建成功不等于通过验收。请记录启动、登录、终端、文件和配置等实际兼容性验收结果及可追溯依据,不可仅填写“构建成功”。单镜像准入不扩大普通构建版本白名单;未知版本仅可选择已准入的本地镜像 ID 创建或升级。