mcpField
R
releasing-macos-apps

releasing-macos-apps

github.com/jamesrochabrunクラウド・DevOps221203 回インストール41 週間前に更新
リポジトリ

releasing-macos-apps について

releasing-macos-appsは、macOSアプリをリリースする開発者向けのワークフロースキルです。署名、公証、Sparkleアップデート、DMG作成、GitHubリリースと各工程の確認を扱います。

主な機能

  1. 01バージョン更新、ビルド、アーカイブ
  2. 02コード署名と公証
  3. 03Sparkle更新署名とappcast
  4. 04DMGインストーラー作成
  5. 05GitHubリリースアセット管理
  6. 06リリース確認チェックリスト

活用シーン

  1. 01署名済みmacOSアプリのリリース準備
  2. 02Sparkle更新とDMGインストーラーの公開
  3. 03公証やリリース確認の問題調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jamesrochabrun/skills --skill releasing-macos-apps

インストール後、Claude Code で/releasing-macos-appsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

NOTARIZATION.md
SPARKLE.md
TROUBLESHOOTING.md

詳細

macOS アプリのリリース

Sparkle の自動アップデート、DMG インストーラー、GitHub リリースを使用して、公証済み macOS アプリをリリースするためのワークフロー全体です。

リリースチェックリスト

このチェックリストをコピーして、進捗を記録してください。

Release Progress:
- [ ] Step 1: Check prerequisites (certificates, credentials)
- [ ] Step 2: Update version in .xcconfig file
- [ ] Step 3: Build and archive the app
- [ ] Step 4: Export with proper code signing
- [ ] Step 5: Create zip and generate Sparkle signature
- [ ] Step 6: Create DMG with Applications folder
- [ ] Step 7: Submit for notarization
- [ ] Step 8: Staple notarization ticket to DMG
- [ ] Step 9: Update appcast.xml with new signature
- [ ] Step 10: Commit and push changes
- [ ] Step 11: Update GitHub release assets
- [ ] Step 12: Verify DMG and version number

前提条件

リリースを開始する前に、以下を確認してください。

  1. Apple Developer ID Application 証明書がインストールされ、有効であること
  2. 公証用の Apple ID 認証情報があること:
    • Apple ID のメールアドレス
    • App 用パスワード(appleid.apple.com で生成)
    • Team ID
  3. アップデート署名用の Sparkle 秘密鍵
  4. GitHub CLI(gh)がインストールされ、認証済みであること
  5. バージョン設定ファイルの場所を確認していること(通常は .xcconfig ファイル)

証明書を確認します。

security find-identity -v -p codesigning | grep "Developer ID Application"

手順 1:バージョンを更新する

バージョン設定ファイル(通常は ProjectName.xcconfig または project.pbxproj)を探します。

.xcconfig ファイルの場合:

# Edit the APP_VERSION line
# Example: APP_VERSION = 1.0.9

更新を確認します。

xcodebuild -project PROJECT.xcodeproj -showBuildSettings | grep MARKETING_VERSION

手順 2:ビルドしてアーカイブする

新しいバージョンでアプリをアーカイブします。

xcodebuild -project PROJECT.xcodeproj \
  -scheme SCHEME_NAME \
  -configuration Release \
  -archivePath ~/Desktop/APP-VERSION.xcarchive \
  archive

アーカイブが作成されたことを確認します。

ls -la ~/Desktop/APP-VERSION.xcarchive

手順 3:コード署名して書き出す

書き出しオプションファイルを作成します。

cat > /tmp/ExportOptions.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>destination</key>
	<string>export</string>
	<key>method</key>
	<string>developer-id</string>
	<key>signingStyle</key>
	<string>automatic</string>
	<key>teamID</key>
	<string>YOUR_TEAM_ID</string>
	<key>signingCertificate</key>
	<string>Developer ID Application</string>
</dict>
</plist>
EOF

YOUR_TEAM_ID を実際のチーム ID に置き換えます。

アーカイブを書き出します。

