releases/.github/workflows/release.yml
Yun Chan 02995f4153 MEDIABROWSER 개명·업데이트 채널 전환·아이콘 tofu 근본 수정 (BACKLOG 13차) — ①개명: installer.iss AppName/출력 MediaBrowser-Setup-*(AppId·exe·데이터 경로 유지로 업그레이드 호환), 워크플로 산출물명(mediabrowser-*.tar.gz, MediaBrowser-<ver>-arm64.apk), 창 타이틀·모바일 표시명·obtainium.json·README. ②UpdateChecker: apiBase 주입(기본=자체 Forgejo /api/v1, GitHub 는 apiBase 로 호환), osx 자산 tar.gz 허용(기존 dmg 만 → mac 영원히 자산 없음 결함 수정), AppConfig 기본 UpdateRepo=Video-Downloader/releases+UpdateApiBase — 테스트 4건. ③아이콘 tofu(사용자 보고 "절대 안고쳐지네") 근본 원인: Shared.xaml 암시적 TextBlock 스타일의 FontFamily=UiFont 강제가 버튼 ContentPresenter 자동 TextBlock 의 IconFont 상속을 덮어 모든 PUA 글리프가 notdef — 폰트 설치/글리프 존재/HW·SW 렌더/RTB/DPI/런타임 8·10/자체포함·공유 전부 배제 후 실창 픽셀 비교로 격리, 콘텐츠 TextBlock 의 실폰트가 Pretendard 체인임을 테스트로 실증. 수정: 암시 스타일 FontFamily 제거(창 루트 상속으로 통일, PairingWindow/PlayerWindow 는 SetResourceReference), PUA+텍스트 혼합 콘텐츠 7곳+코드 1곳 정리, 순수 글리프 2곳 IconFont 명시. 회귀 방어: IconGlyphXamlTests(정적 스캔)·IconContentFontTests(실창 폰트 단정)·IconGlyphRenderTests(픽셀 비교) — 462/462 GREEN, 수정 전후 실창 캡처로 글리프 렌더 확인
2026-08-18 07:13:18 +09:00

186 lines
6.7 KiB
YAML

