사이트 인터랙티브 워크스테이션 확장 + 감사 폴리시 재적용 + 원클릭 릴리스 도구 — 병행 세션 확장분(히어로 3탭 워크스테이션 시뮬레이터, 비교 섹션(기존 방식 vs MEDIABROWSER), 가이드 단축키 섹션(kbd), 스포트라이트 카드, build/release.ps1 원클릭 릴리스(-Publish/-DeploySite), build-remote.ps1 PowerShell 원격 빌드, upload-release-asset.ps1 로컬 실행 지원(.env 자동 로드·-Publish 승격·-Repo), fetch-releases.mjs 인증·폴백)을 수용하고, 덮여 사라진 감사 폴리시를 새 베이스에 재적용: 타이틀 em대시 제거+OG 메타(index/guide), 아이브로우 6→1(장식 점 제거), 히어로 2줄 헤드라인·20단어 서브·CTA 라벨 단일화·신뢰 스트립 제거, 파이프라인 3분리 카드→단일 머신드 레일 재구성, 과장 카피 완화(100%·1초·초고속·완벽), 시뮬레이터 예시 캡션, skip-link·focus-visible·hero__grid min-width:0(모바일 오버플로) 재적용 — 데스크톱/모바일 검증(scrollWidth 375==375, 아이브로우 1, 레일·캡션·탭 3종 확인), deploy-site.ps1 로 재배포 완료

This commit is contained in:
Yun Chan 2026-08-18 10:35:53 +09:00
parent 9c9d9cb024
commit f13914534a
11 changed files with 976 additions and 246 deletions

View file

@ -0,0 +1,66 @@
# MediaBrowser 원격 빌드 수집 스크립트 (PowerShell)
# 빌드머신(vd-linux / vd-mac)에서 Cli + Avalonia 셸을 RID별 self-contained publish 하고
# 산출물을 out/mediabrowser-<rid>.tar.gz 로 수집한다.
#
# 사용: ./build/remote/build-remote.ps1 [-Target mac|linux|all]
param(
[ValidateSet("mac", "linux", "all")]
[string]$Target = "all"
)
$ErrorActionPreference = "Stop"
$root = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
$outDir = Join-Path $root "out"
New-Item -ItemType Directory -Path $outDir -Force | Out-Null
$remoteDir = "build/videodownloader"
function Push-Source {
param([string]$HostName)
Write-Host "==> [$HostName] 소스 코드 아카이브 전송" -ForegroundColor Cyan
$tempTar = Join-Path $outDir "source_sync.tar"
if (Test-Path $tempTar) { Remove-Item $tempTar -Force }
# git archive 생성
git archive --format=tar -o $tempTar HEAD
if ($LASTEXITCODE -ne 0) { throw "git archive 생성 실패" }
# 원격 폴더 초기화 및 tar 전송/풀기
& ssh.exe $HostName "rm -rf $remoteDir && mkdir -p $remoteDir"
& scp.exe $tempTar "${HostName}:${remoteDir}/source_sync.tar"
& ssh.exe $HostName "tar -xf $remoteDir/source_sync.tar -C $remoteDir && rm -f $remoteDir/source_sync.tar"
Remove-Item $tempTar -Force -ErrorAction SilentlyContinue
}
function Build-And-Collect {
param([string]$HostName, [string]$Rid)
Write-Host "==> [$HostName] publish $Rid" -ForegroundColor Cyan
$cmd = "cd $remoteDir && export DOTNET_ROOT=`$HOME/.dotnet && export PATH=`$HOME/.dotnet:`$PATH && " +
"dotnet publish VideoDownloader.Cli -c Release -r $Rid --self-contained -o out/cli-$Rid && " +
"dotnet publish VideoDownloader.Avalonia -c Release -r $Rid --self-contained -o out/avalonia-$Rid && " +
"cd out && tar -czf mediabrowser-$Rid.tar.gz cli-$Rid avalonia-$Rid"
& ssh.exe $HostName $cmd
if ($LASTEXITCODE -ne 0) { throw "[$HostName] 빌드 실패: $Rid" }
$localTarget = Join-Path $outDir "mediabrowser-$Rid.tar.gz"
Write-Host "==> [$HostName] 수집: mediabrowser-$Rid.tar.gz" -ForegroundColor Green
& scp.exe "${HostName}:${remoteDir}/out/mediabrowser-$Rid.tar.gz" $localTarget
if ($LASTEXITCODE -ne 0) { throw "[$HostName] 산출물 수집 실패: $Rid" }
}
if ($Target -eq "mac" -or $Target -eq "all") {
Push-Source "vd-mac"
Build-And-Collect "vd-mac" "osx-arm64"
Build-And-Collect "vd-mac" "osx-x64"
}
if ($Target -eq "linux" -or $Target -eq "all") {
Push-Source "vd-linux"
Build-And-Collect "vd-linux" "linux-x64"
Build-And-Collect "vd-linux" "linux-arm64"
}
Write-Host "`n원격 빌드 및 수집 완료:" -ForegroundColor Green
Get-ChildItem (Join-Path $outDir "mediabrowser-*.tar.gz") |
ForEach-Object { Write-Host (" {0,-35} {1:N1} MB" -f $_.Name, ($_.Length / 1MB)) }

