Swift Package Manager を GitHub Actions でキャッシュさせる方法

1 min read

背景

SPMを使っているiOSのプロジェクトで、xcodebuild をGitHub Actions上で使用したいとき、自動でFetchされたライブラリのソースコードはキャッシュされず、毎回、Fetchしてくるため非常に遅くなってしまいます。
そこで、自動でFetchしたソースコードを作業ディレクトリ配下に置いてキャッシュさせることでCIにかかる時間を短縮させます。

方法

Xcodebuild

xcodebuildで自動でFetchされるソースコードのディレクトリは、 clonedSourcePackagesDirPath オプションで指定することができます。

xcodebuild build \
     -scheme XXX \
     -sdk iphonesimulator
     -configuration Release
     -clonedSourcePackagesDirPath SourcePackages

また、 Podfile.lockCartfile.resolved と同様にSPMにも、バージョンをロックするためのPackage.resolvedが存在します。
Package.resolvedは、 *.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/ 配下に置かれています。

GitHub Actions

GitHub Actions の設定ファイルは、以下のように記述します。
Package.resolved のハッシュ値を actions/cache のキーに設定し、 SourcePackages ディレクトリをキャッシュさせます。

- name: Cache Swift Packages
  uses: actions/cache@v1
  with:
    path: SourcePackages
    key: ${{ runner.os }}-spm-${{ hashFiles('*.xcodeproj/project.xcworkspace/ xcshareddata/swiftpm/Package.resolved') }}
    restore-keys: ${{ runner.os }}-spm-
    
- name: Build
  run: xcodebuild build
      -scheme XXX
      -sdk iphonesimulator
      -configuration Release
      -clonedSourcePackagesDirPath SourcePackages

参考