はじめに
このガイドでは、Apple コード署名証明書とプロビジョニングプロファイルを GitHub Actions ランナーにインストールする継続的インテグレーション (CI) ワークフローにステップを追加する方法を説明しています。 これにより、Xcode アプリケーションに署名して、Apple App Store に公開したり、テストグループに配布したりできるようになります。
前提条件
YAMLとGitHub Actionsの構文に馴染んでいる必要があります。 詳細については、以下を参照してください:
Xcode アプリケーションのビルドと署名について理解しておく必要があります。 詳細については、Apple の開発者向けドキュメントを参照してください。
証明書とプロビジョニングプロファイルのシークレットを作成する
署名プロセスには、証明書とプロビジョニングプロファイルの保存、それらのランナーへの転送、ランナーのキーチェーンへのインポート、およびビルドでの使用が含まれます。
ランナーで証明書とプロビジョニングプロファイルを使用するには、GitHub シークレットを使用することを強くお勧めします。 シークレットの作成とワークフローでのそれらの使用について詳しくは、「GitHub Actions でのシークレットの使用」をご覧ください。
次のアイテムのシークレットをリポジトリまたは Organization に作成します。
-
Apple の署名証明書。
-
これは
p12
証明書ファイルです。 Xcode から署名証明書をエクスポートする方法の詳細については、Xcode のドキュメントを参照してください。 -
証明書をシークレットとして保存する場合は、証明書を Base64 に変換する必要があります。 この例では、シークレットの名前は
BUILD_CERTIFICATE_BASE64
です。 -
次のコマンドを使用して、証明書を Base64 に変換し、クリップボードにコピーします。
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
-
-
Apple 署名証明書のパスワード。
- この例では、シークレットの名前は
P12_PASSWORD
です。
- この例では、シークレットの名前は
-
Apple プロビジョニングプロファイル。
-
Xcode からプロビジョニングプロファイルをエクスポートする方法の詳細については、Xcode のドキュメントを参照してください。
-
シークレットとして保存する場合は、プロビジョニングプロファイルを Base64 に変換する必要があります。 この例では、シークレットの名前は
BUILD_PROVISION_PROFILE_BASE64
です。 -
次のコマンドを使用して、プロビジョニングプロファイルを Base64 に変換し、クリップボードにコピーします。
base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy
-
-
キーチェーンのパスワード。
- ランナー上に新しいキーチェーンが作成されるため、新しいキーチェーンのパスワードは任意の新しいランダムな文字列にすることができます。 この例では、シークレットの名前は
KEYCHAIN_PASSWORD
です。
- ランナー上に新しいキーチェーンが作成されるため、新しいキーチェーンのパスワードは任意の新しいランダムな文字列にすることができます。 この例では、シークレットの名前は
ワークフローにステップを追加する
このワークフロー例には、GitHub シークレットから Apple 証明書とプロビジョニングプロファイルをインポートし、それらをランナーにインストールするステップが含まれています。
name: App build on: push jobs: build_with_signing: runs-on: macos-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install the Apple certificate and provisioning profile env: BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} P12_PASSWORD: ${{ secrets.P12_PASSWORD }} BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }} KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} run: | # create variables CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db # import certificate and provisioning profile from secrets echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH # create temporary keychain security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH security set-keychain-settings -lut 21600 $KEYCHAIN_PATH security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH # import certificate to keychain security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH security list-keychain -d user -s $KEYCHAIN_PATH # apply provisioning profile mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles - name: Build app # ...
name: App build
on: push
jobs:
build_with_signing:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install the Apple certificate and provisioning profile
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
# create variables
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
# import certificate and provisioning profile from secrets
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
# import certificate to keychain
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
# apply provisioning profile
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
- name: Build app
# ...
Note
iOS ビルド ターゲットの場合、プロビジョニング プロファイルに拡張子 .mobileprovision
を付けてください。 macOS ビルド ターゲットの場合、拡張子は .provisionprofile
にします。 ターゲット プラットフォームを反映するよう、上記のワークフロー例を更新してください。
セルフホストランナーに必要なクリーンアップ
GitHub ホストランナーは、ジョブの実行の最後に自動的に破棄される分離された仮想マシンです。 これは、ジョブ中にランナーで使用された証明書とプロビジョニングプロファイルが、ジョブの完了時にランナーとともに破棄されることを意味します。
セルフホステッド ランナーでは、ジョブの実行の最後に $RUNNER_TEMP
ディレクトリがクリーンアップされますが、キーチェーンとプロビジョニング プロファイルがランナーにまだ存在している可能性があります。
セルフホストランナーを使用する場合は、ワークフローに最終ステップを追加して、ジョブの最後にこれらの機密ファイルが確実に削除されるようにする必要があります。 以下のワークフローステップは、これを行う方法の例です。
- name: Clean up keychain and provisioning profile
if: ${{ always() }}
run: |
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision