2026 リリース工学codesign公証SFTPリモートMac

2026 リモートMacでiOS/macOS署名と公証:SFTP/rsync転送後にcodesignが壊れるtar判断と検証

リモートMacではcodesignnotarytoolも通るのに、SFTP/rsync/CIアーティファクトのあとでテスター環境では検証失敗——原因の多くはビット劣化ではなくバンドル意味論です。本文は判断表とコマンド骨格を示し、整合性ゲート原子的リリースWANスループットへ接続します。Linux runnerを挟むならMac側で先にtar.gzへまとめるのが既定です。

codesignnotarizationSFTPrsynctarリモートMac
署名済みmacOSアプリ成果物をリモートMacから暗号転送で配布する流れのイメージ

要約:署名は通るのに壊れる五経路

Appleのパイプラインは.appを単なるファイル集合ではなく、ネストされたコードとメタデータのグラフとして扱います。バイト列は揃っていても、ツールがディレクトリ意味を壊せばcodesign --verify --deep --strictは失敗します。症状はGatekeeperの文言が強く出がちで、パッケージングの衛生問題がマルウェア疑いに見えることがあります。

SHA256は同一性、codesignは署名グラフ——両方が昇格ゲートに必要です。整合性記事のマニフェストと、各ホップのverifyをセットにしてください。帯域とタイムアウトが先に詰まる場合はWAN記事で並列とTCPを整えてから戻るとよいです。

macOS同士の低遅延なら明示フラグ付きrsyncが現実的です。Linuxが中継ならディレクトリを直接置かず、Macでtar.gzに閉じ込めます。upload-artifactのsymlink挙動はメジャーで変わるので固定し、取得後は必ずMacで再検証とRunbookに書きます。

リリースはreleases/<build_id>/へ書き、マニフェスト合格後にポインタを原子的に差し替えます(原子的リリース)。公開ツリーへの--inplaceは部分ツリーを晒します。notarytoolのsubmission idとgit sha、Xcodeビルド番号を同じチケットに残し、監査で読み返せるようにします。

痛み分け:flatten、Linux中継、inplace、stapleずれ、検証の穴

flatten:ZIPやクラウド同期がメタデータを戻さず、見た目は揃っても深い検証で落ちる。

Linux中継:symlinkが実体化したり実行ビットが表現できない。tarは明示しない限り早めに解引用しない。

inplace:ライブツリーへ直接同期すると途中状態を配布する。ステージングとポインタ交代が必要。

stapleずれ:公証後に再圧縮するとチケットとバイトが不一致。immutable扱いにする。

検証の穴:ビルド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化し、夜間betaを壊さないようスクショ付きで固定します。

チケット項目、公証待ち、ディスク余白

git sha、XcodeとmacOSパッチ、署名ID要約、submission id、stapler状態、ソースと着岸のverify終了コード、転送ツール版、SHA256マニフェストIDを最低限そろえる。公証キューはイベント時に30分超も珍しくない。空き容量が長期120GB未満だとアーカイブや展開で不安定になりやすい。署名ツリーとクリエイティブ資産はアカウント分離を推奨。PR用ワークフローと本番署名ホストを混在させない。

用語、FAQ、ホスト型リモートMac

バンドルは実行ファイルとリソースのディレクトリ規約。Developer IDはストア外配布向け。チケットは公証記録、staplingはオフライン検証向け埋め込み。xattrは非Mac FSで落ちやすい。atomic pointerは検証後にだけ差すシンボリックリンク。

SHA256が一致すれば署名もOK?

いいえ。ハッシュはバイト一致のみ。verifyが通らないなら、記録したバイト自体が壊れたグラフを含んでいる可能性がある。

Linuxで最終判定してよい?

権威にすべきではない。tarの運搬は可、厳密検証はmacOSで。

SFTPはrsyncより悪い?

常にではない。無人運用ではどちらも手順と検証の明文化が鍵。

まとめ:バンドル意味を保ち、Linux前にtar、各ホップverify、マニフェストと原子的昇格をセットで。

限界:多入口自運用はRunbook負荷が重い。SFTPMACのホスト型リモートMacは安定ホストと暗号入口を束ね、symlink破壊の再発見に時間を奪われにくくします。

プランとリージョンを確認し、署名ホストと配布Ingressを揃えましょう。