mcpField
M
macos-release

macos-release

github.com/fayazara開発685592 回インストール22 週間前に更新
リポジトリ

macos-release について

macos-releaseは、Mac App Store以外でGitHub ReleasesとSparkleを使ってネイティブmacOSアプリを配布する開発者向けのスキルです。DMG作成、署名、appcast更新、リリース公開を行う対話型Go CLIも含まれます。

主な機能

  1. 01バージョン更新とアーカイブの手順
  2. 02公証とアプリ書き出しの案内
  3. 03DMGの作成と署名
  4. 04Sparkle appcast.xmlの更新
  5. 05appcastのプッシュとGitHub Releaseの作成
  6. 06対話型Go CLIによるリリース自動化

活用シーン

  1. 01Mac App Store以外でのアプリ配布
  2. 02リリース用署名済みDMGの作成
  3. 03Sparkle自動更新情報の公開
  4. 04ターミナルからのリリース実行

インストール

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

$npx skills add https://github.com/fayazara/macos-app-skills --skill macos-release

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

同梱ファイル

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

cli/
main_test.go
main.go
release.example.json

詳細

macOS アプリのリリース

このスキルでは、Sparkle の自動アップデートに対応し、GitHub Releases を通じて Mac App Store 以外でネイティブ macOS アプリを配布するための、リリースパイプライン全体について説明します。

リリースパイプラインの概要

Bump version → Archive → Notarize → Export → Create DMG → Sign DMG → Update appcast.xml → Git push → GitHub Release

前提条件

以下のツールをインストールする必要があります。

ツールインストール方法用途
create-dmgbrew install create-dmgDMG インストーラーを作成します
ghbrew install ghGitHub リリースを作成します
git組み込みappcast の変更をプッシュします
Sparkle sign_updateプロジェクトを Sparkle とともにビルドすると自動的にビルドされますEdDSA で DMG に署名します

sign_update バイナリは、Xcode でプロジェクトをビルドした後、DerivedData にあります。

find ~/Library/Developer/Xcode/DerivedData -name "sign_update" -type f 2>/dev/null | head -1

リリース手順

1. バージョン番号を更新する

Xcode で以下を更新します。

  • MARKETING_VERSION(例:1.2) -- ユーザー向けのバージョン
  • CURRENT_PROJECT_VERSION(例:5) -- ビルド番号(リリースごとに一意である必要があります)

または、コマンドラインから更新します。

# Check current values
grep -E "MARKETING_VERSION|CURRENT_PROJECT_VERSION" YourApp.xcodeproj/project.pbxproj | head -4
2. Xcode でアーカイブする

Product > Archive を選択します。適切な署名 ID を使用してリリースビルドが作成されます。

3. 公証して書き出す

Archives オーガナイザーで、以下の操作を行います。

  1. アーカイブを選択 > Distribute App
  2. 「Direct Distribution」を選択します(または、公証を行う場合は「Developer ID」を選択します)
  3. 公証が完了するまで待ちます
  4. ~/Downloads/YourApp.app に書き出します
4. DMG を作成する
create-dmg \
  --volname "YourApp" \
  --window-pos 200 120 \
  --window-size 660 400 \
  --icon-size 160 \
  --icon "YourApp.app" 180 170 \
  --app-drop-link 480 170 \
  --hide-extension "YourApp.app" \
  ~/Downloads/YourApp.dmg \
  ~/Downloads/YourApp.app
5. Sparkle で DMG に署名する
/path/to/sign_update ~/Downloads/YourApp.dmg

EdDSA 署名とファイルサイズが出力されます。

sparkle:edSignature="BASE64..." length="12345"

appcast 用に、両方の値を保存します。

6. appcast.xml を更新する

appcast.xml の <channel> の先頭に、新しい <item> を追加します。

<item>
  <title>Version 1.2 (Build 5)</title>
  <pubDate>Mon, 26 May 2026 12:00:00 +0000</pubDate>
  <sparkle:version>5</sparkle:version>
  <sparkle:shortVersionString>1.2</sparkle:shortVersionString>
  <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
  <description><![CDATA[<ul><li>Feature one</li><li>Bug fix two</li></ul>]]></description>
  <enclosure url="https://github.com/OWNER/REPO/releases/download/v1.2/YourApp.dmg"
             type="application/octet-stream"
             sparkle:edSignature="THE_SIGNATURE_FROM_STEP_5"
             length="THE_LENGTH_FROM_STEP_5" />
</item>

pubDate は RFC 2822 形式にする必要があります。以下のコマンドで生成できます。

date -R
7. appcast をコミットしてプッシュする
git add appcast.xml
git commit -m "Release v1.2 appcast"
git push origin main
8. GitHub リリースを作成する
gh release create v1.2 \
  ~/Downloads/YourApp.dmg \
  --title "v1.2" \
  --notes "- Feature one
- Bug fix two"

パイプラインの自動化

リリースを頻繁に行う場合は、手順 4~8 を自動化する CLI ツールを作成します。DMG の作成、署名、appcast の更新、GitHub リリースの作成を 1 つのコマンドで行う Go CLI のテンプレートについては、references/release-pipeline.md を参照してください。

CLI では、以下を行う必要があります。

  • DerivedData 内の sign_update を自動的に検索する
  • plutil を使って、書き出したアプリの Info.plist からバージョンとビルド番号を読み取る
  • appcast.xml を解析して更新する(既存のエントリは保持します)
  • リリースノートを対話形式で収集する
  • 概要を表示し、続行する前に確認を求める
  • DMG を添付して GitHub リリースを作成する

リリース CLI ツール

このリポジトリには、手順 4~8(DMG の作成から GitHub リリースまで)を 1 つのコマンドで自動化する Go CLI が含まれています。プロジェクトルートにある release.json ファイルから設定を読み込みます。

セットアップ
  1. プロジェクトルートに release.json を作成します(cli/release.example.json を参照してください)。
{
  "app_name": "MyApp",
  "github_repo": "owner/myapp"
}

必須なのは app_name と github_repo だけです。それ以外の項目には、適切なデフォルト値が設定されています。

フィールドデフォルト説明
bundle_name{app_name}.app.app バンドルのファイル名
dmg_name{app_name}.dmg出力する DMG のファイル名
git_branchmainappcast のプッシュ先ブランチ
min_system_version14.0Sparkle が必要とする最小 macOS バージョン
appcast_fileappcast.xmlリポジトリルートにある appcast ファイル名
derived_data_prefixes["{app_name}-"]sign_update の検索に使用する DerivedData のプレフィックス
  1. プロジェクトディレクトリから CLI を実行します。
go run github.com/fayazara/macos-app-skills/release/cli@latest

または、このリポジトリをクローンしてローカルで実行します。

go run ./release/cli

CLI は対話形式で動作し、リリースノートの入力を求め、続行する前に確認を求めます。ユーザーが操作できるターミナルで実行する必要があります。

CLI の役割
  1. 現在のディレクトリから上位へたどり、release.json を探します
  2. create-dmg、gh、git、および Sparkle の sign_update が利用可能であることを確認します
  3. ~/Downloads/ にエクスポートされたアプリを検証します(Info.plist からバージョン、ビルド、Sparkle キーを読み取ります)
  4. ビルド番号がすでに appcast に存在する場合は警告します
  5. リリースノートを対話形式で収集します(1 行につき箇条書き 1 つ。空行で終了します)
  6. リリースの概要を表示し、確認を求めます
  7. create-dmg で DMG を作成します
  8. Sparkle の sign_update で DMG に署名します(EdDSA)
  9. 新しいリリースエントリーで appcast.xml を更新します
  10. appcast をコミットしてプッシュします
  11. DMG を添付して GitHub リリースを作成します

よくある問題

問題解決策
sign_update が見つからないまず Xcode でプロジェクトをビルドし、DerivedData に Sparkle の成果物が生成されるようにします
gh の認証エラーgh auth login を実行します
appcast に重複したビルド番号があるアーカイブする前に CURRENT_PROJECT_VERSION を増やします
公証に失敗する署名 ID、エンタイトルメント、Hardened Runtime の設定を確認します
DMG のサイズが大きすぎるエクスポートにデバッグシンボルや不要なフレームワークが含まれていないか確認します
アプリがアップデートされないSUFeedURL が GitHub のページ URL ではなく、appcast の raw URL を指していることを確認します

Appcast のホスティング

最も簡単なホスティング方法は、appcast.xml を GitHub リポジトリにコミットし、raw URL を使用することです。

https://raw.githubusercontent.com/OWNER/REPO/main/appcast.xml

これは、アプリの Info.plist にある SUFeedURL と一致している必要があります。

コメント