appsok/agent-roadmap/archive/phase/security-distribution/milestones/macos-distribution.md

6.2 KiB

Milestone: macOS 배포와 sandbox 검증

위치

  • Roadmap: agent-roadmap/ROADMAP.md
  • Phase: agent-roadmap/phase/security-distribution/PHASE.md

목표

AppSok을 사내 Mac에서 안정적으로 배포할 수 있도록 signing, notarization 배포 기준을 정리하고, sandbox entitlements와 bundled ADB packaging이 배포 산출물에서 유지되는지 검증한다.

상태

[완료]

승격 조건

  • 없음

구현 잠금

  • 상태: 해제
  • SDD: 불필요 - 기존 macOS 배포 스크립트, 문서, 원격 runner 검증을 정리하는 범위이며 새 cross-repo 계약/API/schema 설계 gate가 없다.
  • 잠금 해제 조건: 충족. signing/notarization/배포 자동화 기준은 원격 Mac runner evidence 기준으로 확정한다.
  • 결정 필요: 없음
  • 확정:
    • 사용자 표시명은 AppSok으로 통일하고, URL scheme/package/bundle id의 소문자 appsok 식별자는 유지한다.
    • 사내 배포 경로는 Developer ID signing과 Apple notarization 기준으로 둔다.
    • AppSok 배포 signing identity는 원격 Mac runner의 Developer ID Application: Dongmyung Lee (AWA82DP9WD)를 사용한다.
    • notarytool은 원격 Mac runner의 SOPS encrypted CI secret과 login Keychain에 저장된 appsok-notary profile을 사용한다. 비밀값은 기록하지 않는다.
    • 배포 산출물은 notarized/stapled AppSok.app을 포함한 AppSok-certified.zip.sha256 checksum 파일로 둔다.
    • "아무 맥에서나 설치" 범위는 현재 certified build 산출물 기준 universal build(x86_64 arm64)로 둔다.
    • sandbox는 유지한다. signed app entitlements의 app-sandboxnetwork.client는 true이며, bundled adb devices -l은 certified app bundle resource에서 실행된다.

범위

  • macOS app bundle metadata
  • entitlement와 sandbox 검증
  • network client entitlement와 bundled ADB resource packaging 검증
  • bundled ADB runtime의 nested binary/dylib signing과 실행 검증
  • Developer ID signing, notarization, staple, MDM 배포 후보 문서화

기능

Epic: [distribution] 배포 방식

엔드유저가 경고 없이 설치하고 실행할 수 있는 사내 배포 방식을 정한다.

  • [bundle-id] bundle id와 앱 표시 이름 정책을 확정한다.
  • [signing] Developer ID signing/notarization 또는 MDM 배포 절차를 문서화한다.
  • [notary-profile] notarytool Keychain profile 존재 여부와 세팅 절차를 비밀값 없이 문서화한다.
  • [staple-assess] notarization 후 stapling과 spctl --assess 검증 절차를 문서화한다.
  • [arch-policy] Apple Silicon only 또는 universal build 배포 정책을 문서화한다.
  • [platform-tools] bundled ADB runtime의 포함 파일, version pinning, 업데이트 책임, NOTICE 보존 방식을 문서화한다.
  • [release-checklist] 배포 전 검증 checklist를 작성한다.

완료 리뷰

  • 상태: 통과
  • 요청일: 2026-06-17
  • 완료 근거:
    • 원격 Mac runner의 current HEAD 4aaedc8에서 ./scripts/build-certified-macos.sh가 Flutter gate, macOS build, Developer ID signing, notarization Accepted, stapling, Gatekeeper assessment를 모두 통과했다.
    • certified artifact AppSok-certified.zip.sha256이 생성됐고, bundle metadata, signing identity, sandbox/network entitlement, bundled ADB runtime, universal binary 여부를 확인했다. 최신 checksum은 0b379602777efcf51b662581bcbaea9d2ab7c10737cab932b1aaf614c540bc6a다.
    • 배포 방식 Epic의 모든 기능 Task가 문서와 원격 evidence로 충족됐다.
  • 리뷰 필요:
    • 사용자가 완료 결과를 확인했다
    • archive 이동을 승인했다
  • 리뷰 코멘트: 2026-06-17 22:10 UTC certified build evidence 기준으로 완료한다. 배포 산출물 사용 중 발견한 문제는 이 Milestone의 기능 Task가 아니라 별도 Milestone 또는 follow-up Task로 추가한다.

범위 제외

  • Auth Broker 또는 Jenkins plugin 구현
  • 중앙 감사 서버
  • 사용자 Mac의 Android Studio 또는 Android Platform Tools 설치를 기본 전제로 삼는 배포 방식
  • Windows/Linux desktop target

작업 컨텍스트

  • 관련 경로: macos/Runner/, macos/Runner.xcodeproj/, pubspec.yaml
  • 표준선(선택): sandbox는 가능한 유지하고, 불가능한 경우 사유와 대안을 문서화한다.
  • 표준선(선택): 내부 ops 도구 기준으로 ADB는 AppSok-managed bundled runtime을 기본 제공하고, 사용자 환경의 adb는 override/fallback으로만 둔다.
  • 검증 메모: bundled adb, NOTICE.txt, source.properties를 포함하고 signing/notarization 전후 실행 여부를 remote Mac runner에서 확인한다. 현 pinned adbotool -L 기준 비시스템 dylib 의존성이 없어 별도 lib64/*.dylib bundle이 필요하지 않다.
  • 2026-06-17 원격 검증: toki@toki-labs.com checkout 4aaedc8에서 ./scripts/build-certified-macos.shflutter analyze, flutter test, flutter build macos, bundled adb Developer ID signing, app signing, notarization Accepted, stapler, spctl --assess를 모두 통과했다.
  • 2026-06-17 certified artifact: build/macos/Build/Products/Release/AppSok-certified.zip, size 23M, sha256 0b379602777efcf51b662581bcbaea9d2ab7c10737cab932b1aaf614c540bc6a.
  • 2026-06-17 bundle metadata: built app의 CFBundleName=AppSok, CFBundleIdentifier=com.tokilabs.appsok, URL scheme appsok을 확인했다.
  • 2026-06-17 signing/runtime: signed app의 TeamIdentifier=AWA82DP9WD, authority Developer ID Application: Dongmyung Lee (AWA82DP9WD), hardened runtime, entitlements com.apple.security.app-sandbox=true, com.apple.security.network.client=true를 확인했다.
  • 2026-06-17 ADB runtime: certified app bundle resource의 adb version35.0.0-11411520, adb devices -l은 Android emulator를 감지했고, AppSok app binary와 bundled adb는 모두 x86_64 arm64 universal binary다.
  • 선행 작업: 사용 가능한 MVP
  • 후속 작업: Auth Broker와 Jenkins Plugin 후보 검토
  • 정리: 실제 사용자 환경에서의 앱 조작 확인은 이 Milestone의 기능 Task로 추적하지 않는다. 배포 산출물 사용 중 발견한 문제는 별도 follow-up으로 추가한다.