[WWDC 2021][iOS Developer必見] Xcode13でGitHubのワークフローが激変しそう

これまで GitHub の Web サイト上でやっていたこと（プルリク作成、レビューなどのコメント追加、コメントの確認、Approve、Merge など）が Xcode13 からは Xcode 上で出来るようになるようです。（これでいちいちブラウザを開かなくて良くなるかも）

GitHub でチーム開発をしている iOS Developer はこれまでの GitHub ワークフローが変わりそう（と期待したい）です。


# 参考にしたセッションビデオ

Review code and collaborate in Xcode

https://developer.apple.com/videos/play/wwdc2021/10205/


# ビデオ詳細

[WWDC 2021] Review code and collaborate in Xcode のメモをこちらに残しておきますので、皆様の参考になれば幸いです。

## Find and fix a regression

### 新しいコードレビューモード（Inline）
1. ソース修正をしてコードレビューモードボタン（右上の左右矢印ボタン）を選択すると差分を確認できる
	* それはXcode12でも同様だが、Xcode13では差分をGitのようなインラインモードで表示できる
	* Inline 表示のまま作業を進めれば、いつでも差分を確認できるのでそのまま使っても良さそう
	* ただし、ダークモードの場合デフォルトのカラー設定では差分があまり見やすくない
1. ソース修正後、下部バーの Stepper Control（`< 4 Changes >` とか表示されてるやつ）に（開いているファイル内での）変更数が表示される
	* 矢印をクリックすると差分にジャンプするので、ビデオでは「スクロール不要」と言っていた
	* だけどショートカットは無いのかな？
1. コードレビューモードの表示スタイルは `Inline` か（既存の）`Side By Side` を選べる
	* 表示スタイルは右側の Editor Menu から選べる
	* ビデオではInlineモードをお勧めしている

### リリース間の差分確認方法
下部バーの Commit Control（`Last Commit`と表示されてるやつ）で比較対象の設定が簡単にできるようになる

1. `Last Commit`をクリックするとポップアップが表示される
1. ポップアップに比較対象のブランチ、タグ、コミットが一覧表示される
1. どこかのコミットをクリックすると差分が表示される
1. 確認が終わったら、下部バーの`Reset`ボタンで元に戻れる

### 複数ファイルの変更がある時
Repositories ナビゲータの Changes タブで全ファイルの差分が見れるようになる
（既存のコミット `cmd + option + c` やフィルタをかけるよりも楽なので SourceTree の出番が減りそう）

### ブランチの作成と切り替え方法
1. Xcodeのツールバーに現在のブランチ名が表示されるようになった
1. ブランチ名をクリックすると Source Control Popover が表示される
1. Source Control Popover にブランチ一覧が表示されるので、そこから簡単にブランチを切り替えられるようになる
1. セカンダリメニュー（右側の`...`）からブランチを新規作成できるようになる

## Get feedback from your team
### プルリクの発行方法
1. Xcode 上部ツールバーのブランチ名をクリックして Source Control Popover を表示させる
1. Source Control Popover から`Create Pull Request` を選択するとドラフト版のプルリクができる
1. ドラフト版のプルリクは Repositories ナビゲータ内 Changes タブの Pull Request セクションに表示される
1. `Local Changes`セクションにはプルリクに含まれない（まだコミットしてない）変更が表示される
1. Pull Request セクションから `Untitled Pull Request` を選択すると詳細画面が表示される
1. 詳細画面でプルリクのタイトルと説明を変更する
1. Add Reviewer（人のアイコン）ボタンから Reviewer を追加する
1. （多分）最後に `Publish` ボタンをクリックしてプルリクを発行する

**ただし、私がベータ版で軽く試したところ、以下の注意点がありそう**

* Preferences... の Accounts から GitHub でログインしておく必要がありそう
* Xcode 上でも Push しないと `Create Pull Request` を選択してもエラーになるかも
	* ターミナルから git push をするだけではうまく動作しなかった（気のせいだと思いたいが）
	* git push はターミナルかバッチで済ませたいので、できれば Xcode の Push は使いたくないなぁ

### プルリク発行後
プルリク発行後に他のブランチに切り替えると Xcode は自動的にどのプルリクを表示するか判断してくれる（Xcode がブランチに紐づくプルリクを自動で表示してくれる）

