align launcher build version handling

This commit is contained in:
2026-07-03 10:46:34 +09:00
parent 98726c5605
commit ef89581af6
4 changed files with 27 additions and 17 deletions
@@ -140,7 +140,7 @@ export function DeploymentManagementPage() {
<PageTitle
eyebrow="어플리케이션"
title="배포 관리"
description="생성된 릴리즈를 개발, 검수, 운영 환경에 배포하고 재배포와 롤백을 관리합니다."
description="생성된 릴리즈를 개발 또는 운영 환경에 배포하고 재배포와 롤백을 관리합니다."
actions={
<Button className="h-8 px-3 text-[13px]" disabled={filteredReleases.length === 0} onClick={() => openDeployModal()}>
<Plus className="size-4" />
@@ -268,7 +268,10 @@ export function DeploymentManagementPage() {
<option value="">릴리즈 선택</option>
{filteredReleases.map((release) => <option key={release.id} value={release.id}>{release.app.name} {release.version}</option>)}
</select>
<input className="h-9 w-full rounded-md border border-input bg-background px-3 text-sm outline-none" value={environment} onChange={(event) => setEnvironment(event.target.value)} placeholder="dev / release / prod" />
<select className="h-9 w-full rounded-md border border-input bg-background px-3 text-sm outline-none" value={environment} onChange={(event) => setEnvironment(event.target.value)}>
<option value="dev">개발</option>
<option value="prod">운영</option>
</select>
<input className="h-9 w-full rounded-md border border-input bg-background px-3 text-sm outline-none" value={namespace} onChange={(event) => setNamespace(event.target.value)} placeholder="stdo-lms" />
<label className="flex items-center gap-2 rounded-md border border-border bg-muted/20 px-3 py-2 text-sm text-foreground">
<input
+16 -8
View File
@@ -90,6 +90,7 @@ export function LauncherBuildPage() {
const backendSource = source?.backend;
const clientSource = source?.client;
const artifactName = `autonomy-studio-launcher-${version || activeVersion?.version || '0.0.0'}.deb`;
const clientArtifactPreview = 'package.json 버전과 실제 .deb 파일명 기준으로 빌드 후 자동 확정';
const backendImageName = backendSource?.image || 'localhost:5000/studio-launcher-be';
const backendImageTag = `${backendImageName.replace(/\/$/, '')}:${version || '0.1.0'}`;
const backendDockerfile = backendSource?.dockerfile || 'Dockerfile';
@@ -163,9 +164,9 @@ export function LauncherBuildPage() {
repository: isBackend ? backendSource?.repository ?? undefined : clientSource?.repository ?? activeVersion?.repository ?? undefined,
branch,
commitSha: commitSha.trim() || undefined,
version: version.trim(),
version: isBackend ? version.trim() : undefined,
uploadPath: isBackend ? backendDockerfile : uploadPath,
artifact: isBackend ? backendImageName.replace(/^localhost:5000\//, '') : artifactName,
artifact: isBackend ? backendImageName.replace(/^localhost:5000\//, '') : undefined,
downloadUrl: isBackend ? backendImageTag : r2PublicBaseUrl ? downloadUrl : undefined
})
.then(({ job }) => {
@@ -187,7 +188,7 @@ export function LauncherBuildPage() {
title="빌드 관리"
description="런처 클라이언트 설치 파일과 백엔드 컨테이너 이미지를 구성요소별로 빌드합니다."
actions={
<Button className="h-8 px-3 text-[13px]" onClick={createJob} disabled={!version.trim()}>
<Button className="h-8 px-3 text-[13px]" onClick={createJob} disabled={isBackend && !version.trim()}>
<Play className="size-4" />
실행
</Button>
@@ -207,10 +208,17 @@ export function LauncherBuildPage() {
<Card className="min-w-0 overflow-hidden">
<CardHeader title="빌드 요청" description={isBackend ? '브랜치와 커밋 기준으로 런처 백엔드 이미지를 빌드하고 레지스트리에 푸시합니다.' : '브랜치와 커밋 기준으로 런처 설치 파일을 생성합니다.'} />
<div className="space-y-4 p-5">
{isBackend ? (
<label className="block">
<span className="text-xs font-medium text-muted-foreground">{isBackend ? '이미지 태그' : '버전'}</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={version} onChange={(event) => setVersion(event.target.value)} />
</label>
) : (
<div className="rounded-md border border-border bg-muted/20 px-3 py-2">
<p className="text-xs font-medium text-muted-foreground">버전</p>
<p className="mt-1 text-sm font-medium text-foreground">빌드 후 package.json 기준으로 자동 확정</p>
</div>
)}
<label className="block">
<span className="text-xs font-medium text-muted-foreground">브랜치</span>
<select 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={branch} onChange={(event) => setBranch(event.target.value)}>
@@ -224,12 +232,12 @@ export function LauncherBuildPage() {
<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 placeholder:text-muted-foreground focus:ring-2 focus:ring-ring" value={commitSha} onChange={(event) => setCommitSha(event.target.value)} placeholder="비워두면 브랜치 최신 커밋" />
</label>
<div className="rounded-md border border-border bg-background p-3">
<p className="text-xs text-muted-foreground">{isBackend ? '이미지' : '예상 산출물'}</p>
<p className="mt-2 break-all font-mono text-xs text-foreground">{isBackend ? backendImageTag : artifactName}</p>
<p className="text-xs text-muted-foreground">{isBackend ? '이미지' : '산출물'}</p>
<p className="mt-2 break-all font-mono text-xs text-foreground">{isBackend ? backendImageTag : clientArtifactPreview}</p>
<p className="mt-2 text-xs text-muted-foreground">{isBackend ? 'Dockerfile' : 'R2 Object Key'}</p>
<p className="mt-1 break-all font-mono text-xs text-foreground">{isBackend ? backendDockerfile : uploadPath}</p>
<p className="mt-1 break-all font-mono text-xs text-foreground">{isBackend ? backendDockerfile : clientArtifactPreview}</p>
<p className="mt-2 text-xs text-muted-foreground">{isBackend ? 'Repository' : '다운로드 URL'}</p>
<p className="mt-1 break-all font-mono text-xs text-foreground">{isBackend ? backendSource?.repository || '-' : downloadUrl}</p>
<p className="mt-1 break-all font-mono text-xs text-foreground">{isBackend ? backendSource?.repository || '-' : clientArtifactPreview}</p>
</div>
</div>
</Card>
+2 -2
View File
@@ -160,8 +160,8 @@ export function createLauncherBuildJob(input: {
repository?: string;
branch?: string;
commitSha?: string;
version: string;
artifact: string;
version?: string;
artifact?: string;
uploadPath?: string;
downloadUrl?: string;
}) {
+1 -2
View File
@@ -367,7 +367,7 @@ export function RuntimeConfigPage() {
<div className="flex items-start justify-between gap-4 border-b border-border px-5 py-4">
<div>
<h2 className="text-sm font-semibold text-foreground">런타임 프로필</h2>
<p className="mt-1 text-xs leading-5 text-muted-foreground">개발, 검수, 운영처럼 배포 환경별로 적용할 설정 묶음입니다.</p>
<p className="mt-1 text-xs leading-5 text-muted-foreground">개발과 운영처럼 배포 환경별로 적용할 설정 묶음입니다.</p>
</div>
<span className="text-xs text-muted-foreground">총 {profiles.length}개</span>
</div>
@@ -643,7 +643,6 @@ export function RuntimeConfigPage() {
<span className="text-xs font-medium text-muted-foreground">환경</span>
<select 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={profileEnvironment} onChange={(event) => setProfileEnvironment(event.target.value)}>
<option value="dev">개발</option>
<option value="stage">검수</option>
<option value="prod">운영</option>
</select>
</label>