Closed16
expoのOTAをどうやったらうまく扱えるか考える
ピン留めされたアイテム
まとめた結果
- expoのOTA、割と普通に使うとむずい
制約とか
- ビルド時にpublishが必要
- ビルド時にrelease-channelを一つ決める必要がある
- ビルドに対するrelease-channelは一つしか決められない
- デフォルトではビルド時にpublishをしてしまう
- =うっかりリリースしてしまいがちな環境になる
使えそうなもの
- --no-publishオプションをビルドに付与することが可能
- expo publish:setでpublish-idとrelease-channelの紐付けみたいなことができそう
- expo publish:detailで情報が取れる。--rawで生情報も取れる
- expo publish:historyで一覧が取れる
カナリアリリース
- checkAutomaticallyでの選択はON_LOAD or ON_ERROR_RECOVERY。結構単位が大きい
- 単純にいうと「まず一部のユーザーで試してうまくいきそうなら全ユーザー」とかはデフォルトだとむずい
- expo-updateを使えばなんとかなるかも
- サーバー側にアップデートして良いバージョンみたいなのを記載
- Updates.checkForUpdateAsyncで返ってくるmanifestを検証し、上記サーバーの条件に合致してればfetchUpdateAsync。
no-publishオプションについて
no-publish時にどのpublishが利用されるかは微妙に不明?release-channel併せなのかどうか?
- どうやらrelease-channel依存っぽい。release-channelさえ併せてれば大丈夫そうで、逆に対応のrelease-channelにpublishが存在しないとコケるっぽい
結論:
- ⭐ビルドにno-publishはつけるべき(まずはこれが大事)
- defaultチャネル自体のpublishが怖いというよりビルドのチャネルが合わされるのが問題
- ビルドがno-publishになるならrelease-channelはproductionなどで固定されるべき?せいぜいバージョン分離はしてもいいのかも?
publishしたとき
- buildは必ずplatformが紐づく
- expo publishをしたときはどうやらiosとandroidそれぞれにビルドが生成される
- publish-idが別になる。ちょっと厄介っちゃ厄介
結局jqでパースするのが妥当かも
$ expo publish:history -p ios --raw --count 1 | jq -r ".queryResult[0].publicationId"
publish:set
release-channel=edgeにおける最新のビルドをrelease-channel=productionに切り替えするならコマンドはこうなるはず
$ expo publish:set \
--release-channel=production \
--publish-id=$(\
expo publish:history \
-p ios --raw --count 1
--release-channel=edge \
| jq -r ".queryResult[0].publicationId"
)
このあとexpo publish:history --release-channel=production
を実行すると切り替えされていることが確認できるはず
jq類似
-
https://github.com/blgm/jfq
yarn jfq "queryResult[0].publicationId"
-
https://github.com/fgribreau/jq.node
yarn jqn 'get("queryResult.0.publicationId")'
-
https://docs.expo.dev/versions/latest/sdk/updates/#updatesmanifest
- 現在走っているpublicationIdこれで取れるかも?
- https://docs.expo.dev/guides/how-expo-works/#expo-manifest
- と思ったがmanifestには含まれなさそう。git shaをapp.jsonに入れるしか無い?
まとめ(随時更新)
- buildには必ず
--no-publish
- CI上ではbuild前に意図的にpublishフェーズを挟まない
- publish関連は人手で行うとする
- publishは本番ビルド以外のチャネルへ投げる
- publish:setでリリースを切り替える
各ID
- publicationId
- publishした単位
- publish:historyで確認可能
- manifestに無い?
- revisionId
- publishごとに変わる?
- manifestにある
- publish:detailsで確認可能
- updateId
- =releaseId?
- アップデートごとに変わる?
- manifestにある
- bundleKey
- =hash
- publish:detailで確認可能
結局app.config.jsにgit_revisionをextraへ突っ込んでそれを使うのが良さそう?
rollback
yarn expo publish:rollback -c チャネル名 -p ios -s 42.0.0
- 単純に一個前に戻す
- 二回行うと戻る(戻せるのは一個前まで)
- SDKバージョンを指定するのが若干難儀かも
このスクラップは2021/09/23にクローズされました