### プルリクのフィードバックを確認する
Repositories ナビゲータ内 Changes タブからプルリクを選択すると、プルリクの概要と履歴が確認できるようになる

* Xcode 上でプルリクのフィードバックコメントを確認できる（拍手）
* Xcode 上からフィードバックコメントに直接返信できる（拍手）
* `View Changes` ボタンをクリックするとコメントをもらった箇所に直接ジャンプする（コードレビューモードだと見やすいな）
* Reviewer が承認（Approve）したことも Xcode 上で確認できる（拍手）

### CIのステータス確認
（Xcode Cloud を使っていれば）詳細画面の `Builds` ボタンから CI のステータスを確認できるようになる

* 詳細画面の `Builds` ボタンをクリックするとポップオーバが表示される
* ポップオーバからエントリをクリックすると Xcode Cloud Report にジャンプする
* ※ここではCIには踏み込まないが、Xcode Cloud を使えばプルリクを作成した時点でCIテストができる（マージ後ではなくプルリク作成時点で）

## Integrate your changes
### マージ方法
1. プルリクが承認されて、Xcode Cloud ジョブが成功していることを確認する
1. 詳細画面右上の `Merge` ボタンをクリックするとポップオーバが表示される
1. ポップオーバ内でマージ方法（Merge strategy）を選択する
1. デフォルトはマージコミットを含む `Merge Commint(Default)` になっている
1. オプションでマージコミットのメッセージも入力できる
1. 良ければ `Merge` ボタンをクリックしてマージする

## Review your peer's changes
### プルリクのレビューをする
自分がタグ付けされるとプルリクの内容を Xcode 上で確認できるようになる

1. Source Control Popover には自分に紐づいた（レビュー依頼が来た）プルリクも表示される（拍手）
1. Source Control Popover から自分にレビュー依頼が来たプルリク名横のセカンダリ（`...`）ボタンをクリックする
1. `Check Out Pull Request...` を選択するとプルリクのブランチをチェックアウトできる（拍手）
1. Changes タブの Pull Request セクションからプルリクの内容を確認できる
1. ファイルをクリックするとコードレビューモードで変更内容を確認できる
1. Editor 内でセカンダリクリックすると `Comment on Current Line` からその行にコメントを追加できる（拍手）
1. Xcode 上の詳細画面右上の `Approve` ボタンから Approve もできる（拍手）


**追記 Beta2**
Xcode13 beta2 でこの機能を試したところ、確かに自分に紐づいた（レビュー依頼が来た）プルリクは Source Control Popover に表示されたが、`Check Out Pull Request...` から `Check Out` を選択すると以下のエラーになってしまう。（なんとなく私の環境が悪い気がするが、まだ解決方法は分からない）

```
The operation couldn’t be completed. (IDESourceControlUI.PullRequestWorkingCopyBranchError error 2.)
```

**追記 Beta3,4,5**

https://developer.apple.com/documentation/xcode-release-notes/xcode-13-beta-release-notes

Xcode13 Beta3 がリリースされたので、もう一度試してみたが、まだエラーになる。
ただし、前回の Beta2 とは違う以下のアラートが出るな。うーん。

```
Branch (ブランチ名) could not be found. Choose Fetch Changes from the Source Control menu, and try again.
```

Xcode13 Beta4, 5 でも同様のアラートが出るので、単純に環境の問題かもしれない。

Xcode 13 Beta 5 の Release Notes には以下の記載があるので期待したがダメだった。

```
Source Control
Fixed an issue that could prevent changing the target branch of a published pull request. (78463175)
```

## Epilogue
ビデオの最後に「プルリクエストでのディスカッションはソースコードに直接表示されるため、チームワークは開発プロセスの真の一部になります」と言っていたが、確かに私もその通りだと思いました

# おわりに
Xcode Cloud も初めは物凄くワクワクしましたが、有料になるかもしれないと分かり一気に熱が覚めてしまった私。
それでも本記事で紹介する Xcode の GitHub 連携は標準機能として使えそうなので、個人的には今回の WWDC21 でかなり期待している機能になります。

ちなみに GitHub 以外（GitLabなど）はどうなるのかよく分かりませんでした（私が GitHub 以外使ったことがないのでよく分からずです）