From c89210ac6a18d48f33b430d059aaac75b5d63f7e Mon Sep 17 00:00:00 2001 From: chyoo Date: Wed, 8 Jul 2026 15:24:08 +0900 Subject: [PATCH] add launcher component secret setting support --- src/pages/launcher/LauncherComponentsPage.tsx | 41 ++++++++++++------- src/pages/launcher/launcher-api.ts | 3 +- src/pages/runtime/RuntimeConfigPage.tsx | 9 ++-- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/pages/launcher/LauncherComponentsPage.tsx b/src/pages/launcher/LauncherComponentsPage.tsx index 9e18f51..c20a011 100644 --- a/src/pages/launcher/LauncherComponentsPage.tsx +++ b/src/pages/launcher/LauncherComponentsPage.tsx @@ -122,7 +122,7 @@ export function LauncherComponentsPage() { const [logs, setLogs] = useState(''); const [logLoading, setLogLoading] = useState(false); const [envTarget, setEnvTarget] = useState(null); - const [envVariables, setEnvVariables] = useState>([]); + const [envVariables, setEnvVariables] = useState>([]); const [envLoading, setEnvLoading] = useState(false); const [envSaving, setEnvSaving] = useState(false); const loadingVisible = useMinimumLoading(loading || logLoading); @@ -187,12 +187,12 @@ export function LauncherComponentsPage() { setEnvVariables(result.variables ?? []); }) .catch((error: Error) => { - toast({ type: 'error', title: '환경변수 조회 실패', message: error.message }); + toast({ type: 'error', title: '설정값 조회 실패', message: error.message }); }) .finally(() => setEnvLoading(false)); }; - const updateEnvVariable = (index: number, patch: Partial<{ key: string; value: string }>) => { + const updateEnvVariable = (index: number, patch: Partial<{ key: string; value: string; isSecret: boolean }>) => { setEnvVariables((prev) => prev.map((variable, variableIndex) => ( variableIndex === index ? { ...variable, ...patch } : variable ))); @@ -211,16 +211,16 @@ export function LauncherComponentsPage() { envTarget.workloadName, envVariables .filter((variable) => variable.editable) - .map((variable) => ({ key: variable.key.trim(), value: variable.value })) + .map((variable) => ({ key: variable.key.trim(), value: variable.value, isSecret: variable.isSecret })) .filter((variable) => variable.key) ) .then((result) => { setEnvVariables(result.variables ?? []); - toast({ type: 'success', title: '환경변수 저장', message: `${envTarget.name} 환경변수를 반영했습니다.` }); + toast({ type: 'success', title: '설정값 저장', message: `${envTarget.name} 설정값을 반영했습니다.` }); refresh(); }) .catch((error: Error) => { - toast({ type: 'error', title: '환경변수 저장 실패', message: error.message }); + toast({ type: 'error', title: '설정값 저장 실패', message: error.message }); }) .finally(() => setEnvSaving(false)); }; @@ -329,7 +329,7 @@ export function LauncherComponentsPage() { {component.type === 'backend' ? ( ) : null} @@ -396,7 +396,7 @@ export function LauncherComponentsPage() { setEnvTarget(null)} className="!max-w-4xl" footer={ @@ -410,14 +410,15 @@ export function LauncherComponentsPage() { >

- 저장하면 Kubernetes Deployment 환경변수가 변경되고 새 Pod로 롤아웃됩니다. Secret/ConfigMap에서 주입된 값은 여기서 직접 수정하지 않습니다. + Secret을 체크하면 Kubernetes Secret에 저장하고 secretKeyRef로 연결합니다. 체크하지 않은 값은 Deployment 환경변수로 저장합니다.

- +
+ @@ -425,12 +426,12 @@ export function LauncherComponentsPage() { {envLoading ? ( - + ) : null} {!envLoading && envVariables.length === 0 ? ( - + ) : null} {!envLoading && envVariables.map((variable, index) => ( @@ -451,6 +452,18 @@ export function LauncherComponentsPage() { onChange={(event) => updateEnvVariable(index, { value: event.target.value })} /> + @@ -473,11 +486,11 @@ export function LauncherComponentsPage() { diff --git a/src/pages/launcher/launcher-api.ts b/src/pages/launcher/launcher-api.ts index ecc02a0..9407061 100644 --- a/src/pages/launcher/launcher-api.ts +++ b/src/pages/launcher/launcher-api.ts @@ -425,6 +425,7 @@ export function deleteLauncherCommonSetting(id: string) { export type RuntimeWorkloadEnvVariable = { key: string; value: string; + isSecret: boolean; editable: boolean; source: string; }; @@ -447,7 +448,7 @@ export function saveRuntimeWorkloadEnv( namespace: string, kind: string, name: string, - variables: Array<{ key: string; value: string }> + variables: Array<{ key: string; value: string; isSecret: boolean }> ) { return apiRequest<{ namespace: string; diff --git a/src/pages/runtime/RuntimeConfigPage.tsx b/src/pages/runtime/RuntimeConfigPage.tsx index fe91697..48195b2 100644 --- a/src/pages/runtime/RuntimeConfigPage.tsx +++ b/src/pages/runtime/RuntimeConfigPage.tsx @@ -466,9 +466,8 @@ export function RuntimeConfigPage() {
Key ValueSecret Source
환경변수를 불러오는 중입니다.설정값을 불러오는 중입니다.
등록된 환경변수가 없습니다.등록된 설정값이 없습니다.
+ + {variable.source}
- - - + + @@ -476,13 +475,12 @@ export function RuntimeConfigPage() { - {variables.length === 0 ? ( - + ) : null} {variables.map((variable) => ( @@ -494,7 +492,6 @@ export function RuntimeConfigPage() { -
구성요소 Key Value등록일 관리
등록된 설정값이 없습니다.
등록된 설정값이 없습니다.
{variable.key} {variable.isSecret ? '********' : variable.value}{formatDate(variable.createdAt)}