46장. CI 서명 경계를 분리한다
PR runner는 web/native test와 unsigned build까지만 수행하고 production signing 자산과 store token을 받지 않는다. protected tag와 승인 뒤 ephemeral release runner가 짧은 credential로 keychain/keystore를 열고 signing한다. log masking에 의존하지 않고 command argument·environment dump에 secret을 넣지 않는다.
pipeline은 source/lock test→web build→Capacitor sync diff 검토→native unit/UI→dependency/SBOM→archive/AAB→sign→verify→checksum→TestFlight/internal upload→pilot→승인 순서다. 같은 commit에서 나온 artifact를 승격한다. native project가 sync로 바뀌면 예상 diff와 plugin version을 review한다.
release manifest에는 IPA/AAB checksum, dSYM/mapping, commit, web bundle hash, plugin lock, signing fingerprint, provisioning/profile id, Target API, builder와 승인자를 둔다. 복구 연습은 새 runner에서 자산을 불러와 stage build하고 실제 설치까지 확인한다.