[AppStoreConnect] バイナリアップロードを自動化しよう！

どうも、お久しぶりです。
[株式会社グレンジ](https://www.grenge.co.jp/)でエンジニアマネージャー兼クライアントエンジニアのmesshiです。
(CyberAgentグループ、ゲーム事業部の子会社です)

毎年Advent Calendarの時期にフッと現れて、記事を投稿するスタイルが定着しています。
社内のQiita Teamには定期的に投稿はしているんですが、こちらにも投稿できるものは転載していかないとなーと思っている次第です。

今年の記事は題名通り、 **iOSのバイナリをAppStoreConnectにアップロードする際の手順を自動化する** お話です

2019年はXCode11からApplication Loaderが無くなり、混乱した人も多かったのではないでしょうか
少し時間が経った今こそ、この辺りの記事を改めて書こうかなと思います

#  本記事の前提条件
今回の記事では、既にXcodeプロジェクトでのアーカイブが成功している事を前提とします
この辺りの記事はたくさんあるのと、各プロジェクトによってバックグラウンドが違うため割愛します

本記事の自動化で使用するコマンドは`xcrun altool`です

# 自動化を行う前に
それでは自動化を行いましょう！と言いたい所ですが、まずはコマンドが使用できるか確認しましょう

## xcrun altoolの確認
ターミナルで実際に入力してみましょう

次のようなエラーが発生した場合、少し準備が必要です

```
GRENGE:~ a13$ xcrun altool
xcrun: error: unable to find utility "altool", not a developer tool or in PATH
```

altoolが見つからないと言われています
その場合は、下記コマンドを叩けばOKです
`sudo xcode-select -r`

xcode-selectとは複数のXcodeアプリケーションをインストールしている際に
xcrunなどのコマンドがどのバージョンを使用するかを明示的に切り替えたりするのに使用します
詳しく知りたい方は、[リファレンス](https://qiita.com/messhi/items/cb8c6f2b4b6540995189#%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)の4番を見てください

今回の「-r」のオプションについてはUsageを見てみましょう

```
Usage: xcode-select [options]

Print or change the path to the active developer directory. This directory
controls which tools are used for the Xcode command line tools (for example, 
xcodebuild) as well as the BSD development commands (such as cc and make).

Options:
  -h, --help                  print this help message and exit
  -p, --print-path            print the path of the active developer directory
  -s <path>, --switch <path>  set the path for the active developer directory
  --install                   open a dialog for installation of the command line developer tools
  -v, --version               print the xcode-select version
  -r, --reset                 reset to the default command line tools path
```
注釈に書かれている通り、command line toolsへのパスをリセットしているだけです

# 自動化を行う
コマンドを叩く準備ができました
実は、この時点で自動化までにやることの半分以上は終わっています
あとはコマンドを記述していくだけです

## xcrun altoolを使用する
xcrun altoolを用いてアップロードする方法は調べた限り2通りあります
以下より、その2つについて紹介していきます

### 手法1: App Store Connectのログイン情報を直接記載する方法
ログイン情報を直接、コマンドラインに入力するので比較的簡単です
(セキュアかどうかはさておき)

#### コマンド
次のコマンドをタイプするだけでOKです

```
#validate
xcrun altool --validate-app -f XXXX.ipa -t ios -u LOGIN_ID -p LOGIN_PASSWORD

#submit
xcrun altool --upload-app -f XXXX.ipa -t ios -u LOGIN_ID -p LOGIN_PASSWORD
```
置き換える箇所は「ipaのパス」AppStoreConnectへの「ログインID」と「ログインパスワード」になります

### 手法2: App Store ConnectのApi Keyを使用する方法
こちらは直接ログイン情報をコマンドラインに入力しないので、先ほどの手法と比べて、一手間掛かります
以下に手順を載せていきます

#### ユーザとアクセスに遷移する
まずはApp Store Connectにログインしましょう
その後、「ユーザとアクセス」を押下します
![image_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35666/0badecfa-1f10-ebd9-6a36-045cfadc27ab.png)

#### キーからアクセスをリクエストする
「キー」のタブを押下し、「アクセスをリクエスト」を押下します
<img width="1083" alt="image_002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35666/f5ae6dfd-49a1-090a-a027-143d06cd3652.png">

#### アクセスリクエスト許可する
リクエストを押下するとポップアップが開きます
問題なければチェックして「提出」を押下しましょう (提出しないと先に進めません)
<img width="611" alt="image_003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35666/85ddd40c-da1e-15b0-d5b4-708c054590d2.png">

#### APIキーを生成する
「APIキーを生成」を押下する
![image_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35666/316bdff8-ba2b-52b0-c0eb-617a024a008b.png)

ポップアップが開くので、「APIキーの名前」を入力し、アクセス権は適切な権限範囲を選択しましょう
とりあえず、今回はDeveloperを選択します
<img width="609" alt="image_005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35666/ec6da839-fc24-bce1-cc5e-b02956240aec.png">


生成を押下することで、APIキーが作成されます

#### APIキーをダウンロードする
新しいレコードが生成されているので、「APIキーをダウンロード」を押下します
![image_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35666/ac7a0626-c7e2-3143-15db-8d853fe40fe7.png)

すると警告ポップアップが開きます。
ポップアップの内容通り、 **一度しかダウンロードできない** ので、しっかり管理してください
<img width="609" alt="iamge_007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35666/de404ade-16af-99cc-2e43-bcc579211500.png">

#### ダウンロードしたファイルを配置する
自動化するPCに、ダウンロードしたファイルを配置しましょう
[リファレンス](https://qiita.com/messhi/items/cb8c6f2b4b6540995189#%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)の1番や2番では複数記載されていますが、私の場合は下記にしました
`/Users/USER_NAME/private_keys` 

もし駄目だった場合は、他の場所を試してみるのも良いかと思います


#### コマンド
叩くコマンドはこちらです
前回と基本のコマンドは一緒ですが、オプションが微妙に違います

```
#validate
xcrun altool --validate-app -f XXXX.ipa -t ios --apiKey YOUR_KEY_ID --apiIssuer YOUR_ISSUER_ID --verbose

#submit
xcrun altool --upload-app -f XXXX.ipa -t ios --apiKey YOUR_KEY_ID --apiIssuer YOUR_ISSUER_ID --verbose
```

置き換える場所は「YOUR_KEY_ID」と「YOUR_ISSUER_ID」です
情報の記載場所は「ユーザとアクセス」ページ内にあります

![image_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35666/65f2ba6b-0d12-f433-c6e5-e081b36d7809.png)

## CLIからコマンドを叩く
手法1、手法2のどちらを採用したにしろ
あとは、これをJenkinsなどのCLIから叩くようにすれば、自動化完了です

# 最後に
申請作業は、継続的に発生する作業なのでなるべく簡略化や自動化のしがいがありますね。
この記事が自動化をしようとしている方の一助になれば幸いです。

まだまだ弊社のエンジニアからの発信は続きます
そして、[Grenge](https://www.grenge.co.jp/#/recruit)という企業へ興味を持って頂けると、大変嬉しく思います。

それでは、最後まで読んで頂き、ありがとうございました。

# リファレンス
1. [Xcode 11 使用xcrun altool 密钥上传ipa包](https://juejin.im/post/5da3cae951882555a84302f7)
2. [macOS: How to upload pkg without Application Loader #4293](https://github.com/electron-userland/electron-builder/issues/4293)
3. [How to upload IPA now that Application Loader is no longer included in Xcode 11](https://stackoverflow.com/questions/57976017/how-to-upload-ipa-now-that-application-loader-is-no-longer-included-in-xcode-11)
4. [xcode-selectによるデベロッパディレクトリ管理](https://qiita.com/gooichi/items/017cf84ec52726ccd785)