EAS Buildを使用してReact Nativeアプリをビルドする場合、ExpoのContinuous Native Generation(CNG)は、ローカルとEASのビルドサーバーの両方で、expo prebuildステップごとにandroid/およびios/フォルダーをゼロから再生成します。つまり、手動で追加したnewrelic.propertiesファイルや、手作業で追加したXcodeのRun Scriptビルドフェーズは、次のビルドで消去されます。
newrelic-react-native-agentの設定プラグインは、プレビルドのたびにNew Relicのビルド設定を再生成することでこの問題を解決します。これにより、Androidのマッピングファイルとソースマップのアップロード、およびiOSのdSYMとソースマップのアップロードが、EASビルド全体で引き続き機能するようになります。プラグインはビルド時に環境変数から認証情報を読み取り、リポジトリにコミットすることはありません。
ヒント
このページでは、「Expoとの統合」で説明されているように、React Nativeエージェントをすでにインストールし、app.jsonまたはapp.config.jsに設定プラグインを追加していることを前提としています。これには最新バージョンのnewrelic-react-native-agentが必要です — 以下のプラグインオプションがまだ利用できない場合は、パッケージのGitHubリリースを確認してください。
あなたが始める前に
同じNew Relicアカウントから以下を取得します:
- ユーザーAPIキー。
- Androidおよび/またはiOSのアプリケーション・トークン(
NewRelic.startAgent()に渡すトークンと同じものです)。両方のプラットフォームにリリースする場合は、プラットフォームごとに1つのトークンが必要です。
EAS環境変数を設定します
ユーザーAPIキーとアプリケーショントークンを、ビルドする環境をスコープとして、EAS環境変数として登録します:
$eas env:create --environment production --name NEWRELIC_USER_API_KEY --value <YOUR_USER_API_KEY> --visibility sensitive$eas env:create --environment production --name NEWRELIC_ANDROID_APP_TOKEN --value <YOUR_ANDROID_APP_TOKEN> --visibility sensitive$eas env:create --environment production --name NEWRELIC_IOS_APP_TOKEN --value <YOUR_IOS_APP_TOKEN> --visibility sensitive重要
--visibility secretは使用しないでください。EASは独自の認証情報システム用にシークレット可視性変数を予約しているため、EASがそれらをprocess.envとしてビルドスクリプトに公開することはありません — 設定プラグインはそれらを認識せず、AndroidプロパティファイルやiOSビルドフェーズの認証情報の書き込みを暗黙のうちにスキップします。代わりに、plaintextまたはsensitiveを使用してください。
EAS Buildは、ビルドがEASのサーバーで実行されるか、eas build --localを使用してローカルで実行されるかにかかわらず、prebuildを実行する前にplaintext/sensitive変数を解決します。
Android:マッピングファイルとソースマップの自動アップロード
追加の設定を行わない場合、プラグインはNEWRELIC_USER_API_KEYからユーザーAPIキーを、NEWRELIC_ANDROID_APP_TOKENからAndroidアプリケーショントークンを読み取り、プレビルドのたびにそれらをandroid/app/newrelic.propertiesに書き込みます:
{ "name": "my app", "plugins": ["newrelic-react-native-agent"]}これらのプロパティは、各リリースビルド後にProGuard/R8マッピングファイルとReact Nativeソースマップのアップロードを認証するために、エージェントのnewrelicMapUploadReleaseおよびnewrelicReactNativeSourceMapUploadRelease Gradleタスクが読み取るものです。このアップロードの仕組み(および必要に応じて手動でアップロードする方法)の詳細については、React Native JavaScriptエラーレポートをご覧ください。
2つの環境変数のうち1つだけが設定されている場合、プラグインは引き続きその単一のプロパティを書き込み、Gradleタスクはビルドを失敗させるのではなく、どちらが欠落しているかをログに記録します。どちらも設定されていない場合、プラグインはnewrelic.propertiesを変更せず、両方のタスクはログメッセージを出力してアップロードをスキップします。
カスタム環境変数名の使用(Android)
異なる名前の環境変数からキーとトークンを取得するには、それらを明示的に渡します:
{ "name": "my app", "plugins": [ [ "newrelic-react-native-agent", { "android": { "apiKeyEnvName": "MY_NR_USER_API_KEY", "appTokenEnvName": "MY_NR_ANDROID_APP_TOKEN" } } ] ]}iOS:dSYMとソースマップの自動アップロード
Androidとは異なり、dSYMおよびReact Nativeのソースマップ・アップロード・スクリプト(dsym-upload-toolsフォルダーのrun-symbol-toolおよびupload-react-native-sourcemap)はNewRelicAgent CocoaPod内に同梱されておらず、通常はXcodeで手動で追加されたRun Scriptビルド・フェーズを必要とします — これはexpo prebuildがios/を再生成する際には保持されません。代わりに、プレビルドのたびにプラグインは以下を行います:
- 両方のスクリプトを
ios/dsym-upload-toolsにコピーします。 - ビルド時に環境変数から認証情報を読み取り、それらを呼び出す「Upload dSYMs and Source Maps to New Relic」という名前のRun Scriptビルドフェーズを(「Bundle React Native code and images」の後に)追加します — 生成されたスクリプトは名前で認証情報を参照するだけで、ファイルに書き込むことはありません。
- Expoのデフォルトテンプレートでは設定されておらず、そうしないとExpoがソースマップを生成しないため、「Bundle React Native code and images」フェーズが
SOURCEMAP_FILEをエクスポートするようにします。
追加の設定を行わない場合、ビルドフェーズはiOSアプリケーショントークンをNEWRELIC_IOS_APP_TOKENから、ユーザーAPIキーをNEWRELIC_USER_API_KEYから読み取ります(Androidのデフォルトと共有):
{ "name": "my app", "plugins": ["newrelic-react-native-agent"]}これらのスクリプトの機能や、Expo外でのdSYMアップロードの仕組みに関する背景情報については、dSYMのアップロードをご覧ください。
ヒント
両方のスクリプトはReleaseビルドに対してのみ実行され、デフォルトではシミュレータービルドをスキップします。シミュレーターでソースマップのアップロードパスをテストするには、NEWRELIC_SOURCEMAP_ALLOW_SIMULATOR=trueを設定します。
カスタム環境変数名の使用(iOS)
異なる名前の環境変数からトークンとキーを取得するには、それらを明示的に渡します:
{ "name": "my app", "plugins": [ [ "newrelic-react-native-agent", { "ios": { "appTokenEnvName": "MY_NR_IOS_APP_TOKEN", "apiKeyEnvName": "MY_NR_USER_API_KEY" } } ] ]}アップロードの検証
EASビルドを実行した後、各プラットフォームのビルドログを確認してください:
- Android:ログ内の
newrelicMapUploadReleaseおよびnewrelicReactNativeSourceMapUploadReleaseGradleタスクを探します。正常に実行されると、マッピングファイルとソースマップが検出およびアップロードされたことが報告され、missing-config警告は表示されません。 - iOS:「Upload dSYMs and Source Maps to New Relic」の実行スクリプトステップを探します。認証情報が欠落している場合、ビルドを失敗させるのではなく、どの認証情報が欠落しているかをログに記録し、そのアップロードをスキップします(例:
NEWRELIC_IOS_APP_TOKEN not set, skipping...)。認証情報が存在する場合、dSYMとソースマップを処理し、それらをNew Relicにアップロードしていることをログに記録します。
ビルドが成功したら、「React Nativeソースマップの一覧表示と削除」を参照して、ソースマップが実際にNew Relicに送信されたことを確認してください。