2026 릴리스codesign공증SFTP원격 Mac

2026 원격 Mac iOS·macOS 서명·공증 산출물: SFTP·rsync 이후 codesign 깨짐과 tar 결정표

원격 Mac에서 codesign·notarytool·stapler는 통과했는데 SFTP·rsync·CI 아티팩트 뒤 테스트기에서 깨진다면, 대부분 비트 로트가 아니라 번들 의미론 문제다. 결정표와 명령 뼈대를 제시하고 무결성 게이트, 원자 릴리스, WAN 처리량과 연결한다. Linux 러너가 끼면 Mac에서 먼저 tar.gz로 묶는 것을 기본값으로 삼는다.

codesignnotarizationSFTPrsynctar원격 Mac
서명된 macOS 앱 산출물을 원격 Mac에서 암호화 전송으로 배포하는 흐름

요약: 서명은 살아 있는데 깨지는 경로

최신 Apple 파이프라인은 .app을 단순 파일 묶음이 아니라 중첩 코드·리소스·메타데이터의 그래프로 본다. 바이트가 그대로여도 symlink가 풀리거나 실행 비트가 사라지면 codesign --verify --deep --strict는 실패한다. 사용자에게는 Gatekeeper 문구가 강하게 보여 패키징 문제가 악성 의심으로 보이기도 한다.

SHA256은 동일성, codesign은 서명 그래프다. 둘 다 승격 시점에 필요하다. 무결성 글의 매니페스트와 홉마다 verify를 짝지으라. 대역폭·타임아웃이 먼저면 WAN 글에서 병렬과 TCP를 맞춘 뒤 돌아온다.

macOS 간 저지연이면 플래그가 분명한 rsync가 실용적이다. Linux가 중간이면 디렉터리를 직접 얹지 말고 Mac에서 tar.gz로 닫는다. upload-artifact의 symlink 처리는 메이저마다 달라질 수 있어 고정하고, 내려받은 뒤 Mac에서 재검증을 런북에 적는다.

릴리스는 releases/<build_id>/에만 쓰고 매니페스트가 통과한 뒤 포인터를 원자적으로 바꾼다(원자 릴리스). 공개 트리에 --inplace로 쓰면 부분 번들이 노출된다. notarytool submission id, git sha, Xcode 빌드 번호를 같은 티켓에 남겨 감사 때 읽히게 한다.

통증 분해: flatten, Linux, inplace, staple 드리프트, 검증 구멍

flatten: ZIP·동기화가 메타데이터를 복원하지 않아 겉보기는 정상이나 깊은 검증에서 실패.

Linux 중간 저장: symlink 실체화·권한 상실. tar는 요청하지 않는 한 조기 디레퍼런스를 피한다.

inplace: 라이브 트리에 직접 동기화하면 전송 중 상태가 배포된다. 스테이징과 포인터 교체가 필요.

staple 드리프트: 공증 뒤 재압축하면 티켓과 바이트가 어긋난다. 검증된 산출물은 불변으로 취급.

검증 구멍: 빌드 Mac에서만 verify하지 말고 배포하는 Mac에서도 반복한다.

결정표: 패키징을 먼저 고르고 나서 대역폭을 튜닝

빌드 ID, 서명 ID, submission id, 패키징 도구, 전송 도구, 홉별 종료 코드를 한 티켓에 모은다.

토폴로지리스크권장 이동관련 글
Mac→Mac 저지연플래그에 따라 낮음메타데이터 유지 rsync동시 SFTP, 원자 릴리스
Mac→Linux→Mac높음빌드당 단일 tar.gz무결성
공개 dmgstaple 후 중간staple 후 파일명 고정원자 릴리스
내부 캐시통제됨미서명 중간 허용, 승격 시 전체 서명 재실행CI 자격 증명
대용량 WAN타임아웃먼저 tar 후 병렬 조정WAN 글

서명은 macOS 파일 의미에 의존한다. 크로스 플랫폼에서는 의미를 보존하는 아카이브를 선택한다.

How-to: 스테이징 스켈레톤

호스트·비밀은 교체. CI 자격 증명 매트릭스에 맞춘다.

# 빌드 Mac: Linux 홉 전 아카이브
COPYFILE_DISABLE=1 tar -czvf MyApp_build.tar.gz MyApp.app
codesign --verify --deep --strict --verbose=2 MyApp.app
rsync -av MyApp_build.tar.gz ci@remote-mac:uploads/staging/build-9001/
# 원격 Mac: 풀고 도착 verify
ssh ci@remote-mac 'cd uploads/staging/build-9001 && tar -xzvf MyApp_build.tar.gz'
ssh ci@remote-mac 'codesign --verify --deep --strict uploads/staging/build-9001/MyApp.app'
# 매니페스트 통과 후에만 승격(원자 릴리스 글 참고)

대화형 SFTP는 권한·재귀 옵션을 SOP로 고정해 야간 베타를 망치지 않는다.

티켓 필드, 공증 대기, 디스크 여유

git sha, Xcode·macOS 패치, 서명 ID 요약, submission id, 대외 파일명, staple 상태, 출발·도착 verify 코드, 전송 도구 버전, SHA256 매니페스트 ID를 최소한 갖춘다. 공증 대기열은 이벤트 때 30분을 넘기기도 한다. 여유 공간이 오래 120GB 아래면 아카이브·해제가 불안정해지기 쉽다. 서명 트리와 크리에이티브 자산은 계정을 나누고, PR 워크플로와 프로덕션 서명 호스트를 섞지 않는다.

용어, FAQ, 호스팅 원격 Mac

번들은 실행 파일·프레임워크·리소스 디렉터리 규약이다. Developer ID는 스토어 외 배포. 티켓은 공증 기록, stapling은 오프라인 검증용 삽입. xattr는 비 macOS FS에서 자주 사라진다. atomic pointer는 검증 후에만 바꾸는 symlink다.

SHA256이 맞으면 서명도 맞나?

아니다. 해시는 바이트 일치만 말한다. verify 실패면 기록된 바이트 자체가 깨진 그래프를 포함했을 수 있다.

Linux에서 최종 판단해도 되나?

권위로 삼지 말라. tarball 운반은 가능, 엄밀 검증은 macOS에서.

SFTP가 rsync보다 항상 나쁜가?

항상은 아니다. 무인 환경에서는 절차와 검증 문서화가 더 중요하다.

정리: 번들 의미를 지키고, Linux 앞에 tar, 홉마다 verify, 매니페스트와 원자 승격을 묶는다.

한계: 다중 입구 자체 운영은 런북 부담이 크다. SFTPMAC 호스팅 원격 Mac은 안정 빌드 호스트와 암호화 입구를 묶어 symlink 붕괴 재발견 시간을 줄인다.

요금제와 리전을 확인해 서명 호스트와 배포 Ingress를 정렬하세요.