Xcode Cloud経由でdSYMをFirebase Crashlyticsにアップロードする

Xcode14から、Xcode Cloud経由でdSYMがFirebase Crashlyticsにアップロードされない問題を解決する方法となります。

## Xcode14 と Bitcode
Xcode14の[リリースノート](https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes)です。

>depressions
>
>Starting with Xcode 14, bitcode is no longer required for watchOS and tvOS applications, and the App Store no longer accepts bitcode submissions from Xcode 14.
>
>Xcode no longer builds bitcode by default and generates a warning message if a project explicitly enables bitcode: “Building with bitcode is deprecated. Please update your project and/or target settings to disable bitcode.” The capability to build with bitcode will be removed in a future Xcode release. IPAs that contain bitcode will have the bitcode stripped before being submitted to the App Store. Debug symbols can only be downloaded from App Store Connect / TestFlight for existing bitcode submissions and are no longer available for submissions made with Xcode 14. (86118779)

確かに、App Store Connect にアクセスすると、Xcode13でビルドされたビルドメタデータにはdSYMファイルがあることがわかりましたが、Xcode14でビルドしたものにはビルドメタデータには存在しませんでした。

##### Xcode13とXcode14 のビルドメタデータ
![metadata.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/e70933ee-ad97-4407-0922-fc99d995e655.png)


## Xcode CloudへのdSYMアップロードの自動化
DSYMをCrashlytics向けにアップロードするプロセスを自動化するスクリプトを作成するには、このロジックをCIワークフローに組み込む必要があります。

:::note info
XcodeCloudには、3種類のスクリプトがあり、それぞれ特定の時点で実行されます。カスタムビルドスクリプトの詳細と、それらをワークフローに追加する方法については、[ドキュメント](https://developer.apple.com/documentation/xcode/writing-custom-build-scripts)で詳しく説明されています。
:::

以下のXcodeBuild後に実行されるスクリプトを使用します。
| シェルスクリプト名| トリガー | 用途例 |
|:-:|:-:|:-:|
| ci_post_xcodebuild.sh  |  XcodeBuild後に実行 |  ビルド成果物を他サービスにアップロード等 |


以下の３つの[環境変数](https://developer.apple.com/documentation/xcode/environment-variable-reference)を使用します。


>CI_DERIVED_DATA_PATH
>　　The path to the directory that contains your project’s derived data.
>		
>CI_ARCHIVE_PATH
>　　The path to the exported app archive that Xcode Cloud creates when it runs an archive action.
>
>CI_PRIMARY_REPOSITORY_PATH
　　The location of the source code in the temporary build environment cloned from the primary repository specified in the workflow, for example, /Volumes/workspace/repository.


| 環境変数 | 用途 |
|:-|:-|
| CI_DERIVED_DATA_PATH  | ```upload-symbols```スクリプトをここから指定します |
| CI_ARCHIVE_PATH  | 新しいdSYMファイルを取得する場所です  |
| CI_PRIMARY_REPOSITORY_PATH  |  ```GoogleService-Info.plist```をここから指定します |


```shell:ci_post_xcodebuild.sh
#!/bin/sh
set -e
if [[ -n $CI_ARCHIVE_PATH ]];
then
    # 親ディレクトリに移動
    cd ..
    # Crashlytics dSYMs スクリプトを実行
    $CI_DERIVED_DATA_PATH/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/upload-symbols -gsp $CI_PRIMARY_REPOSITORY_PATH/プロジェクト名/GoogleService-Info.plist -p ios $CI_ARCHIVE_PATH/dSYMs
else
    echo "アーカイブパスが使用できないため、dSYMアップロードを実行できません"
fi
```

## CI環境変数の確認方法

:::note info
App Store Connectから[環境変数](https://developer.apple.com/documentation/xcode/environment-variable-reference)の設定を確認することができます

![Set_environment_variables.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/34042589-e6d9-3485-0b0e-c6c65571c5b3.png)

>```CI_DERIVED_DATA_PATH```=/Volumes/workspace/DerivedData
```CI_ARCHIVE_PATH```=/Volumes/workspace/build.xcarchive
```CI_PRIMARY_REPOSITORY_PATH```=/Volumes/workspace/repository
:::


## 重要
```ci_post_xcodebuild.sh```を実行可能に変更します。次のコマンドで実行できます。

```shell
chmod +x ci_post_xcodebuild.sh
```