この記事は「もくもく会ブログリレー」 22日目 の記事です。

※この記事は2024年7月17日時点での情報です。今後のExpoアップデートにより事情が変わる可能性があります。

Expo 50以上からSentryライブラリーが変わった

Expo changelog SDK50にもあるとおりExpo50にてsentry-expoから @sentry/react-nativeに変わりました。

この変更により、Sentryの環境別の設定方法が少し複雑になります。

今回はそのやり方をご紹介します。

問題点

一般的に環境は「develop, staging, production」の3つ以上が存在すると思いますが、Expoの公式ドキュメント通りに設定を進めると一つの環境にしか設定できないことに気付くと思います。

その課題となるのがここです。

Next, in an environment where you want to create releases and upload sourcemaps to Sentry, you will need to set the SENTRY_AUTH_TOKEN environment variable to your Sentry auth token. If you are using EAS Build, you can set the environment variable by creating a secret named SENTRY_AUTH_TOKEN.

シークレット環境変数名をSENTRY_AUTH_TOKENとしなければならず、下記2つの問題が生じます。

  1. このSENTRY_AUTH_TOKENはEAS Buildの時に読み込まれる
  2. SENTRY_AUTH_TOKEN以外の命名で読み込ませる設定が純正では無い

環境別に構築することを考えた場合には、これは大きな課題となりました。

環境別の設定方法

ですがこの課題を解決するのが我々エンジニアです。

ExpoにはEAS Buildを行うときにBuild lifecycle hooksというのがあり、ビルドプロセスの途中でnpm scriptを実行させることができます。

今回はその内の一つeas-build-pre-installを利用します。

このスクリプトはEAS Buildがnpm installを走らせる前に実行されます。

まずpackage.jsonのscriptsに下記を追加しましょう。

"scripts": {
"eas-build-pre-install": "bash ./pre-install"
}

そしたら下記コマンドを実行し、pre-installファイルを作成します。

touch pre-install

このpre-installはbashファイルとし、下記のコードを書いてください。

#!/bin/bash

function log() {
echo "[LOG]: $1"
}

# set-envコマンドはexpoサーバーで使用可能なコマンド、環境変数を宣言している
# https://docs.expo.dev/build-reference/variables/#for-use-by-other-build-steps
function setSentryAuthToken() {
log "Set setnry auth token."
set-env SENTRY_AUTH_TOKEN $1
}

log "This build is for ${EAS_BUILD_PLATFORM} platform."

if [ "$EAS_BUILD_PROFILE" == "production" ]; then
log "Scope prod, EAS_BUILD_PROFILE is ${EAS_BUILD_PROFILE}."

setSentryAuthToken "$SENTRY_AUTH_TOKEN_PRODUCTION"

elif [ "$EAS_BUILD_PROFILE" == "staging" ]; then
log "Scope stg, EAS_BUILD_PROFILE is ${EAS_BUILD_PROFILE}."

setSentryAuthToken "$SENTRY_AUTH_TOKEN_STAGING"
else
log "Scope dev, EAS_BUILD_PROFILE is ${EAS_BUILD_PROFILE}."

setSentryAuthToken "$SENTRY_AUTH_TOKEN_DEVELOP"
fi

bashに慣れてる人であればもう察しが付いた思いますが、ビルドが始まる前に環境別にシークレット環境変数を取得し、SENTRY_AUTH_TOKENへ代入してしまう作戦です。
EAS_BUILD_PROFILEはeas.jsonで設定したprofile名を取得することができ、ここの公式ドキュメントにもありますが、組込み環境変数やシークレット環境変数には先頭に$を付けることで取得することが可能です。

また、上手く動いてるか確認するためにlog関数も作ってESA Buildのログで確認できるようにしています。

これで問題なく環境別にSentryを設定することが出来ます!

まとめ

  • Build lifecycle hooksは凄く便利で、Sentry以外にも用途はありそう。
  • 他にもっと良いやり方をご存知の方は是非アイレットに入社して教えてください。

明日の記事は、前野さんの「Amazon Transcribe ハンズオン試してみた」です。