View file

@ -1,43 +1,46 @@
#!/usr/bin/env bash
# 빌드머신(ChanpacaLaptop=linux-x64 / Mac mini=osx-arm64)에서
# git HEAD 소스를 전송해 Cli + Avalonia 셸을 RID별 self-contained publish 하고
# 산출물을 로컬 out/remote/<rid>/ 로 수집한다.
# 빌드머신(ChanpacaLaptop=linux / Mac mini=macos)에서
# Cli + Avalonia 셸을 RID별 self-contained publish 하고
# 산출물을 로컬 out/mediabrowser-<rid>.tar.gz 로 수집한다.
#
# 사용 (Windows Git Bash): bash build/remote/build-remote.sh [linux|mac|all]
# 사전 조건: ssh 별칭 vd-linux / vd-mac (키 인증), 각 머신 ~/.dotnet SDK 8
# 사용: bash build/remote/build-remote.sh [linux|mac|all]
set -euo pipefail
cd "$(dirname "$0")/../.."
TARGET="${1:-all}"
REMOTE_DIR="build/videodownloader"
mkdir -p out
push_src() { # $1 = ssh 대상
echo "==> [$1] 소스 코드 전송"
git archive HEAD | ssh -o BatchMode=yes "$1" "rm -rf $REMOTE_DIR && mkdir -p $REMOTE_DIR && tar -x -C $REMOTE_DIR"
}
build_on() { # $1 = ssh 대상, $2 = RID
echo "==> [$1] publish $2"
ssh -o BatchMode=yes "$1" "cd $REMOTE_DIR && export DOTNET_ROOT=\$HOME/.dotnet && export PATH=\$HOME/.dotnet:\$PATH && \
dotnet publish VideoDownloader.Cli -c Release -r $2 --self-contained -o out/cli-$2 && \
dotnet publish VideoDownloader.Avalonia -c Release -r $2 --self-contained -o out/avalonia-$2 && \
cd out && tar -czf artifacts-$2.tar.gz cli-$2 avalonia-$2"
build_and_collect() { # $1 = ssh 대상, $2 = RID
local host="$1"
local rid="$2"
echo "==> [$host] publish $rid"
ssh -o BatchMode=yes "$host" "cd $REMOTE_DIR && export DOTNET_ROOT=\$HOME/.dotnet && export PATH=\$HOME/.dotnet:\$PATH && \
dotnet publish VideoDownloader.Cli -c Release -r $rid --self-contained -o out/cli-$rid && \
dotnet publish VideoDownloader.Avalonia -c Release -r $rid --self-contained -o out/avalonia-$rid && \
cd out && tar -czf mediabrowser-$rid.tar.gz cli-$rid avalonia-$rid"
echo "==> [$host] 수집: out/mediabrowser-$rid.tar.gz"
scp -o BatchMode=yes "$host:$REMOTE_DIR/out/mediabrowser-$rid.tar.gz" "out/mediabrowser-$rid.tar.gz"
}
collect() { # $1 = ssh 대상, $2 = RID
mkdir -p "out/remote/$2"
scp -o BatchMode=yes "$1:$REMOTE_DIR/out/artifacts-$2.tar.gz" "out/remote/$2/" && \
tar -xzf "out/remote/$2/artifacts-$2.tar.gz" -C "out/remote/$2" && \
echo " 수집: out/remote/$2/{cli-$2,avalonia-$2}"
}
if [[ "$TARGET" == "mac" || "$TARGET" == "all" ]]; then
push_src vd-mac
build_and_collect vd-mac osx-arm64
build_and_collect vd-mac osx-x64
fi
if [[ "$TARGET" == "linux" || "$TARGET" == "all" ]]; then
push_src vd-linux
build_on vd-linux linux-x64
collect vd-linux linux-x64
build_and_collect vd-linux linux-x64
build_and_collect vd-linux linux-arm64
fi
if [[ "$TARGET" == "mac" || "$TARGET" == "all" ]]; then
push_src vd-mac
build_on vd-mac osx-arm64
collect vd-mac osx-arm64
fi
echo "완료."
echo "==> 원격 빌드 완료:"
ls -lh out/mediabrowser-*.tar.gz 2>/dev/null || true