# DEPLOYMENT_PLAN §5 — 태그(v*) 푸시 → 전 아티팩트 매트릭스 빌드 → Draft Release
# D1: test → Windows 설치자 · D2: Android APK · D3: Linux tar.gz
# D4(macOS 서명·공증)/D5(iOS TestFlight)는 Apple Developer Program 시크릿 등록 후 활성화.
name: release
on:
push:
tags: ["v*"]
workflow_dispatch: # 수동 실행(리허설)
env:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
jobs:
# ── 관문: 전 플랫폼 빌드 전에 단위+E2E 통과 ──
test:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x
- name: dotnet test
run: dotnet test VideoDownloader.Tests -c Release
# ── Windows 설치자 (x64 / arm64 교차 publish + Inno Setup) ──
windows:
needs: test
runs-on: windows-latest
strategy:
matrix:
arch: [x64, arm64]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Inno Setup 설치
run: choco install innosetup -y --no-progress
- name: 버전 결정 (태그 v1.2.3 → 1.2.3)
shell: pwsh
run: |
$v = "${{ github.ref_name }}".TrimStart("v")
if ($v -notmatch '^\d+\.\d+\.\d+') { $v = "0.0.0" } # workflow_dispatch 리허설
"APP_VERSION=$v" >> $env:GITHUB_ENV
- name: publish + 설치자
shell: pwsh
run: ./build/publish.ps1 -Config Release -Version $env:APP_VERSION -Archs ${{ matrix.arch }}
- uses: actions/upload-artifact@v4
with:
name: win-${{ matrix.arch }}
path: out/MediaBrowser-Setup-${{ matrix.arch }}.exe
# ── Linux 셸 (tar.gz self-contained — Avalonia + Cli) ──
linux:
needs: test
strategy:
matrix:
include:
- { os: ubuntu-latest, rid: linux-x64 }
- { os: ubuntu-24.04-arm, rid: linux-arm64 }
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x
- name: publish (Cli + Avalonia)
run: |
dotnet publish VideoDownloader.Cli -c Release -r ${{ matrix.rid }} --self-contained -o out/cli-${{ matrix.rid }}
dotnet publish VideoDownloader.Avalonia -c Release -r ${{ matrix.rid }} --self-contained -o out/avalonia-${{ matrix.rid }}
tar -C out -czf out/mediabrowser-${{ matrix.rid }}.tar.gz cli-${{ matrix.rid }} avalonia-${{ matrix.rid }}
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.rid }}
path: out/mediabrowser-${{ matrix.rid }}.tar.gz
# ── macOS 셸 (tar.gz — D4 서명·공증은 Developer ID 시크릿 등록 후 확장) ──
macos:
needs: test
strategy:
matrix:
include:
- { os: macos-latest, rid: osx-arm64 }
- { os: macos-13, rid: osx-x64 }
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x
- name: publish (Cli + Avalonia)
run: |
dotnet publish VideoDownloader.Cli -c Release -r ${{ matrix.rid }} --self-contained -o out/cli-${{ matrix.rid }}
dotnet publish VideoDownloader.Avalonia -c Release -r ${{ matrix.rid }} --self-contained -o out/avalonia-${{ matrix.rid }}
tar -C out -czf out/mediabrowser-${{ matrix.rid }}.tar.gz cli-${{ matrix.rid }} avalonia-${{ matrix.rid }}
# D4: MACOS_P12/KEYCHAIN_PASS/NOTARY_PROFILE 시크릿 등록 시 codesign+notarytool+DMG 스텝 추가
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.rid }}
path: out/mediabrowser-${{ matrix.rid }}.tar.gz
# ── Android APK (D2 — 서명 키스토어 시크릿 없으면 미서명 APK) ──
android:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: microsoft
java-version: "21"
- uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x
- name: MAUI 워크로드
run: dotnet workload install maui-android
- name: publish APK
env:
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASS: ${{ secrets.ANDROID_KEY_PASS }}
run: |
SIGN_ARGS=""
if [ -n "$ANDROID_KEYSTORE_B64" ]; then
echo "$ANDROID_KEYSTORE_B64" | base64 -d > vd.keystore
SIGN_ARGS="-p:AndroidKeyStore=true -p:AndroidSigningKeyStore=$PWD/vd.keystore -p:AndroidSigningKeyAlias=$ANDROID_KEY_ALIAS -p:AndroidSigningKeyPass=$ANDROID_KEY_PASS -p:AndroidSigningStorePass=$ANDROID_KEY_PASS"
else
echo "::notice::ANDROID_KEYSTORE 시크릿 없음 — 미서명 APK 생성"
fi
dotnet publish VideoDownloader.Mobile -f net10.0-android -c Release \
-p:AndroidPackageFormat=apk -p:RuntimeIdentifiers=android-arm64 $SIGN_ARGS \
-o out/android
- uses: actions/upload-artifact@v4
with:
name: android-apk
path: out/android/*-Signed.apk
if-no-files-found: warn
# ── iOS TestFlight (D5 — Apple Developer Program 가입 후 저장소 변수 ENABLE_IOS=true 로 활성화) ──
ios:
if: vars.ENABLE_IOS == 'true'
needs: test
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x
- name: MAUI 워크로드
run: dotnet workload install maui-ios
- name: publish ipa (배포 인증서/프로비저닝 시크릿 필요)
run: |
dotnet publish VideoDownloader.Mobile -f net10.0-ios -c Release \
-p:ArchiveOnBuild=true -p:CodesignKey="${{ secrets.IOS_SIGNING_KEY }}" \
-p:CodesignProvision="${{ secrets.IOS_PROVISION }}" -o out/ios
- uses: actions/upload-artifact@v4
with:
name: ios-ipa
path: out/ios/**/*.ipa
# ── Draft Release (QA 후 수동 Publish 승격) ──
release:
if: startsWith(github.ref, 'refs/tags/v')
needs: [test, windows, linux, macos, android]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- uses: softprops/action-gh-release@v2
with:
draft: true
files: dist/**