Closed16

expoのOTAをどうやったらうまく扱えるか考える

terrierscriptterrierscript
  • expoのOTA、割と普通に使うとむずい

制約とか

  • ビルド時にpublishが必要
  • ビルド時にrelease-channelを一つ決める必要がある
    • ビルドに対するrelease-channelは一つしか決められない
  • デフォルトではビルド時にpublishをしてしまう
  • =うっかりリリースしてしまいがちな環境になる

使えそうなもの

  • --no-publishオプションをビルドに付与することが可能
  • expo publish:setでpublish-idとrelease-channelの紐付けみたいなことができそう
  • expo publish:detailで情報が取れる。--rawで生情報も取れる
  • expo publish:historyで一覧が取れる
terrierscriptterrierscript

カナリアリリース

  • checkAutomaticallyでの選択はON_LOAD or ON_ERROR_RECOVERY。結構単位が大きい
  • 単純にいうと「まず一部のユーザーで試してうまくいきそうなら全ユーザー」とかはデフォルトだとむずい
  • expo-updateを使えばなんとかなるかも
  1. サーバー側にアップデートして良いバージョンみたいなのを記載
  2. Updates.checkForUpdateAsyncで返ってくるmanifestを検証し、上記サーバーの条件に合致してればfetchUpdateAsync。
terrierscriptterrierscript

no-publishオプションについて

no-publish時にどのpublishが利用されるかは微妙に不明?release-channel併せなのかどうか?

  • どうやらrelease-channel依存っぽい。release-channelさえ併せてれば大丈夫そうで、逆に対応のrelease-channelにpublishが存在しないとコケるっぽい
terrierscriptterrierscript

結論:

  • ⭐ビルドにno-publishはつけるべき(まずはこれが大事)
  • defaultチャネル自体のpublishが怖いというよりビルドのチャネルが合わされるのが問題
  • ビルドがno-publishになるならrelease-channelはproductionなどで固定されるべき?せいぜいバージョン分離はしてもいいのかも?
terrierscriptterrierscript

publishしたとき

  • buildは必ずplatformが紐づく
  • expo publishをしたときはどうやらiosとandroidそれぞれにビルドが生成される
    • publish-idが別になる。ちょっと厄介っちゃ厄介
terrierscriptterrierscript

結局jqでパースするのが妥当かも

$ expo publish:history -p ios --raw --count 1 | jq -r ".queryResult[0].publicationId"
terrierscriptterrierscript

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を実行すると切り替えされていることが確認できるはず

terrierscriptterrierscript

まとめ(随時更新)

  • buildには必ず--no-publish
  • CI上ではbuild前に意図的にpublishフェーズを挟まない
    • publish関連は人手で行うとする
  • publishは本番ビルド以外のチャネルへ投げる
  • publish:setでリリースを切り替える
terrierscriptterrierscript

各ID

  • publicationId
    • publishした単位
    • publish:historyで確認可能
    • manifestに無い?
  • revisionId
    • publishごとに変わる?
    • manifestにある
    • publish:detailsで確認可能
  • updateId
    • =releaseId?
    • アップデートごとに変わる?
    • manifestにある
  • bundleKey
    • =hash
    • publish:detailで確認可能
terrierscriptterrierscript

結局app.config.jsにgit_revisionをextraへ突っ込んでそれを使うのが良さそう?

terrierscriptterrierscript

rollback

yarn expo publish:rollback -c チャネル名 -p ios -s 42.0.0

  • 単純に一個前に戻す
  • 二回行うと戻る(戻せるのは一個前まで)
  • SDKバージョンを指定するのが若干難儀かも
このスクラップは2021/09/23にクローズされました