つばくろぐ @takamii228

知は力なり

ネイティブアプリをCLIでVisual Studio App Centerにアップロードする

以前Visual Studio App Centerを使って継続的にアプリ配信を行う記事を公開していました。

takamii.hatenablog.com

こちらの記事で紹介していたアップロード方法に変更があったようなので修正記事を公開します。

アップロードに失敗する

以前紹介した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.appcenter.ms

公式サイトの手順もアップロードで利用するAPIrelease_uploads から /uploads/releases に変わっていました。

docs.microsoft.com

APIリファレンスでも /releases_uploads はDeprecatedになっています。

openapi.appcenter.ms

公式リンクに沿ってAPIリクエストを組み直そうと思ったのですが、思った以上に処理が複雑になっていたので素直にappcenter cliを使うことにします。

appcenter cliの設定

公式リンクに従ってインストールします。npm経由でのインストールになるのでNode.jsの環境が必要です。anyenvなどで環境構築しておくとよいでしょう。

docs.microsoft.com

インストールした環境は以下の通りです。

$ 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

無事AndroidiOSともにアップロードできました。

appcenter cliを使ったほうが断然シンプルですね。Node.jsへ依存してしまいますが自前でcurlでやるほうが大変なのでこちらに置き換えるとよいでしょう。