अपने ऐप्लिकेशन को डिप्लॉय करने की जांच स्थानीय तौर पर करना

एम्युलेटर का इस्तेमाल करके, अपने ऐप्लिकेशन को डिप्लॉयमेंट से पहले, उसकी लोकल टेस्टिंग की जा सकती है. एम्युलेटर, Firebase Local Emulator Suite का हिस्सा है.App HostingApp Hosting

App Hosting एम्युलेटर का इस्तेमाल करने से पहले, पक्का करें कि आपको Firebase Local Emulator Suite वर्कफ़्लो के पूरे वर्कफ़्लो के बारे में पता हो. साथ ही, आपने Local Emulator Suite को इंस्टॉल और कॉन्फ़िगर किया हो. इसके अलावा, आपने इसके सीएलआई कमांड की समीक्षा की हो.

इस विषय में यह मान लिया गया है कि आपको App Hosting के बारे में पहले से पता है. अगर ज़रूरत हो, तो App Hosting परिचय और अन्य संसाधनों की समीक्षा करें. इससे आपको यह समझने में मदद मिलेगी कि कैसे App Hosting काम करता है.

App Hosting एम्युलेटर से क्या किया जा सकता है?

App Hosting एम्युलेटर की मदद से, वेब ऐप्लिकेशन की लोकल टेस्टिंग की जा सकती है और उन्हें बेहतर बनाया जा सकता है. इससे, डेवलपमेंट की प्रोसेस को बेहतर बनाया जा सकता है. साथ ही, Firebase का इस्तेमाल करके बनाए गए और App Hosting पर डिप्लॉय किए गए वेब ऐप्लिकेशन की क्वालिटी को बेहतर किया जा सकता है.

App Hosting एम्युलेटर की मदद से:

  1. apphosting.yaml कॉन्फ़िगरेशन फ़ाइलों में तय किए गए एनवायरमेंट वैरिएबल और सीक्रेट के साथ, वेब ऐप्लिकेशन को स्थानीय तौर पर चलाया जा सकता है.
  2. apphosting.emulator.yaml फ़ाइल की मदद से, एम्युलेटर में इस्तेमाल के लिए एनवायरमेंट वैरिएबल और सीक्रेट को बदला जा सकता है.
  3. Firebase के अन्य एम्युलेटर के साथ इसका इस्तेमाल किया जा सकता है. अगर Firestore, Auth या किसी अन्य एम्युलेटर का इस्तेमाल किया जा रहा है, तो Local Emulator Suite यह पक्का करता है कि App Hosting एम्युलेटर से पहले ये एम्युलेटर शुरू हों.

एम्युलेटर को कॉन्फ़िगर करना

शुरू करने के लिए, Local Emulator Suite को इंस्टॉल करें और उसे शुरू करें. इसके लिए, Local Emulator Suite को इंस्टॉल, कॉन्फ़िगर, और इंटिग्रेट करना लेख में दिया गया तरीका अपनाएं. Firebase के अन्य एम्युलेटर सेट अप करने के अलावा, पक्का करें कि आपने App Hosting Emulator को चुना हो. सीएलआई, कुछ App Hosting एम्युलेटर वैल्यू के बारे में आपसे पूछता है. इनमें ये शामिल हैं:

