show launcher release build metadata read only
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
@@ -16,6 +16,10 @@ function artifactName(version: string) {
|
|||||||
return `autonomy-studio-launcher-${version || '0.0.0'}.deb`;
|
return `autonomy-studio-launcher-${version || '0.0.0'}.deb`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function displayValue(value?: string | null) {
|
||||||
|
return value?.trim() || '-';
|
||||||
|
}
|
||||||
|
|
||||||
export function LauncherVersionsPage() {
|
export function LauncherVersionsPage() {
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const [versions, setVersions] = useState<LauncherVersion[]>([]);
|
const [versions, setVersions] = useState<LauncherVersion[]>([]);
|
||||||
@@ -57,11 +61,10 @@ export function LauncherVersionsPage() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const openRelease = () => {
|
const openRelease = () => {
|
||||||
const nextVersion = '';
|
|
||||||
const latestBuild = successfulBuildJobs[0];
|
const latestBuild = successfulBuildJobs[0];
|
||||||
setReleaseForm({
|
setReleaseForm({
|
||||||
buildJobId: latestBuild?.id ?? '',
|
buildJobId: latestBuild?.id ?? '',
|
||||||
version: nextVersion,
|
version: latestBuild?.version ?? '',
|
||||||
minimumVersion: launcher?.minimumVersion ?? '',
|
minimumVersion: launcher?.minimumVersion ?? '',
|
||||||
downloadUrl: latestBuild?.downloadUrl ?? '',
|
downloadUrl: latestBuild?.downloadUrl ?? '',
|
||||||
releaseNotes: ''
|
releaseNotes: ''
|
||||||
@@ -81,7 +84,7 @@ export function LauncherVersionsPage() {
|
|||||||
|
|
||||||
const saveRelease = (event: FormEvent) => {
|
const saveRelease = (event: FormEvent) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
if (!releaseForm.version.trim() || !releaseForm.downloadUrl.trim()) return;
|
if (!selectedBuildJob || !releaseForm.version.trim() || !releaseForm.downloadUrl.trim()) return;
|
||||||
setSaving(true);
|
setSaving(true);
|
||||||
createLauncherVersion({
|
createLauncherVersion({
|
||||||
version: releaseForm.version.trim(),
|
version: releaseForm.version.trim(),
|
||||||
@@ -181,12 +184,12 @@ export function LauncherVersionsPage() {
|
|||||||
title="릴리즈 등록"
|
title="릴리즈 등록"
|
||||||
onClose={() => setReleaseOpen(false)}
|
onClose={() => setReleaseOpen(false)}
|
||||||
className="!max-w-3xl"
|
className="!max-w-3xl"
|
||||||
footer={<><Button variant="outline" onClick={() => setReleaseOpen(false)}>취소</Button><Button onClick={saveRelease as unknown as () => void} disabled={saving || !releaseForm.version.trim() || !releaseForm.downloadUrl.trim()}>{saving ? '등록 중' : '등록'}</Button></>}
|
footer={<><Button variant="outline" onClick={() => setReleaseOpen(false)}>취소</Button><Button onClick={saveRelease as unknown as () => void} disabled={saving || !selectedBuildJob || !releaseForm.version.trim() || !releaseForm.downloadUrl.trim()}>{saving ? '등록 중' : '등록'}</Button></>}
|
||||||
>
|
>
|
||||||
<form className="space-y-5" onSubmit={saveRelease}>
|
<form className="space-y-5" onSubmit={saveRelease}>
|
||||||
<div className="rounded-md border border-border bg-background px-4 py-3">
|
<div className="rounded-md border border-border bg-background px-4 py-3">
|
||||||
<p className="text-sm font-medium">배포 파일 기준 등록</p>
|
<p className="text-sm font-medium">배포 파일 기준 등록</p>
|
||||||
<p className="mt-1 text-xs leading-5 text-muted-foreground">빌드가 끝난 `.deb` 파일의 버전과 다운로드 URL을 런처 배포 기준으로 저장합니다.</p>
|
<p className="mt-1 text-xs leading-5 text-muted-foreground">성공한 빌드 결과의 버전과 다운로드 URL을 런처 배포 기준으로 저장합니다.</p>
|
||||||
</div>
|
</div>
|
||||||
<label className="block">
|
<label className="block">
|
||||||
<span className="text-xs font-medium text-muted-foreground">빌드 결과</span>
|
<span className="text-xs font-medium text-muted-foreground">빌드 결과</span>
|
||||||
@@ -195,7 +198,7 @@ export function LauncherVersionsPage() {
|
|||||||
value={releaseForm.buildJobId}
|
value={releaseForm.buildJobId}
|
||||||
onChange={(event) => selectBuildJob(event.target.value)}
|
onChange={(event) => selectBuildJob(event.target.value)}
|
||||||
>
|
>
|
||||||
<option value="">직접 입력</option>
|
<option value="">빌드 결과 선택</option>
|
||||||
{successfulBuildJobs.map((job) => (
|
{successfulBuildJobs.map((job) => (
|
||||||
<option key={job.id} value={job.id}>
|
<option key={job.id} value={job.id}>
|
||||||
{job.version} · {job.artifact}
|
{job.version} · {job.artifact}
|
||||||
@@ -204,10 +207,12 @@ export function LauncherVersionsPage() {
|
|||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<div className="grid gap-4 md:grid-cols-2">
|
<div className="grid gap-4 md:grid-cols-2">
|
||||||
<label className="block">
|
<div>
|
||||||
<span className="text-xs font-medium text-muted-foreground">버전</span>
|
<span className="text-xs font-medium text-muted-foreground">버전</span>
|
||||||
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={releaseForm.version} onChange={(event) => setReleaseForm((prev) => ({ ...prev, version: event.target.value }))} placeholder="예: 1.0.2" />
|
<div className="mt-2 flex h-9 items-center rounded-md border border-border bg-muted/20 px-3 text-sm font-medium text-foreground">
|
||||||
</label>
|
{displayValue(releaseForm.version)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<label className="block">
|
<label className="block">
|
||||||
<span className="text-xs font-medium text-muted-foreground">최소 지원 버전</span>
|
<span className="text-xs font-medium text-muted-foreground">최소 지원 버전</span>
|
||||||
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={releaseForm.minimumVersion} onChange={(event) => setReleaseForm((prev) => ({ ...prev, minimumVersion: event.target.value }))} placeholder="예: 1.0.0" />
|
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={releaseForm.minimumVersion} onChange={(event) => setReleaseForm((prev) => ({ ...prev, minimumVersion: event.target.value }))} placeholder="예: 1.0.0" />
|
||||||
@@ -215,12 +220,12 @@ export function LauncherVersionsPage() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="rounded-md border border-border bg-background px-4 py-3">
|
<div className="rounded-md border border-border bg-background px-4 py-3">
|
||||||
<p className="text-xs text-muted-foreground">배포 파일</p>
|
<p className="text-xs text-muted-foreground">배포 파일</p>
|
||||||
<p className="mt-2 break-all font-mono text-xs">{currentArtifact}</p>
|
<p className="mt-2 break-all font-mono text-xs">{displayValue(currentArtifact)}</p>
|
||||||
|
</div>
|
||||||
|
<div className="rounded-md border border-border bg-background px-4 py-3">
|
||||||
|
<p className="text-xs text-muted-foreground">다운로드 URL</p>
|
||||||
|
<p className="mt-2 break-all font-mono text-xs text-muted-foreground">{displayValue(releaseForm.downloadUrl)}</p>
|
||||||
</div>
|
</div>
|
||||||
<label className="block">
|
|
||||||
<span className="text-xs font-medium text-muted-foreground">다운로드 URL</span>
|
|
||||||
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 font-mono text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={releaseForm.downloadUrl} onChange={(event) => setReleaseForm((prev) => ({ ...prev, downloadUrl: event.target.value }))} placeholder="https://.../autonomy-studio-launcher-1.0.2.deb" />
|
|
||||||
</label>
|
|
||||||
<label className="block">
|
<label className="block">
|
||||||
<span className="text-xs font-medium text-muted-foreground">릴리즈 노트</span>
|
<span className="text-xs font-medium text-muted-foreground">릴리즈 노트</span>
|
||||||
<textarea className="mt-2 min-h-28 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={releaseForm.releaseNotes} onChange={(event) => setReleaseForm((prev) => ({ ...prev, releaseNotes: event.target.value }))} />
|
<textarea className="mt-2 min-h-28 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={releaseForm.releaseNotes} onChange={(event) => setReleaseForm((prev) => ({ ...prev, releaseNotes: event.target.value }))} />
|
||||||
|
|||||||
Reference in New Issue
Block a user