見出し画像

GitHubActions×Fastlane×FirebaseでiOSアプリを配布するCI/CDを構築

こんばんはリーさんです!
とある大型案件でCI/CDを構築してと頼まれたので
その際にかなり設定に手こずったので構築手順をメモして行こうと思います!!

手順1 GitHubActions secret設定

プロジェクト → Settingへ

Actionsをクリックしたら下記の内容を設定しましょう

CERT_PASSWORD
証明書を書き出す際に設定したパスワードを入れてください

FIREBASE_TOKEN
下記のコマンドでFirebaseにログインしてください

firebase login:ci

$ firebase login:ci

Visit this URL on this device to log in:
https://accounts.google.com/o/oauth2/auth?client_id=123456789012-aaaabbbbccccddddeeeeffffgggghhhh.apps.googleusercontent.com&scope=email%20openid%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloudplatformprojects.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Ffirebase%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&response_type=code&state=123456789&redirect_uri=http%3A%2F%2Flocalhost%3A9005

Waiting for authentication...

✔  Success! Use this token to login on a CI server:

1//xxxx_yyyy000_XXXXYYYYZZZZaaa-XXXXbb-ZZZZYYYYXXXX00001111222233_aaaabbbbccccddddeeeeffffgggghhhhiiiij  ← 1//から始まるところ!

Example: firebase deploy --token "$FIREBASE_TOKEN"

KEYCHAIN_PASSWORD
こちらは好きなパスワードを入れてください(一時的に使うものなのでなんでもOK)

p12_BASE64
下記のコマンドで証明書をbase64化したものをコピーして入れてください

$ cat 証明書.p12 | base64 | pbcopy


PROVISIONING_BASE64
下記のコマンドでプロビジョニングプロファイルをbase64貸したものをコピーして入れてください

$ cat hogehoge.mobileprovision | base64 | pbcopy


手順2Git-workflowのymlファイルの作成

set up a workflow yourselfをクリック

ここに下記のコードをコピペしてコミットプッシュしてください

(プロジェクトルート)/.github/workflows/swift.yml

# This is a basic workflow to help you get started with Actions

name: Adhoc Distribution

on:
  push:
    tags:
       - '[0-9].[0-9].[0-9]'. //バージョンタグをプッシュがトリガー


jobs:
  build:

    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v2

    - uses: actions/setup-node@v1
      with:
        node-version: '18.x'
      
    - name: Bundle Install
      run: bundle install

    - name: Keychain.p12
      run: |
        echo "${{ secrets.P12_BASE64 }}" > ios_distribution.p12.txt
        base64 --decode ios_distribution.p12.txt > ios_distribution.p12

    - name: ProvisioningProfile
      run: |
        echo "${{ secrets.PROVISIONING_BASE64 }}" > adhoc.mobileprovision.txt
        base64 --decode enterprise.mobileprovision.txt > adhoc.mobileprovision
        
    - uses: actions/cache@v2
      with: 
       path: Pods
       key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
       restore-keys: |
         ${{ runner.os }}-pods-
   
    - name: Install CocoaPods frameworks and build with custom scripts
      if: steps.cache-cocoapods.outputs.cache-hit != 'true'
      run: pod install

    - name: list files
      run: ls -l

    - name: Enterprise Build and App Distribution
      env:
        KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
        CERT_PASSWORD: ${{ secrets.CERT_PASSWORD }}
        FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
        DISABLE_SWIFTLINT: true //SWIFTLINT fastlaneが引っかかるため
      run: |
        npm install -g firebase-tools
        bundle exec fastlane archive_stg_app_distribution

手順3 Fastlaneセットアップ

Fastlaneインストール

sudo gem install fastlane --verbose


fastlaneファイルを作成

fastlane init


Gemfileも一緒に作成されるので中身を修正

gem "fastlane"
gem "cocoapods" ← SPMの場合は不要


fastlaneにFirebase App Distributionのプラグイン追加
(プロジェクト配下で下記コマンド実行)

fastlane add_plugin firebase_app_distribution


fastlane fileの中身を編集


ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"] = "1800" //タイムアウトして失敗を防ぐため
ENV['XCODE_VERSION'] = "14.3.1" 最新のXcodeを指定
default_platform(:ios)

platform :ios do
    desc "Import Certificates and Provisioning Profile"
    private_lane :import_certificates_and_provisioning_profile do
        create_keychain(
            name: "ios_app_keychain",
            password: ENV["KEYCHAIN_PASSWORD"],
            timeout: 1800
        )
        import_certificate(
            certificate_path: "ios_distribution.p12",
            certificate_password: ENV["CERT_PASSWORD"],
            keychain_name: "ios_app_keychain",
            keychain_password: ENV["KEYCHAIN_PASSWORD"]
        )

        install_provisioning_profile(path: "adhoc.mobileprovision")
    end

    desc "Archive STG and send to Firebase"
    lane :archive_stg_app_distribution do
        import_certificates_and_provisioning_profile
        build_app(workspace: "SampleApp.xcworkspace",
        scheme: "SampleApp_STG", //ビルドしたいスキーム
        configuration: "STG", 
        clean: true,
        export_options: {
        method: "Adhoc", //AdhocやEnterpriseなど
        provisioningProfiles: {
          "jp.co.hoge.sampleApp" => "jp.co.hoge.sampleApp" //左バンドルID 右provisioning名
        }
    })

        firebase_app_distribution(
            app: "1:hogehogehogehogehogehogehoge", //firebaseのAppID
            groups: "mygroup1,mygroup2,mygroup3", //テスターのgroup名
            release_notes: "STG環境 テスト配信",
            firebase_cli_path: `which firebase`.strip()
        )
    end
end

これで準備は完了です!
Githubに1.2.5などのバージョンタグをプッシュしてGitHubActionsが起動するか確認しましょう!細かいところは後ほど追記していけたらと思います。

いいなと思ったら応援しよう!