firebase init emulators
=== Emulators Setup
? Which Firebase emulators do you want to set up? Press Space to select emulators, then Enter to confirm your choices. (Press
<space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
❯◯ App Hosting Emulator
 ◯ Firestore Emulator
 ◯ Database Emulator
 ◯ Hosting Emulator
 ◯ Pub/Sub Emulator
 ◯ Storage Emulator
 ◯ Eventarc Emulator
(Move up and down to reveal more choices)

? Specify your app's root directory relative to your project (./)

? The App Hosting emulator uses a file called apphosting.emulator.yaml to
override values in apphosting.yaml for local testing. This codebase does not
have one, would you like to create it? (Y/n)

? Which environment variables would you like to override? (Press <space> to
select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
❯◯ MEMCACHE_ADDR
 ◯ API_KEY

? What new value would you like for plaintext MEMCACHE_ADDR?

? What would you like to name the secret reference for API_KEY? (test-api-key)

? What new value would you like for secret TESTKEY [input is hidden]? [input is hidden]

? Your config has secret values. Please provide a comma-separated list of users
or groups who should have access to secrets for local development:

✔  Successfully set IAM bindings on secret test-api-key.

सेटअप के इस फ़्लो में दी गई वैल्यू का इस्तेमाल, आपके App Hosting एम्युलेटर के कॉन्फ़िगरेशन को firebase.json में अपडेट करने के लिए किया जाता है. firebase.json को सीधे अपडेट करके भी, App Hosting एम्युलेटर को कॉन्फ़िगर किया जा सकता है. App Hosting एम्युलेटर का स्कीमा यह है:

{
  ...
  "emulators": {
    "apphosting": {
      "startCommand": <command> [optional]
      "rootDirectory": <path> [optional]
      }
    }
  }
  • एम्युलेटर के शुरू होने पर, startCommand अपने-आप जनरेट और सेट हो जाता है. अगर यह उपलब्ध नहीं है, तो एम्युलेटर आपके पैकेज मैनेजर के डेवलपमेंट कमांड का पता लगाएगा और उसे चलाएगा.
  • rootDirectory का इस्तेमाल, मोनोरिपो प्रोजेक्ट सेटअप के लिए किया जाता है. अगर आपका वेब ऐप्लिकेशन किसी सबडायरेक्ट्री में है, तो आपको रूट के हिसाब से उस डायरेक्ट्री का पाथ देना होगा. रूट, firebase.json की जगह होती है.

एम्युलेशन मैनेज करना

एम्युलेटर के शुरू होने पर, आपके ऐप्लिकेशन की रूट डायरेक्ट्री में apphosting.emulator.yaml फ़ाइल बन जाती है. इस कॉन्फ़िगरेशन फ़ाइल का स्कीमा, apphosting.yaml फ़ाइल के जैसा ही होता है जिसका इस्तेमाल प्रोडक्शन में किया जाता है. हालांकि, इसका इस्तेमाल सिर्फ़ लोकल डेवलपमेंट के लिए किया जाता है. डिफ़ॉल्ट रूप से, एम्युलेटर आपके apphosting.yaml फ़ाइल से कॉन्फ़िगरेशन पढ़ता है. हालांकि, अगर apphosting.emulator.yaml फ़ाइल मौजूद है, तो उस फ़ाइल में मौजूद कॉन्फ़िगरेशन को प्राथमिकता दी जाती है.

apphosting.emulator.yaml फ़ाइल को कमिट और सहकर्मियों के साथ शेयर किया जा सकता है. यह पक्का करने के लिए कि आपसे सोर्स रिपॉज़िटरी में गलती से संवेदनशील डेटा कमिट न हो जाए, apphosting.yaml में कोई भी एनवायरमेंट वैरिएबल, apphosting.emulator.yaml में भी सीक्रेट होना चाहिए. अगर किसी सीक्रेट को प्रोडक्शन और लोकल डेवलपमेंट के बीच बदलने की ज़रूरत नहीं है (जैसे, किसी Gemini API कुंजी), तो उसे apphosting.emulator.yaml में जोड़ने की ज़रूरत नहीं है. इसके बजाय, अपनी टीम को सीक्रेट का ऐक्सेस दें.

अगर आपके ऐप्लिकेशन में कई सीक्रेट इस्तेमाल किए जाते हैं (उदाहरण के लिए, तीन अलग-अलग सेवाओं के लिए एपीआई कुंजियां, जिनमें प्रोडक्शन, स्टेजिंग, और लोकल डेवलपमेंट के लिए अलग-अलग वैल्यू हैं), तो हो सकता है कि Cloud Secret Manager का मुफ़्त टियर खत्म हो जाए. इसके बाद, आपको हर महीने हर अतिरिक्त सीक्रेट के लिए 0.06 डॉलर चुकाने पड़ सकते हैं. अगर आपको इस शुल्क से बचने के लिए, सोर्स कंट्रोल के बाहर लोकल कॉन्फ़िगरेशन मैनेज करना है, तो पुराने apphosting.local.yaml फ़ाइल का इस्तेमाल किया जा सकता है. apphosting.emulator.yaml के उलट, इस फ़ाइल में उन एनवायरमेंट वैरिएबल के लिए, सादे टेक्स्ट वाली वैल्यू दी जा सकती हैं जो apphosting.yaml में सीक्रेट वैल्यू हैं.

apphosting.local.yaml

उपयोगकर्ताओं या ग्रुप को सीक्रेट का ऐक्सेस देना

एम्युलेटर के शुरू होने पर, apphosting.emulator.yaml में सेव किए गए सीक्रेट पढ़े जाते हैं. इसका मतलब है कि आपकी डेवलपमेंट टीम को सीक्रेट का ऐक्सेस चाहिए. किसी उपयोगकर्ता या ग्रुप को ईमेल से सीक्रेट का ऐक्सेस देने के लिए, apphosting:secrets:grantaccess कमांड का इस्तेमाल किया जा सकता है.

firebase apphosting:secrets:grantaccess test-api-key --emails my-team@my-company.com

जहां लागू हो वहां apphosting.emulator.yaml में, सिर्फ़ टेस्ट के लिए इस्तेमाल की जाने वाली कुंजियों का इस्तेमाल करने पर विचार करें. इनके पास प्रोडक्शन डेटा का ऐक्सेस नहीं होता. साथ ही, इनसे ग्लोबल साइड इफ़ेक्ट (ईमेल भेजना, क्रेडिट कार्ड से शुल्क लेना) नहीं हो सकते और/या इनके पास कम कोटा होता है. इससे यह पक्का करने में मदद मिलती है कि समीक्षा नहीं किए गए कोड के असल दुनिया में कम नतीजे हों.

अलग-अलग उपयोगकर्ताओं को ऐक्सेस देने के बजाय, सीक्रेट के ऐक्सेस को मैनेज करने के लिए Google Groups का इस्तेमाल करने पर विचार करें. इससे, आपकी डेवलपर टीम में नए सदस्यों को शामिल करना आसान हो जाएगा, क्योंकि उन्हें ग्रुप में जोड़ने से, उन्हें उन सभी सीक्रेट का ऐक्सेस मिल जाएगा जिनकी उन्हें ज़रूरत है. हो सकता है कि आपके पास पहले से कोई ऐसा ग्रुप हो जिसमें डेवलपर एक-दूसरे से बातचीत करते हों. Google Groups से ऐक्सेस कंट्रोल करने से यह भी पक्का करने में मदद मिलती है कि आपकी टीम छोड़ने वाले डेवलपर को ईमेल ग्रुप से हटाने पर, उन्हें सभी सीक्रेट का ऐक्सेस न मिले. हालांकि, अगर सीक्रेट के पास प्रोडक्शन डेटा का ऐक्सेस है या असल दुनिया में साइड इफ़ेक्ट हैं, तो हो सकता है कि आपको अपनी कुंजी को रोटेट करना पड़े और firebase apphosting:secrets:set की मदद से उसे नई वैल्यू देनी पड़े.

एम्युलेटर चलाना

firebase emulators:start

इससे, आपकी firebase.json फ़ाइल में तय किए गए सभी एम्युलेटर शुरू हो जाएंगे. इनमें App Hosting एम्युलेटर भी शामिल है.

Angular ऐप्लिकेशन के लिए, start कमांड को कॉन्फ़िगर करना

अगर एम्युलेटर का start कमांड टाइम आउट हो जाता है, तो ऐसा इसलिए हो सकता है, क्योंकि Angular डेवलपमेंट सर्वर आपके ऐप्लिकेशन को उस पोर्ट पर सर्व कर रहा है जिसकी उम्मीद App Hosting एम्युलेटर को है. firebase.json में कुछ अतिरिक्त कॉन्फ़िगरेशन जोड़कर, इस समस्या को हल किया जा सकता है:

  • emulators.apphosting.startCommand को ng serve पर सेट करें.
  • डिफ़ॉल्ट पोर्ट के अलावा किसी दूसरे पोर्ट का इस्तेमाल करने के लिए, उसे emulators.apphosting.port के साथ सेट करें. इसके लिए, emulators.apphosting.startCommand में ng serve में --port फ़्लैग जोड़ने के बजाय, ऐसा करें.

उदाहरण के लिए:

"emulators": {
    "apphosting": {
      "port": 5002,
      "rootDirectory": "./test-app",
      "startCommand": "ng serve"
    },
    "ui": {
      "enabled": true
    },
    ...
  }