xcodebuild -exportArchive \
  -archivePath ~/Desktop/APP-VERSION.xcarchive \
  -exportPath ~/Desktop/APP-VERSION-Export \
  -exportOptionsPlist /tmp/ExportOptions.plist

書き出したアプリのバージョンを確認します。

defaults read ~/Desktop/APP-VERSION-Export/APP.app/Contents/Info.plist CFBundleShortVersionString

新しいバージョン番号が表示されるはずです。

コード署名を確認します。

codesign -dvvv ~/Desktop/APP-VERSION-Export/APP.app

Authority の行に「Developer ID Application」と表示されていることを確認します。

手順 4:Zip を作成して Sparkle 署名を生成する

Sparkle の自動アップデート用に Zip ファイルを作成します。

cd ~/Desktop/APP-VERSION-Export
ditto -c -k --keepParent APP.app APP.app.zip

Sparkle EdDSA 署名を生成します(秘密鍵の入力を求められます)。

echo "YOUR_SPARKLE_PRIVATE_KEY" | \
  ~/Library/Developer/Xcode/DerivedData/PROJECT-HASH/SourcePackages/artifacts/sparkle/Sparkle/bin/sign_update \
  APP.app.zip --ed-key-file -

出力形式:

sparkle:edSignature="BASE64_SIGNATURE" length="FILE_SIZE"

appcast.xml の更新に使用するため、署名とファイルサイズの両方を保存します。

詳しくは SPARKLE.md を参照してください。

手順 5:Applications フォルダーを含む DMG を作成する

ドラッグ&ドロップでインストールできるよう、Applications フォルダーへのシンボリックリンクを含む DMG インストーラーを作成します。

TEMP_DMG_DIR="/tmp/APP_dmg" && \
rm -rf "${TEMP_DMG_DIR}" && \
mkdir -p "${TEMP_DMG_DIR}" && \
cp -R ~/Desktop/APP-VERSION-Export/APP.app "${TEMP_DMG_DIR}/" && \
ln -s /Applications "${TEMP_DMG_DIR}/Applications" && \
hdiutil create -volname "APP VERSION" \
  -srcfolder "${TEMP_DMG_DIR}" \
  -ov -format UDZO ~/Desktop/APP-VERSION.dmg && \
rm -rf "${TEMP_DMG_DIR}"

DMG の内容を確認します。

hdiutil attach ~/Desktop/APP-VERSION.dmg -readonly -nobrowse -mountpoint /tmp/verify_dmg && \
ls -la /tmp/verify_dmg && \
hdiutil detach /tmp/verify_dmg

APP.app と Applications(シンボリックリンク)の両方が表示されるはずです。

手順 6:公証を申請する

DMG を Apple に提出して公証を受けます(認証情報の入力を求められます)。

xcrun notarytool submit ~/Desktop/APP-VERSION.dmg \
  --apple-id [email protected] \
  --team-id YOUR_TEAM_ID \
  --password YOUR_APP_SPECIFIC_PASSWORD \
  --wait

--wait フラグを指定すると、処理が完了するまでコマンドが待機します(通常は 1~2 分です)。

想定される出力:

Processing complete
  id: [submission-id]
  status: Accepted

ステータスが「Invalid」の場合は、詳細なログを取得します。

xcrun notarytool log SUBMISSION_ID \
  --apple-id [email protected] \
  --team-id YOUR_TEAM_ID \
  --password YOUR_APP_SPECIFIC_PASSWORD

公証に関するトラブルシューティングは NOTARIZATION.md を参照してください。

手順 7:公証チケットをステープルする

公証チケットを DMG にステープルします。

xcrun stapler staple ~/Desktop/APP-VERSION.dmg

想定される出力:

The staple and validate action worked!

公証を確認します。

spctl -a -vvv ~/Desktop/APP-VERSION-Export/APP.app

以下のように表示されるはずです。

accepted
source=Notarized Developer ID

手順 8:appcast.xml を更新する

