Xcode Cloud で TestFlight の テストに関するメモを自動生成する

こちらは、「[GENDA Advent Calendar 2023](https://qiita.com/advent-calendar/2023/genda)」 18日目の記事です。

https://qiita.com/advent-calendar/2023/genda
## はじめに

Xcode Cloud からTestFlight にアップロードすると
一律「テストに関するメモはありません。」と表示されていて
どのビルドが何に対応しているかがわからないという課題がありました。
これを「テストに関するメモ」を自動生成して解決します。

## 動作環境

- Xcode Cloud
- TestFlight

が使える環境

## コミットログを表示してみる

「テストに関するメモ」を表示させるには、`TestFlight/WhatToTest.<LOCALE>.txt` を作成する必要があります。

まずはAppleのサンプルを参考に動的にコミットログを出してみましょう。

https://developer.apple.com/documentation/Xcode/including-notes-for-testers-with-a-beta-release-of-your-app


1. `ci_post_xcodebuild.sh` を作成します。
    ``` ci_scripts/ci_post_xcodebuild.sh
    #!/bin/zsh
    #  ci_post_xcodebuild.sh
    
    if [[ -d "$CI_APP_STORE_SIGNED_APP_PATH" ]]; then
      TESTFLIGHT_DIR_PATH=../TestFlight
      mkdir $TESTFLIGHT_DIR_PATH
      git fetch --deepen 3 && git log -3 --pretty=format:"%s" >! $TESTFLIGHT_DIR_PATH/WhatToTest.en-US.txt
    fi
    ```

2. 作成したスクリプトファイルに実行権限を与えます。
    ``` sh
    chmod +x ci_post_clone.sh
    ```


これが

![none.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221749/104ff490-49f1-a513-d412-20810f2e91e7.png)

このように表示することができました。

![Commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221749/e785105a-3974-7132-69cd-197ad782c4aa.png)

## PRのタイトルを表示する

次にPRからビルド実行された場合はPRのタイトルを出したいので修正していきます。

1. Xcode Cloud の Environment に `GITHUB_TOKEN` を設定します。
![environment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221749/440d0bee-0c75-cd7e-0b7b-9fdba7a62c64.png)

2. `ci_post_clone.sh` を作成してjqコマンドをインストールします。

   ``` ci_scripts/ci_post_clone.sh
    #!/bin/zsh
    #  ci_post_clone.sh

    brew install jq
   ```

3. `ci_post_xcodebuild.sh` にGithub API を使ってPRタイトルを取得する部分を追加していきます。
    ``` ci_scripts/ci_post_xcodebuild.sh
    #!/bin/zsh
    #  ci_post_xcodebuild.sh
    
    WHAT_TO_TEST=""
    
    if [ -n "$CI_PULL_REQUEST_NUMBER" ]; then
      PR_INFO=$(curl -s \
        -H "Accept: application/vnd.github+json" \
        -H "Authorization: Bearer $GITHUB_TOKEN" \
        -H "X-GitHub-Api-Version: 2022-11-28" \
        "https://api.github.com/repos/$CI_PULL_REQUEST_TARGET_REPO/pulls/$CI_PULL_REQUEST_NUMBER")
      
      # https://stackoverflow.com/questions/52399819/invalid-string-control-characters-from-u0000-through-u001f-must-be-escaped-us
      PR_TITLE=$(printf '%s\n' "$PR_INFO" | jq -r '.title')
      WHAT_TO_TEST="[PR#$CI_PULL_REQUEST_NUMBER]\n$PR_TITLE\n"
    fi
    
    COMMIT=$(git fetch --deepen 3 && git log -3 --pretty=format:"%s")
    
    WHAT_TO_TEST=${WHAT_TO_TEST}"[COMMIT]\n$COMMIT"
    
    if [[ -d "$CI_APP_STORE_SIGNED_APP_PATH" ]]; then
      TESTFLIGHT_DIR_PATH=../TestFlight
      mkdir $TESTFLIGHT_DIR_PATH
      echo "$WHAT_TO_TEST" >! $TESTFLIGHT_DIR_PATH/WhatToTest.en-US.txt
    fi
    ```

無事PRのタイトルも出すことができました:v:
![PR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221749/8ca5ddb5-78cd-2f3b-0b09-58748c5f32f3.png)

良いTestFlightライフを:christmas_tree:

## 参考

https://developer.apple.com/documentation/Xcode/including-notes-for-testers-with-a-beta-release-of-your-app

https://developer.apple.com/documentation/xcode/writing-custom-build-scripts