ネイティブアプリをCLIでVisual Studio App Centerにアップロードする
以前Visual Studio App Centerを使って継続的にアプリ配信を行う記事を公開していました。
こちらの記事で紹介していたアップロード方法に変更があったようなので修正記事を公開します。
アップロードに失敗する
以前紹介したcurlでのAPIリクエストではファイルアップロードのAPIリクエストが443エラーになるようになりました。
... * Trying 52.177.49.80... * TCP_NODELAY set * Connection failed * connect to 52.177.49.80 port 443 failed: Operation timed out * Failed to connect to upload.appcenter.ms port 443: Operation timed out * Closing connection 0 curl: (7) Failed to connect to upload.appcenter.ms port 443: Operation timed out
どうやらアップロード方法が変わった模様です。
確認したらファイルアップロードのエンドポイントが先日のメンテナンスでクローズされていました。
[Status] Investigating: Customer that are using older appcenter-cli version may experience issues during distribution. https://t.co/CmWVmA6eED
— VSAppCenter Status (@AppCenterStatus) 2021年10月15日
公式サイトの手順もアップロードで利用するAPIが release_uploads
から /uploads/releases
に変わっていました。
APIリファレンスでも /releases_uploads
はDeprecatedになっています。
公式リンクに沿ってAPIリクエストを組み直そうと思ったのですが、思った以上に処理が複雑になっていたので素直にappcenter cliを使うことにします。
appcenter cliの設定
公式リンクに従ってインストールします。npm経由でのインストールになるのでNode.jsの環境が必要です。anyenvなどで環境構築しておくとよいでしょう。
インストールした環境は以下の通りです。
$ node -v v14.18.1 $ appcenter --version appcenter version 2.10.3
認証情報の設定はAPI Tokenを利用することにします。--token
で引数指定するか APPCENTER_ACCESS_TOKEN
の環境変数を利用すればよいようです。
最初のアクセス時には以下の利用状況の把握の確認が出ます。
App Center CLI would like to collect data about how users use CLI commands and some problems they encounter. Participation is voluntary and when you choose to participate your device automatically sends information to Microsoft about how you use App Center CLI. For more information, please see our privacy policy at https://aka.ms/mobilecenterprivacy ? Enable telemetry? (Y/n)
CDパイプラインでの実行では邪魔なので --disable-telemetry
オプションをつけます。
アップロードのコマンドは以下の様になります。-aでオーナ名/プロジェクト名、-fでファイルパス、-rでリリースノート、-gで配信グループ名を指定します。
appcenter distribute release -a ${OWNER_NAME}'/'${ANDROID_PROJECT_NAME} \ -f ${ANDROID_APK_FILE_PATH} -r ${RELEASE_TAG_NAME} -g ${ANDROID_TESTER_GROUP_NAME} \ --disable-telemetry --token ${APPCENTER_ACCESS_TOKEN}
以前まとめたシェルスクリプトは以下のように修正できます。
#!/bin/sh set -x set -e # タグ名 RELEASE_TAG_NAME=${1} # APK ファイルパス ANDROID_APK_FILE_PATH=${2} # ipa ファイルパス IOS_IPA_FILE_PATH=${3} # Visual Studio App Centerのパラメータ APPCENTER_ACCESS_TOKEN='xxxxxxxx' OWNER_NAME='takamii228' ANDROID_PROJECT_NAME='AndroidSample' IOS_PROJECT_NAME='iOSSample' ANDROID_TESTER_GROUP_NAME='Collaborators' IOS_TESTER_GROUP_NAME='Collaborators' # upload android file appcenter distribute release -a ${OWNER_NAME}'/'${ANDROID_PROJECT_NAME} \ -f ${ANDROID_APK_FILE_PATH} -r ${RELEASE_TAG_NAME} -g ${ANDROID_TESTER_GROUP_NAME} \ --disable-telemetry --token ${APPCENTER_ACCESS_TOKEN} echo "App file ${ANDROID_APK_FILE_PATH} was released in Visual Studio App Center in Project: ${ANDROID_PROJECT_NAME} for TAG: ${RELEASE_TAG_NAME} to Group: ${ANDROID_TESTER_GROUP_NAME}" # upload ios file appcenter distribute release -a ${OWNER_NAME}'/'${IOS_PROJECT_NAME} \ -f ${IOS_IPA_FILE_PATH} -r ${RELEASE_TAG_NAME} -g ${IOS_TESTER_GROUP_NAME} \ --disable-telemetry --token ${APPCENTER_ACCESS_TOKEN} echo "App file ${IOS_PROJECT_NAME} was released in Visual Studio App Center in Project: ${IOS_PROJECT_NAME} for TAG: ${RELEASE_TAG_NAME} to Group: ${IOS_TESTER_GROUP_NAME}"
実行方法は以下になります。
./upload-appcenter.sh 1.1.0-dev ./app-release.apk ./appcentersample.ipa
appcenter cliを使ったほうが断然シンプルですね。Node.jsへ依存してしまいますが自前でcurlでやるほうが大変なのでこちらに置き換えるとよいでしょう。
LinuxからApp Store Connectへipaファイルをアップロードする
以前Windowsからipaファイルをアップロードする方法を検証したので、Linuxでもやってみることにします。
検証環境
今回もTransporterのCLIを使います。
必要となる環境の要件は以下の通りです。
System and network requirements Apple supports Transporter on the following operating systems: macOS 10.6 or later (64-bit system) Microsoft Windows 7, 8, 10 or later (64-bit system) Red Hat Enterprise Linux (64-bit system) To install and run Transporter, you should have: 150 megabytes (MB) of available disk space and 2GB of RAM A 2048MB maximum heap size, by default
また Transporter is Apple’s Java-based command-line tool for large catalog deliveries.
とあるのでJavaも必要そうです。
OSはRed Hat Enterprise Linuxとありますが、今回はAWSのEC2で動くか試してみたいと思います。
環境構築
AWSのEC2をAmazon Linux2で立ち上げて接続し、Javaをインストールします。
$ yum install java
AWSなのでCorrettoが降ってきますね。
$ java -version openjdk version "11.0.12" 2021-07-20 LTS OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS) OpenJDK 64-Bit Server VM Corretto-11.0.12.7.1 (build 11.0.12+7-LTS, mixed mode)
Transporterのインストール手順を順番に実行していきます。
インストールのシェルスクリプトをダウンロードする必要があるのですが、これはApple Developer Programの認証が必要なので、macOSでダウンロードしたものをLinuxにアップロードすることにします。
$ sudo sh iTMSTransporter_installer_linux_2.2.0.10.sh
を実行すると利用許諾のプロンプトがでるので許可します。するとコマンドが実行できるようになりました。
$ /usr/local/itms/bin/iTMSTransporter -version [2021-09-04 11:53:59 UTC] <main> DEBUG: DataCenters already set by: defaultProperties [2021-09-04 11:54:01 UTC] <main> INFO: Configuring logging... [2021-09-04 11:54:01 UTC] <main> INFO: Logging level set to off iTMSTransporter, version 2.2.0 [2021-09-04 11:54:05 UTC] <main> DBG-X: Returning 0
ipaファイルをアップロードする
macOSで作成したipaファイルを構築したEC2へアップロードしてTransporterコマンドを実行してみます。 AppStoreInfo.plist
が必要な点とパスワードはApple IDのApp用パスワードな点に要注意です。
$ /usr/local/itms/bin/iTMSTransporter -m upload -assetFile ./sample.ipa -u "xxxxx" \ -p "xxxxx" -assetDescription ./AppStoreInfo.plist -v eXtreme
実行すると以下のようなログがでて、数秒後に無事アップロードが成功していることが確認できました。
[2021-09-04 12:14:18 UTC] <main> DEBUG: DataCenters already set by: defaultProperties [2021-09-04 12:14:20 UTC] <main> INFO: Configuring logging... [2021-09-04 12:14:20 UTC] <main> INFO: Logging level set to eXtreme [2021-09-04 12:14:25 UTC] <main> DEBUG: SMART-CLIENT: initializing data center locking ops: [authenticateForSession, validateAssets] [2021-09-04 12:14:25 UTC] <main> DEBUG: SMART-CLIENT: initializing data centers with: [contentdelivery01.itunes.apple.com] [2021-09-04 12:14:25 UTC] <main> INFO: iTMSTransporter : iTunes Store Transporter [2.2.0] [2021-09-04 12:14:25 UTC] <main> INFO: OS identifier: Linux 4.14.243-185.433.amzn2.x86_64 (amd64); jvm=14.0.2+12-46; jre=14.0.2+12-46 [2021-09-04 12:14:25 UTC] <main> INFO: Memory: [JVM] 958M free, 989M total, 1979M max [System] (Physical) 69M free, 983M total (Swap) 0 free, 0 total [2021-09-04 12:14:25 UTC] <main> DBG-X: Memory: [JVM] 958M free, 989M total, 1979M max [System] (Physical) 69M free, 983M total (Swap) 0 free, 0 total [2021-09-04 12:14:25 UTC] <main> DBG-X: Using operation named: authenticateForSession [2021-09-04 12:14:25 UTC] <main> DBG-X: Apple's web service operation input parameters: ... [2021-09-04 12:14:50 UTC] <main> INFO: Done performing uploadDone notification to Apple. [2021-09-04 12:14:50 UTC] <main> INFO: Transporter's command line arguments are: -m upload -assetFile ./sample.ipa -u xxxxx -p **hidden value** -assetDescription ./AppStoreInfo.plist -v eXtreme [2021-09-04 12:14:50 UTC] <main> INFO: The package: /tmp/DeveloperAPIUpload587828657019442221/1574836491.itmsp has been successfully uploaded. Package Summary: 1 package was uploaded successfully: /tmp/DeveloperAPIUpload587828657019442221/1574836491.itmsp
App Store Connectにもアップロードされていることを確認しました。
以上の検証から、Amazon Linux上でもApp Store Connectにipaファイルがアップロードできることがわかりました。アップロード用にTransporterを構築済みのコンテナを作っておけばAWS CodeBuildで利用できそうですね。
まとめ
何らかの闇の力によってXcodeからのipaファイルのアップロードがブロックされている環境では、ipaファイルをS3などを経由してAWS CodeBuildからアップロードするCDパイプラインを作ればよさそうです。macOS on EC2は高いですしね。
わざわざそんなことしなくてもと思われた方が大半だと思うので、素直に自由なインターネットにつながっているmacOSからアップロードしましょう。
え?S3にはアップロードできるんだって?いいツッコミですn(ry
macOSで開発環境を構築するときにやっていること
最近macOSを初期化して再構築する機会が多々あるので、手順をここにまとめておくことにします。
初期化前にすること
初期化前にmacOSの最新化をしておきます。
OSのソフトウェア・アップデート画面からなぜかアップデートできない場合はApp Store経由でアップデートできるようです。
macOSを初期化する
以下の公式手順を使ってmacOSを初期化&OS再インストールします。OSの再インストールにWiFiしか使えない点に注意が必要です。
初期設定を行う
- 言語を英語に変更
- マシン名を変更
- Finderで拡張子を表示するように変更
- Finderで隠しファイルを表示するように変更(Command + Shift + .)
- Finderで最近使ったファイルを非表示に変更
- Dockの表示を右に変更し自動で非表示にするように変更
- スクリーンセーバーをオフに変更
- 省電力モードをオフに変更
- bluetoothをメニューバーに表示
- OSの自動更新をオフに設定
ソフトウェアをインストールする
以下の順番でソフトウェアをインストールします。
- chrome
- Google IME
- Xcode
- Apple Developer ProgramからxipをDLする
- Preferenceからパスを設定する
- Xcode Command Line Tools
xcode-select --install
でインストールする
- Android Studio
- VSCode
- Homebrew
- CocoaPods
- OpenJDK11
- Flutter
- anyenv / yarn
- yarn
- IntelliJ
- alfred
- diagrams.net Desktop
terminalの設定
カラースキームを変更したり、.zshrc、.zprofileを編集してパス設定、環境変数設定、シェルの表示、gitの補完設定などを行う。
まとめ
詳細はgithubにもまとめています。