🚀

Claude Code SkillsでSwift Packageのリリース準備を自動化する

に公開

目次


1. はじめに

こんにちは、個人でiOSアプリ開発をしていて、最近では「読書メモリー」という本の管理アプリをリリースしました。

個人でアプリを開発していると、デザインシステム、APIクライアント、認証処理など、アプリ固有ではない汎用的な機能を実装する機会があります。これらを再利用可能な形で切り出しておけば、次のアプリを作るときにそのまま使えます。

Swiftで再利用可能なコードを共有する標準的な方法は、Swift Package Manager(SPM)です。せっかくパッケージとして整備するなら、OSSとして公開することで、自分以外の開発者にも使ってもらえる可能性が生まれます。

こうした考えから、以下のパッケージを公開しています。

本記事では、これらのパッケージのリリース管理を整備し、その運用を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のマージがリリースのトリガーになるため、リリースタイミングが明確になります。

フローの全体像

  1. リリースブランチ(release/v1.2.0)で開発
  2. 変更のたびに[未リリース]セクションに追記
  3. リリース準備で[未リリース]を[1.2.0] - 2025-01-20に変換
  4. PRをmainにマージ
  5. 自動でタグ作成、GitHub Release作成、次のリリースブランチ作成

次のセクションでは、このフローの実装に関する説明をしていきます。


5. 実装

5.1 GitHub Actions

リリースブランチがmainにマージされると、以下が自動実行されます。

  1. ブランチ名からバージョンを抽出(release/v1.2.0 → v1.2.0)
  2. CHANGELOGにそのバージョンのセクションが存在するか検証
  3. タグを作成してプッシュ
  4. CHANGELOGからリリースノートを生成
  5. GitHub Releaseを作成
  6. 次のパッチバージョンのブランチとドラフト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. [未リリース]を[1.2.0] - 2025-01-20に変換
  2. 新しい[未リリース]セクションを追加
  3. 比較リンクを更新
  4. 変更をコミット

これで、コードを書いてCHANGELOGを更新し、リリース準備してプッシュ、PRをマージするだけでリリースが完了します。


6. まとめ

一人でOSSを開発していると、リリース管理は「やるべきだがコストが見合わない」作業になりがちです。

本記事では、Claude Code SkillsでCHANGELOG更新やコミット作成をAIに任せ、GitHub Actionsでタグ作成やGitHub Releaseを自動化することで、この悩みに対処しました。

手動で行うのはコードを書くことと、PRをマージすることだけです。CHANGELOGに全変更が記録され、すべてのパッケージで同じフローを維持できます。

「やるべきだが面倒」と感じている定型作業があれば、Claude Code Skillsで自動化してみるのがいいかもしれません。


参考リンク

本記事で紹介したプラグイン

関連記事

著者が開発したアプリ

著者

Discussion