update agent-roadmap: security-distribution phase and macos-distribution milestone

This commit is contained in:
toki 2026-06-17 20:16:48 +09:00
parent 6d4671b647
commit eac40fd3d2
2 changed files with 37 additions and 36 deletions

View file

@ -17,9 +17,9 @@ AppSok을 개인용 도구에서 사내 표준 도구로 확장하기 위한 배
- [완료] Jenkins 얇은 빌드와 artifact 다운로드
- 경로: `agent-roadmap/archive/phase/security-distribution/milestones/jenkins-thin-artifact-ci.md`
- 요약: OTO 없이 Jenkins job만 얇게 구성해 AppSok 인증 ZIP을 빌드하고 Jenkins artifact 링크로 바로 다운로드할 수 있게 한다.
- [계획] macOS 배포와 sandbox 검증
- [검토중] macOS 배포와 sandbox 검증
- 경로: `agent-roadmap/phase/security-distribution/milestones/macos-distribution.md`
- 요약: signing/notarization/MDM 후보와 sandbox 상태에서 Jenkins/Keychain/ADB가 동작하는지 검증한다.
- 요약: Developer ID signing/notarization 배포 기준과 sandbox entitlement, bundled ADB packaging을 certified build evidence로 검증한다.
- [스케치] Auth Broker와 Jenkins Plugin 후보 검토
- 경로: `agent-roadmap/phase/security-distribution/milestones/auth-broker-evaluation.md`
- 요약: 별도 서버 또는 Jenkins plugin으로 Web Login callback을 제공할지, 사용자별 token 자동화로 충분한지 결정한다.

View file

