Xcode 13で作ったプロジェクトでbitriseでのCIビルドに対応する

最近、新規のiOSアプリをxcode13を使って開発しました。Xcode 13でbitriseのCIビルドについて設定方法が見つからなかったので、備忘録として展開します。

<!-- more -->

## 前提
- 以下の説明では、ソースコードはGitHub上で管理されているものとします。ただし、他のバージョン管理システム(Bitbucket, GitLab, etc.)も使用可能です。
- すでにbitriseのアカウントを設定していて、GitHubに対して接続完了している状態とします。

## 1. Xcode上でTests iOSが実行できるよう設定
アプリのTARGETS設定にて、Tests iOS > Target Applicationを一度Noneにしてからアプリ名に指定し直す必要があります。デフォルト設定の場合、`UITargetAppPath should be provided`となり、UIテスト段階でビルドに失敗します。


![Tests iOSを実行できるよう、TARGETSからTarget Applicationを再設定する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1967276/baa3c3b7-285d-5b6a-8b4b-8c288aaa0f22.png)

## 2. bitriseにアプリ追加
(もし追加済みであれば、次節をご覧ください)

bitriseにログインし、ビルドしたいiOSアプリを新規作成します。

URL: https://app.bitrise.io/apps/add

1. アカウント設定
  1.1. CHOOSE ACCOUNT: bitriseのアカウント
  1.2. SET PRIVACY OF THE APP: アプリに合わせ、public/private のどちらかを選んでください
1. Connect your repository設定
  2.1. タブ: GitHub
  2.2. ORGANIZATIONS'　REPO: ビルドしたいiOSアプリのオーナー名/リポジトリを選択
1. Setup repository access: `No, auto-add SSH key` (自動的にSSH接続用のキーが当該リポジトリで作成されます)※
1. Choose branch: mainもしくはmaster
1. Project build configuration: iOSになっていることを確認します。
1. Select Distribution method: ad-hocなどを選び、Confirm
1. App icon: Skip for Now　(すでにアプリのアイコンがあれば、ここで設定することができます)
1. Webhook setup: `Register a Webhook for me!` (GitHubでのPush, Pull Request時のCIビルドをトリガーさせるために必要です)
1. FINISHを選択

※ 操作しているアカウントが、GitHubの当該リポジトリに対してAdmin権限を持っている必要があります。Admin権限があるユーザでアプリ追加するか、[bitrise Docs](https://devcenter.bitrise.io/ja/apps/configuring-ssh-keys.html)に従ってSSHキーを作成してください。

## 3. Workflow Editor設定
### 3.1. Stackの設定
Workflows > Stack > Default Stackで `Xcode 13.x.x...`を選択します。マイナーバージョンはローカルで使っているXcodeのバージョンに合わせてください。

![Workflow Editorのstackから、Default StackをXcode 13以上にする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1967276/a2d06c4d-e986-a69c-8e48-fb44bf9e9f3c.jpeg)

### 3.2. Code Signing設定
アプリ署名用のProvisioning ProfileおよびCertificatesを追加します。

#### 3.2.1. Provisioning Profile設定
向け先ごとにProvisioning Profileを追加します。向け先は以下のとおりです。

- 開発用(`development`)
- 社内配布用(`ad-hoc`)
- 一般配布用(`app-store`)
- 企業配布用(`enterprise`)[^1]

Workflows EditorのCode Signingを選択します。`PROVISIONING PROFILE`の節について、Add Provisioning Profile(s)からProvisioning Profileのファイルをアップロードします。

#### 3.2.2. Certificates設定
3.2.1.に続き、Code Signingからコード署名用の秘密鍵(.p12)をアップロードしておきます。

### 3.3. Env Vars設定
Env Varsを開き、以下の様に設定します。

#### 3.3.1. App Environment Variables: 共有設定
- BITRISE_PROJECT_PATH: xcodeprojファイルへのパスです。例えば、`(プロジェクト名)/(プロジェクト名).xcodeproj`です。
- APP_TEAM_ID: Apple DeveloperのTeam IDです。後述のDeveloper Portal teamで指定します。bitrise側と被らないようにしておきます。

![App Environment Variablesでプロジェクトファイルパス、Team IDを設定する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1967276/1777aae5-f0c5-bfd1-9b1d-5b4205e5777e.png)


#### 3.3.2. Workflow Environment Variables: ビルドの向け先ごとの設定
向け先毎(Workflow毎)に、以下の設定を行います。

- BITRISE_SCHEME: アプリをビルドするためのschemeです。
  - 開発環境向けリリースビルドなら"devRelease", 本番環境向けリリースビルドなら"proRelease"などを設定します。ご自身のビルドスキームに合わせてください。
- BITRISE_DISTRIBUTION_METHOD: アプリの配布方法です。Provisioning Profileのtype(`development`, `ad-hoc`, `app-store`, `enterprise`等)に対応します。

### 3.4. Workflows設定
- `Certificate and profile installer`の直後に`Xcode Archive & Export for iOS xcode-archive@4`を追加します。バージョンは4.0以上にしてください。4.0未満はXcode 13に対応していません。
- xcode-archive@4について、以下の設定を行います。
  - Input Variables
    - Scheme: `$BITRISE_SCHEME`
    - Distribution method ※: `$BITRISE_DISTRIBUTION_METHOD`
  - IPA export configuration
    - Developer Portal team: `$APP_TEAM_ID`

※ バージョン4.0から、export_methodはdistribution_methodに変わっています。 詳しくは[リリースノート](https://github.com/bitrise-steplib/steps-xcode-archive/releases/tag/4.0.0)の`Renamed some inputs for consistency across Xcode steps (without any behavior change)`の節をご覧ください。

[^1]: 現在、ADEPを新規取得するのは困難のためenterpriseを使うことは無いかもしれません。代わりにカスタムAppを使うことになります　https://developer.apple.com/jp/custom-apps/