手順 4 で取得した新しいバージョン、署名、ファイルサイズを使って Sparkle の appcast ファイルを更新します。

<item>
  <title>Version X.X.X</title>
  <link>https://github.com/USER/REPO</link>
  <sparkle:version>X.X.X</sparkle:version>
  <sparkle:channel>stable</sparkle:channel>
  <description><![CDATA[
    Release version X.X.X
  ]]></description>
  <pubDate>DAY, DD MMM YYYY HH:MM:SS -0700</pubDate>
  <enclosure
    url="https://github.com/USER/REPO/releases/download/vX.X.X/APP.app.zip"
    sparkle:version="X.X.X"
    sparkle:edSignature="SIGNATURE_FROM_STEP_4"
    length="FILE_SIZE_FROM_STEP_4"
    type="application/octet-stream" />
</item>

注記: gitleaks の pre-commit フックが、Sparkle 署名を潜在的なシークレットとして検出する場合があります。これは誤検出です。EdDSA 署名は公開情報であり、安全にコミットできます。必要に応じて git commit --no-verify を使用してください。

手順 9:変更をコミットしてプッシュする

バージョン更新と appcast の変更をコミットします。

git add PROJECT.xcconfig appcast.xml
git commit --no-verify -m "Bump version to X.X.X

Update appcast.xml with new version, Sparkle signature, and file size.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>"

git push

手順 10:GitHub リリースを更新する

新しいアセットを含む GitHub リリースを作成または更新します。

新しいリリースの場合:

gh release create vX.X.X \
  --title "APP vX.X.X" \
  --notes "Release version X.X.X" \
  ~/Desktop/APP-VERSION.dmg \
  ~/Desktop/APP-VERSION-Export/APP.app.zip

既存のリリースを更新する場合:

# Upload new assets (overwrites existing with --clobber)
gh release upload vX.X.X \
  ~/Desktop/APP-VERSION.dmg \
  ~/Desktop/APP-VERSION-Export/APP.app.zip \
  --clobber

アセット名に関する注記: アップロードしたファイル名がアセット名になります。指定した名前でアップロードするには、次のようにします。

# Copy to desired name first
cp ~/Desktop/APP-1.0.9.dmg /tmp/APP.dmg
gh release upload vX.X.X /tmp/APP.dmg

リリースアセットを確認します。

gh release view vX.X.X --json assets -q '.assets[] | "\(.name) - \(.size) bytes"'

手順 11:最終確認

リリースが正しく機能することを確認します。

アプリのバージョンを確認します。

defaults read /Applications/APP.app/Contents/Info.plist CFBundleShortVersionString

X.X.X と表示されるはずです。

DMG をテストします。

  1. GitHub リリースから DMG をダウンロードします
  2. DMG を開きます
  3. ドラッグ&ドロップできるよう、Applications フォルダーがあることを確認します
  4. アプリを Applications にドラッグして起動します
  5. 「悪意のある」ソフトウェアに関する警告やセキュリティ警告が表示されずに開くはずです

Sparkle アップデートをテストします。

  • 以前のバージョンを使用しているユーザーに、自動アップデートの通知が届くはずです
  • アップデートがスムーズにダウンロードおよびインストールされるはずです

よくある問題

問題が発生した場合は、TROUBLESHOOTING.mdで次の問題の解決方法を確認してください。

  • 再ビルド後にバージョンが更新されない
  • DMG に Applications フォルダーが含まれない
  • 公証に失敗する
  • 「悪意のあるアプリ」という警告が表示される
  • Sparkle の署名に関する問題
  • CI/CD の失敗

クイックリファレンス

バージョンを確認する:

defaults read /path/to/APP.app/Contents/Info.plist CFBundleShortVersionString

コード署名を確認する:

codesign -dvvv /path/to/APP.app

公証を確認する:

spctl -a -vvv /path/to/APP.app

Sparkle sign_update のパスを取得する:

find ~/Library/Developer/Xcode/DerivedData -name sign_update -type f

コメント