@ -7,11 +7,11 @@
## 목표
AppSok을 사내 Mac에서 안정적으로 실행할 수 있도록 signing, notarization 또는 MDM 배포 후보를 정리하고, sandbox 상태에서 Jenkins network, Keychain, ADB 실행이 가능한지 검증한다.
AppSok을 사내 Mac에서 안정적으로 배포할 수 있도록 signing, notarization 배포 기준을 정리하고, sandbox entitlements와 bundled ADB packaging이 배포 산출물에서 유지되는지 검증한다.
## 상태
[계획]
[검토중]
## 승격 조건
@ -19,57 +19,53 @@ AppSok을 사내 Mac에서 안정적으로 실행할 수 있도록 signing, nota
## 구현 잠금
- 상태: 잠금
- 잠금 해제 조건: 사용자 리뷰에서 아래 항목을 승인하거나 방향을 결정할 때까지 signing/notarization/배포 자동화 구현을 시작하지 않는다.
- 결정 필요: 사용자 리뷰 체크리스트
- [ ] 사용자 표시명은 `AppSok`으로 통일하고, URL scheme/package/bundle id의 소문자 `appsok` 식별자는 유지하는 방향을 최종 승인한다.
- [ ] 사내 배포 경로를 Developer ID/notarization, MDM, unsigned internal build 중 무엇으로 할지 결정한다.
- [ ] 원격 Mac runner의 `Developer ID Application: Dongmyung Lee (AWA82DP9WD)` identity를 AppSok 배포 signing identity로 사용할지 승인한다.
- [ ] `notarytool` Keychain profile 이름과 Apple notary credential 세팅 주체를 확정한다.
- [ ] notarization 후 `stapler`로 ticket을 붙인 `.app`, `.zip`, `.dmg`, `.pkg` 중 어떤 산출물을 배포할지 결정한다.
- [ ] "아무 맥에서나 설치" 범위를 Apple Silicon only로 볼지, Intel Mac까지 포함하는 universal build로 볼지 결정한다.
- [ ] sandbox를 유지할지, ADB 실행 때문에 sandbox 해제가 필요한지 검증한다.
- 상태: 해제
- SDD: 불필요 - 기존 macOS 배포 스크립트, 문서, 원격 runner 검증을 정리하는 범위이며 새 cross-repo 계약/API/schema 설계 gate가 없다.
- 잠금 해제 조건: 충족. signing/notarization/배포 자동화 기준은 원격 Mac runner evidence 기준으로 확정한다.
- 결정 필요: 없음
- 확정:
- [x] 사용자 표시명은 `AppSok`으로 통일하고, URL scheme/package/bundle id의 소문자 `appsok` 식별자는 유지한다.
- [x] 사내 배포 경로는 Developer ID signing과 Apple notarization 기준으로 둔다.
- [x] AppSok 배포 signing identity는 원격 Mac runner의 `Developer ID Application: Dongmyung Lee (AWA82DP9WD)`를 사용한다.
- [x] `notarytool`은 원격 Mac runner의 SOPS encrypted CI secret과 login Keychain에 저장된 `appsok-notary` profile을 사용한다. 비밀값은 기록하지 않는다.
- [x] 배포 산출물은 notarized/stapled `AppSok.app`을 포함한 `AppSok-certified.zip``.sha256` checksum 파일로 둔다.
- [x] "아무 맥에서나 설치" 범위는 현재 certified build 산출물 기준 universal build(`x86_64 arm64`)로 둔다.
- [x] sandbox는 유지한다. signed app entitlements의 `app-sandbox``network.client`는 true이며, bundled `adb devices -l`은 certified app bundle resource에서 실행된다.
## 범위
- macOS app bundle metadata
- entitlement와 sandbox 검증
- Keychain/network/ADB 실행 smoke test
- network client entitlement와 bundled ADB resource packaging 검증
- bundled ADB runtime의 nested binary/dylib signing과 실행 검증
- Developer ID signing, notarization, staple, MDM 배포 후보 문서화
## 기능
### Epic: [runtime] macOS runtime 검증
앱이 실제 사내 Mac에서 필요한 외부 자원에 접근할 수 있는지 확인한다.
- [ ] [network] sandbox 상태에서 Jenkins HTTPS 호출이 가능한지 확인한다.
- [ ] [keychain] `flutter_secure_storage` Keychain read/write가 배포 build에서 동작하는지 확인한다.
- [ ] [adb-exec] sandbox 상태에서 bundled `adb devices -l``adb install` 실행 가능 여부를 확인한다.
- [ ] [url-scheme] `appsok://` URL scheme이 설치된 앱으로 전달되는지 확인한다.
### 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를 작성한다.
- [x] [bundle-id] bundle id와 앱 표시 이름 정책을 확정한다.
- [x] [signing] Developer ID signing/notarization 또는 MDM 배포 절차를 문서화한다.
- [x] [notary-profile] `notarytool` Keychain profile 존재 여부와 세팅 절차를 비밀값 없이 문서화한다.
- [x] [staple-assess] notarization 후 stapling과 `spctl --assess` 검증 절차를 문서화한다.
- [x] [arch-policy] Apple Silicon only 또는 universal build 배포 정책을 문서화한다.
- [x] [platform-tools] bundled ADB runtime의 포함 파일, version pinning, 업데이트 책임, NOTICE 보존 방식을 문서화한다.
- [x] [release-checklist] 배포 전 검증 checklist를 작성한다.
## 완료 리뷰
- 상태: 없음
- 요청일: 없음
- 완료 근거: 모든 기능 Task와 Task 안에 명시된 검증 충족 후 기록한다.
- 상태: 요청됨
- 요청일: 2026-06-17
- 완료 근거:
- 원격 Mac runner에서 `./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 여부를 확인했다.
- 배포 방식 Epic의 모든 기능 Task가 문서와 원격 evidence로 충족됐다.
- 리뷰 필요:
- [ ] 사용자가 완료 결과를 확인했다
- [ ] archive 이동을 승인했다
- 리뷰 코멘트: 없음
- 리뷰 코멘트: 배포 산출물 사용 중 발견한 문제는 이 Milestone의 기능 Task가 아니라 별도 Milestone 또는 follow-up Task로 추가한다.
## 범위 제외
@ -84,6 +80,11 @@ AppSok을 사내 Mac에서 안정적으로 실행할 수 있도록 signing, nota
- 표준선(선택): sandbox는 가능한 유지하고, 불가능한 경우 사유와 대안을 문서화한다.
- 표준선(선택): 내부 ops 도구 기준으로 ADB는 AppSok-managed bundled runtime을 기본 제공하고, 사용자 환경의 `adb`는 override/fallback으로만 둔다.
- 검증 메모: bundled `adb`, 필요한 `lib64/*.dylib`, `NOTICE.txt`, `source.properties`를 포함하고 signing/notarization 전후 실행 여부를 remote Mac runner에서 확인한다.
- 2026-06-17 원격 검증: `toki@toki-labs.com` checkout `03df593`에서 `./scripts/build-certified-macos.sh``flutter 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 `1bcefb7acf70c36cdddd8e9de82bf7c7fd79ddcdd2f2b8fffbee36f2c59280a1`.
- 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 version``35.0.0-11411520`, `adb devices -l`은 Android emulator를 감지했고, AppSok app binary와 bundled `adb`는 모두 `x86_64 arm64` universal binary다.
- 선행 작업: 사용 가능한 MVP
- 후속 작업: Auth Broker와 Jenkins Plugin 후보 검토
- 확인 필요: 구현 잠금의 사용자 리뷰 체크리스트가 AppSok 표시명 승인, Developer ID 사용 승인, notary credential profile, 배포 산출물 형식, universal build 필요 여부, 조직 배포 정책, sandbox/ADB 실행 검증을 다룬다.
- 정리: 실제 사용자 환경에서의 앱 조작 확인은 이 Milestone의 기능 Task로 추적하지 않는다. 배포 산출물 사용 중 발견한 문제는 별도 follow-up으로 추가한다.