Claude Code SkillsでSwift Packageのリリース準備を自動化する
目次
- 目次
- 1. はじめに
- 2. 一人で開発するOSSのリリース管理
- 3. Claude Code SkillsとGitHub Actionsで楽にする
- 4. リリースフローの設計
- 5. 実装
- 6. まとめ
- 参考リンク
1. はじめに
こんにちは、個人でiOSアプリ開発をしていて、最近では「読書メモリー」という本の管理アプリをリリースしました。
個人でアプリを開発していると、デザインシステム、APIクライアント、認証処理など、アプリ固有ではない汎用的な機能を実装する機会があります。これらを再利用可能な形で切り出しておけば、次のアプリを作るときにそのまま使えます。
Swiftで再利用可能なコードを共有する標準的な方法は、Swift Package Manager(SPM)です。せっかくパッケージとして整備するなら、OSSとして公開することで、自分以外の開発者にも使ってもらえる可能性が生まれます。
こうした考えから、以下のパッケージを公開しています。
- swift-ui-routing - SwiftUIの画面遷移をプログラマティックに管理
- swift-design-system - 拡張可能なデザインシステム
- swift-api-client - async/await対応HTTPクライアント
- swift-cached-remote-image - メモリとディスクにキャッシュするリモート画像ローダー
- swift-authentication - Firebaseを用いたApple/Google認証
- swift-subscription - RevenueCatサブスクリプション管理のラッパー
本記事では、これらのパッケージのリリース管理を整備し、その運用をClaude Codeに任せるに至った経緯と実装を紹介します。
2. 一人で開発するOSSのリリース管理
SPMはGitタグをバージョンとして認識します。
.package(url: "https://github.com/example/my-package", from: "1.0.0")
タグを打てば、利用者はすぐに新バージョンを使えます。タグを打つだけなら難しくありません。しかし、OSSとして公開する以上、以下のような管理が望ましいとされています。
- CHANGELOG: 各バージョンで何が変わったのかを記録する
- リリースブランチ: いつ、何をリリースしたのかを明確にする
- GitHub Release: 利用者がリリース内容を確認できるようにする
組織で開発している場合、これらはチームのプロセスの中で自然と運用されます。しかし、一人で開発している場合、話は違います。
CHANGELOGを書く、リリースブランチを作る、GitHub Releaseを作成する。これらは機能を実装する本質的な作業ではありません。とはいえ、管理をサボると後で困ります。
- 過去の変更を追えなくなる
- 利用者がアップデートの影響を判断できない
- 再利用可能なパッケージとして公開する意味が薄れる
適切に管理したいが、コストが見合わない。 一人で開発しているとこの悩みにぶつかります。
3. Claude Code SkillsとGitHub Actionsで楽にする
この悩みに対して、2つのアプローチを組み合わせました。
Claude Codeによるリリース準備の自動化
Claude Codeには、Skillsという拡張機能があります。Skillsはマークダウンファイルで手順やルールを定義し、AIに特定のワークフローを教える仕組みです。
Skillsは、Slash CommandsやHooksと合わせてPluginとしてまとめられます。Pluginを集めたものはMarketplaceとして公開でき、GitHubリポジトリをMarketplaceとして登録できます。
- CHANGELOGの更新(
[未リリース]セクションへのエントリ追加) - リリース準備(
[未リリース]をバージョン番号に変換、コミット作成)
これらは手順が決まっており、判断が少なく、繰り返し発生する作業です。ルールをSkillsとして定義すれば、AIが一貫したフォーマットで実行してくれます。
GitHub Actionsによるリリース作業のワークフロー化
マージ後の処理はGitHub Actionsで自動化します。
- タグの作成・プッシュ
- GitHub Releaseの作成
- 次のリリースブランチとドラフトPRの作成
これらはルールベースで実行できるため、ワークフローとして定義します。
実現するワークフロー
この2つを組み合わせることで、以下のワークフローが実現します。
手動で行うのは、コードを書くことと、PRをマージすることだけです。
4. リリースフローの設計
Claude Codeに任せるには、まずリリースフローを明確に定義する必要があります。
CHANGELOG
CHANGELOGはKeep a Changelog形式で管理します。Semantic Versioningと組み合わせて使う形式で、[未リリース]セクションを持つことが特徴です。
# Changelog
## [未リリース]
### 追加
- **Button**: アウトラインスタイルを追加
### 修正
- **Card**: 角丸が適用されない問題を修正
## [1.0.0] - 2025-01-15
### 追加
- 初期リリース
変更のたびに[未リリース]に追記し、リリース時にバージョン番号に変換します。
| カテゴリ | 説明 |
|---|---|
| 追加 | 新機能 |
| 変更 | 既存機能の変更 |
| 非推奨 | 将来削除予定の機能 |
| 削除 | 削除された機能 |
| 修正 | バグ修正 |
| セキュリティ | セキュリティ関連の修正 |
リリースブランチ
release/vX.Y.Z形式のブランチを使います。PRのマージがリリースのトリガーになるため、リリースタイミングが明確になります。
フローの全体像
- リリースブランチ(
release/v1.2.0)で開発 - 変更のたびに
[未リリース]セクションに追記 - リリース準備で
[未リリース]を[1.2.0] - 2025-01-20に変換 - PRをmainにマージ
- 自動でタグ作成、GitHub Release作成、次のリリースブランチ作成
次のセクションでは、このフローの実装に関する説明をしていきます。
5. 実装
5.1 GitHub Actions
リリースブランチがmainにマージされると、以下が自動実行されます。
- ブランチ名からバージョンを抽出(
release/v1.2.0→v1.2.0) - CHANGELOGにそのバージョンのセクションが存在するか検証
- タグを作成してプッシュ
- CHANGELOGからリリースノートを生成
- GitHub Releaseを作成
- 次のパッチバージョンのブランチとドラフトPRを作成
主要な部分を示します。完全版はauto-release-on-merge.ymlを参照してください。
name: Auto Release on Merge
on:
pull_request:
types: [closed]
branches: [main]
jobs:
auto-release:
if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/v')
runs-on: ubuntu-latest
steps:
- name: Extract version from branch name
id: version
run: |
BRANCH_NAME="${{ github.event.pull_request.head.ref }}"
VERSION_TAG="${BRANCH_NAME#release/}"
echo "version_tag=$VERSION_TAG" >> $GITHUB_OUTPUT
- name: Create and push tag
run: |
git tag "${{ steps.version.outputs.version_tag }}"
git push origin "${{ steps.version.outputs.version_tag }}"
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.version.outputs.version_tag }}
GitHub Releaseの作成にはsoftprops/action-gh-releaseを使用しています。
次のリリースブランチとドラフトPRの自動作成は以下のように実装しています。
- name: Calculate next version
run: |
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
NEXT_PATCH=$((PATCH + 1))
NEXT_VERSION="$MAJOR.$MINOR.$NEXT_PATCH"
- name: Create next release branch
run: |
git checkout -b "release/v$NEXT_VERSION"
git push origin "release/v$NEXT_VERSION"
- name: Create draft PR
run: |
gh pr create --draft --title "Release v$NEXT_VERSION" --base main
5.2 Claude Code Skills
リリースフローをSkillsとして定義し、release-flowというPluginとして公開しています。このPluginは、GitHubリポジトリをMarketplaceとして登録することで利用できます。
/plugin marketplace add no-problem-dev/claude-code-plugins
Skillsは必要なときに自動で参照される仕組みです。スラッシュコマンドで明示的に呼び出すこともできますが、自然言語で指示するだけで動作します。
CHANGELOGへのエントリ追加
Buttonにアウトラインスタイルを追加したのでCHANGELOGに記録して
Claude CodeがSkillsを参照し、CHANGELOG.mdの[未リリース]セクションにエントリを追加します。
リリース準備
リリース準備して
Claude Codeがリリースブランチからバージョン番号を取得し、以下を実行します。
-
[未リリース]を[1.2.0] - 2025-01-20に変換 - 新しい
[未リリース]セクションを追加 - 比較リンクを更新
- 変更をコミット
これで、コードを書いてCHANGELOGを更新し、リリース準備してプッシュ、PRをマージするだけでリリースが完了します。
6. まとめ
一人でOSSを開発していると、リリース管理は「やるべきだがコストが見合わない」作業になりがちです。
本記事では、Claude Code SkillsでCHANGELOG更新やコミット作成をAIに任せ、GitHub Actionsでタグ作成やGitHub Releaseを自動化することで、この悩みに対処しました。
手動で行うのはコードを書くことと、PRをマージすることだけです。CHANGELOGに全変更が記録され、すべてのパッケージで同じフローを維持できます。
「やるべきだが面倒」と感じている定型作業があれば、Claude Code Skillsで自動化してみるのがいいかもしれません。
参考リンク
本記事で紹介したプラグイン
- release-flow Claude Codeプラグイン - リリースワークフロー自動化
関連記事
- ViewModelを使わない、SwiftUIらしいiOSアーキテクチャ - Claude Code Skillsを活用したiOS開発
著者が開発したアプリ
- 読書メモリー - 本の管理アプリ
Discussion