課題
FireBaseSDKを組み込んだiOSプロジェクトでは、GoogleService-Info.plistというAPI Keyなどのシークレット情報を含むファイルをプロジェクトに含める必要があります。
シークレット情報なので、そのままGitHubのリポジトリにPushすると情報漏洩する危険があるので、基本的にはGoogleService-Info.plistはPushしないようにします。
しかしCI環境でビルドする際に、GoogleService-Info.plistがないとFireBaseSDKを組み込んだiOSプロジェクトはビルド出来ないため、ビルド時にはGoogleService-Info.plistをどうにかして参照する必要があるのです。
※FireBaseSDKの導入方法
今回は後続で記載する環境で、上記課題を解決した方法を記事にしてみます。
環境
- Xcode: 16
- CI: GitHub Actions
- Package管理ツール: SPM
- FireBaseSDK: 11.2.0
解決方法
CI環境の環境変数にGoogleService-Info.plistの内容を設定し、ビルド前に環境変数を元にGoogleService-Info.plistを生成することで解決します。
具体的には以下手順になります。
-
GoogleService-Info.plistをBase64でコンコードする - エンコードした内容をGitHub Actionsの
Actions secrets and variablesに設定 - CIのワークフローに
GoogleService-Info.plistを生成するステップを追加
※参考
手順1
GoogleService-Info.plistをBase64でコンコードする
以下コマンドの実行結果を控えます
% base64 < <ファイルパス>/GoogleService-Info.plist
手順2
エンコードした内容をGitHub ActionsのActions secrets and variablesに設定
Actions secrets and variablesでは安全に秘密の情報を設定することができ、GitHub Actionsではその設定した情報を参照することができます。
下記でActions secrets and variablesの設定手順を説明します。
本対応を入れたいGitHubリポジトリのSettingタブを押下します。

左メニュのSecurityセクションの下記赤枠部分を押下します。

下記赤枠のNew repository secretを押下します。

Nameには任意の名前を設定し、Secretでは手順1で控えたBase64エンコードした値を設定します。
そして以下赤枠ボタンを押下します。

これでActions secrets and variablesの設定完了です。
手順3
CIのワークフローにGoogleService-Info.plistを生成するステップを追加
下記がGoogleService-Info.plistを生成するステップの実装です。
# GoogleService-Info.plistの復元
- name: Decode GoogleService-Info.plist
run: |
echo ${{ secrets.GOOGLE_SERVICE_INFO_PLIST_CONTENT }} | base64 -o ${{ env.GOOGLE_SERVICE_INFO_PLIST_PATH }} -D
やっていることとしては、${{ secrets.GOOGLE_SERVICE_INFO_PLIST_CONTENT }}でGoogleService-Info.plistのBase64エンコード内容を取得し、
base64 -D'コマンドでBase64デコードして元のGoogleService-Info.plistの内容を取得して環境変数GOOGLE_SERVICE_INFO_PLIST_PATH`に設定したパスのファイルに出力します。
これで外部へはGoogleService-Info.plistの情報を漏らさないまま、GitHub Actions内ではGoogleService-Info.plistを参照することができます。
CIワークフローの全体コードの実装例は以下の通りです。
name: CI_WORKFLOW
on:
pull_request:
branches:
- "*"
workflow_dispatch:
env:
DEVELOPER_DIR: /Applications/Xcode_16.0.app
WORKSPACE_PATH: XXX.xcworkspace
TARGET_SCHEME_NAME: XXX
TARGET_TEST_PLAN_NAME: XXX
GOOGLE_SERVICE_INFO_PLIST_PATH: XXX/GoogleService-Info.plist
jobs:
build:
runs-on: macos-latest
steps:
# チェックアウト(リポジトリからソースコードを取得)
- name: Check Out repository
uses: actions/checkout@v3
# Xcodeの一覧出力
- name: Show Xcode list
run: ls /Applications | grep 'Xcode'
# Xcodeのバージョン指定
- name: Select Xcode version
run: sudo xcode-select -s ${{ env.DEVELOPER_DIR }}
# Xcodeのバージョン出力
- name: Show Xcode version
run: xcodebuild -version
# Rudy製ライブラリのキャッシュ
- name: Cache Gems
uses: actions/cache@v2
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-gems-
# Rudy製ライブラリのインストール
- name: Install Bundled Gems
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
# SPMのライブラリのキャッシュ
- name: Cache Swift Packages
uses: actions/cache@v2
with:
path: SourcePackages
key: ${{ runner.os }}-spm-${{ hashFiles('*.xcodeproj/project.xcworkspace/ xcshareddata/swiftpm/Package.resolved') }}
restore-keys: ${{ runner.os }}-spm-
# GoogleService-Info.plistの復元
- name: Decode GoogleService-Info.plist
run: |
echo ${{ secrets.GOOGLE_SERVICE_INFO_PLIST_CONTENT }} | base64 -o ${{ env.GOOGLE_SERVICE_INFO_PLIST_PATH }} -D
# テスト
- name: Xcode virify
run: set -o pipefail &&
xcodebuild
-workspace ${WORKSPACE_PATH}
-scheme ${TARGET_SCHEME_NAME}
-testPlan ${TARGET_TEST_PLAN_NAME}
-sdk iphonesimulator
-configuration Debug
-destination "platform=iOS Simulator,OS=17.2,name=iPhone 15 Pro"
-clonedSourcePackagesDirPath SourcePackages
-scmProvider xcode
-allowProvisioningUpdates
-skipPackagePluginValidation
-parallel-testing-enabled NO
clean test |
bundle exec xcpretty
以上がFireBaseSDKを組み込んだiOSプロジェクトをGitHub Actionsでビルドする方法でした。