macos-release について
macos-releaseは、Mac App Store以外でGitHub ReleasesとSparkleを使ってネイティブmacOSアプリを配布する開発者向けのスキルです。DMG作成、署名、appcast更新、リリース公開を行う対話型Go CLIも含まれます。
主な機能
- 01バージョン更新とアーカイブの手順
- 02公証とアプリ書き出しの案内
- 03DMGの作成と署名
- 04Sparkle appcast.xmlの更新
- 05appcastのプッシュとGitHub Releaseの作成
- 06対話型Go CLIによるリリース自動化
活用シーン
- 01Mac App Store以外でのアプリ配布
- 02リリース用署名済みDMGの作成
- 03Sparkle自動更新情報の公開
- 04ターミナルからのリリース実行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ fayazara/ macos-app-skills --skill macos-releaseインストール後、Claude Code で/macos-releaseを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
cli/main_test.gomain.gorelease.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-dmg | brew install create-dmg | DMG インストーラーを作成します |
gh | brew install gh | GitHub リリースを作成します |
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 オーガナイザーで、以下の操作を行います。
- アーカイブを選択 > Distribute App
- 「Direct Distribution」を選択します(または、公証を行う場合は「Developer ID」を選択します)
- 公証が完了するまで待ちます
~/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 ファイルから設定を読み込みます。
セットアップ
- プロジェクトルートに
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_branch | main | appcast のプッシュ先ブランチ |
min_system_version | 14.0 | Sparkle が必要とする最小 macOS バージョン |
appcast_file | appcast.xml | リポジトリルートにある appcast ファイル名 |
derived_data_prefixes | ["{app_name}-"] | sign_update の検索に使用する DerivedData のプレフィックス |
- プロジェクトディレクトリから CLI を実行します。
go run github.com/fayazara/macos-app-skills/release/cli@latest
または、このリポジトリをクローンしてローカルで実行します。
go run ./release/cli
CLI は対話形式で動作し、リリースノートの入力を求め、続行する前に確認を求めます。ユーザーが操作できるターミナルで実行する必要があります。
CLI の役割
- 現在のディレクトリから上位へたどり、
release.jsonを探します create-dmg、gh、git、および Sparkle のsign_updateが利用可能であることを確認します~/Downloads/にエクスポートされたアプリを検証します(Info.plist からバージョン、ビルド、Sparkle キーを読み取ります)- ビルド番号がすでに appcast に存在する場合は警告します
- リリースノートを対話形式で収集します(1 行につき箇条書き 1 つ。空行で終了します)
- リリースの概要を表示し、確認を求めます
create-dmgで DMG を作成します- Sparkle の
sign_updateで DMG に署名します(EdDSA) - 新しいリリースエントリーで
appcast.xmlを更新します - appcast をコミットしてプッシュします
- 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 と一致している必要があります。