ফায়ারবেস এক্সটেনশনগুলিকে একটি স্ব-নির্মিত ফাংশন কিটে স্থানান্তর করুন

মাইগ্রেশন পথ নির্বাচন করুন: npm-এ ফাংশন কিটে স্থানান্তরিত হন নিজের তৈরি ফাংশন কিটে স্থানান্তরিত হন

যদি কোনো প্রকাশক npm-এ বিতরণ করা কোনো আনুষ্ঠানিক বিকল্প কিট তৈরি না করে থাকে, তাহলে এই নির্দেশিকাটি আপনাকে তাদের এক্সটেনশনটি ফোর্ক করে সেটিকে একটি স্থানীয় ফাংশন কিট হিসেবে সেট আপ করার ধাপগুলো দেখিয়ে দেবে।

পরিচিত মাইগ্রেশন সীমাবদ্ধতাগুলি পরীক্ষা করুন

একটি এক্সটেনশন ইনস্ট্যান্স মাইগ্রেট করা শুরু করার আগে, যাচাই করে নিন আপনার সেটআপে নিম্নলিখিত কোনো ফিচার ব্যবহৃত হচ্ছে কিনা, যেগুলোর জন্য বিকল্প পদ্ধতির প্রয়োজন অথবা যা এখনও ফাংশন কিটগুলিতে সমর্থিত নয়:

  • কাস্টম ডকার রিপোজিটরি এবং কেএমএস কী-এর জন্য একটি ম্যানুয়াল সমাধান প্রয়োজন। Cloud Functions for Firebase কাস্টম ডকার রিপোজিটরি বা কাস্টমার-ম্যানেজড এনক্রিপশন কী (কেএমএস কী) কনফিগার করার জন্য রিপ্লেসমেন্ট সিস্টেম প্যারামিটার সমর্থন করে না। যদি আপনার এক্সটেনশন এই প্যারামিটারগুলোর কোনোটি কনফিগার করে, তবে প্রায়শই জিজ্ঞাসিত প্রশ্নাবলীর (FAQ) সমাধানটি দেখুন।

শুরু করার আগে

আপনাকে Firebase CLI সেট আপ করতে হবে এবং একটি Firebase প্রজেক্ট ইনিশিয়ালাইজ করতে হবে । CLI ব্যবহার করার সময়, নিশ্চিত করুন যে আপনি firebase-tools ভার্সন >= 15.32.0 ব্যবহার করছেন, যেটিতে নতুন মাইগ্রেশন এবং ফাংশন কিট কমান্ডগুলো রয়েছে।

প্রয়োজনীয় অ্যাকাউন্ট অনুমতি এবং ভূমিকা

মাইগ্রেশনের সময় Firebase CLI দ্বারা কী তৈরি এবং কনফিগার করতে হবে তার উপর নির্ভর করে, Firebase এবং Google Cloud সাথে প্রমাণীকরণের জন্য আপনি যে অ্যাকাউন্টটি ব্যবহার করছেন সেটিতে নিম্নলিখিত ভূমিকাগুলি (role) অবশ্যই থাকতে হবে:

  • roles/firebaseextensions.editor
  • roles/cloudbuild.builds.editor
  • roles/artifactregistry.writer
  • roles/run.developer
  • roles/iam.serviceAccountUser
  • roles/iam.serviceAccountCreator
  • roles/cloudfunctions.admin (যদি পাবলিক এন্ডপয়েন্টগুলির জন্য setIamPermissions ব্যবহার করার প্রয়োজন হয়)
  • roles/secretmanager.admin (যদি সিক্রেটস ব্যবহার করা হয়)
  • roles/serviceusage.serviceUsageAdmin (যদি আপনার নতুন API সক্রিয় করার প্রয়োজন হয়)

আমরা এমন একটি অ্যাকাউন্ট ব্যবহার করার পরামর্শ দিই যা দিয়ে আগে এক্সটেনশন ইনস্টল করা হয়েছে এবং ফাংশন ডেপ্লয় করা হয়েছে, কারণ সেক্ষেত্রে এই অনুমতিগুলোর বেশিরভাগই আগে থেকেই দেওয়া থাকবে। আপনার মাইগ্রেট করা অ্যাকাউন্টের যদি আরও রোলের প্রয়োজন হয়, তবে সেগুলো যোগ করার জন্য Google Cloud IAM-এর নির্দেশাবলী অনুসরণ করুন।

আপনার এক্সটেনশন ইনস্ট্যান্সটি সর্বশেষ সংস্করণে আপগ্রেড করুন।

আপনার এক্সটেনশন ইনস্ট্যান্স এবং এর প্রতিস্থাপন কিটের মধ্যে পার্থক্য কমানোর জন্য আপনাকে অবশ্যই আপনার এক্সটেনশনটি সর্বশেষ সংস্করণে আপডেট করতে হবে । যদি আপনার এক্সটেনশন আপগ্রেড করা না হয়, তবে আপনার এক্সটেনশন ইনস্ট্যান্স এবং এর প্রতিস্থাপন কিটের মধ্যে উল্লেখযোগ্য, সমস্যা সৃষ্টিকারী পরিবর্তন থাকতে পারে। বিভিন্ন সংস্করণে প্যারামিটারের পরিবর্তনের কারণে এক্সপোর্ট করা কনফিগারেশনটি কিটের প্রত্যাশিত কনফিগারেশনের সাথে নাও মিলতে পারে।

আপনার এক্সটেনশনটি কোথায় ইনস্টল করা হয়েছে তার উপর নির্ভর করে, এটি আপডেট করতে নিম্নলিখিত বিকল্পগুলির মধ্যে একটি ব্যবহার করুন:

  • Firebase কনসোল থেকে
  • Firebase CLI থেকে নিম্নলিখিত উপায়ে:
    • firebase ext:update <extension-instance-id> --project <project-id> firebase deploy --only extensions --project <project-id>

আপনি এই ধাপটি এড়িয়ে গেলে, আপনার এক্সটেনশনটি সর্বশেষ সংস্করণে না থাকলে কনফিগারেশন এক্সপোর্ট করার সময় CLI আপনাকে আপগ্রেড করার জন্য অনুরোধ করবে।

এক্সটেনশনটিকে একটি স্থানীয় ফাংশন কিটে ফর্ক করুন

কোনো এক্সটেনশনকে লোকাল ফাংশন কিটে রূপান্তর করা শুরু করার আগে, নিশ্চিত করুন যে এক্সটেনশনটির সোর্স কোড আপনার Firebase প্রজেক্টের মধ্যে রয়েছে। এটি করার জন্য, গিটহাব থেকে এক্সটেনশন রিপোজিটরিটি ক্লোন করুন, আপনার Firebase প্রজেক্ট রুটের ভিতরে একটি ডিরেক্টরি তৈরি করুন, এবং এক্সটেনশনটির functions/ ফোল্ডার ও extension.yaml ফাইলটি তার মধ্যে কপি করুন:

mkdir -p path/to/kit
cp -r /path/to/extension-source/functions/* path/to/kit/
cp /path/to/extension-source/extension.yaml path/to/kit/.

আপনার এক্সটেনশন সোর্স কোডকে একটি ২য় প্রজন্মের ফাংশনে মাইগ্রেট করতে পাবলিশার মাইগ্রেশন গাইডের ১ থেকে ৮ নম্বর ধাপ অনুসরণ করুন। তারপর নিম্নলিখিত ধাপগুলো চালিয়ে যান।

আপনার স্থানীয় কিটকে এক্সপোর্ট করা ফাংশন অঞ্চল এবং উন্নত প্যারামিটার সমর্থন করার ব্যবস্থা করুন।

একটি লোকাল ফাংশন কিটে, Firebase CLI প্যাকেজটি সেট আপ করতে এবং মাইগ্রেটেড সিস্টেম প্যারামিটার ব্যবহার করার জন্য কনফিগার করতে কোনো index.ts ফাইল তৈরি করে না। আপনার এক্সটেনশনের জন্য কনফিগার করা ফাংশন রিজিয়ন এবং অ্যাডভান্সড প্যারামিটার ব্যবহার করতে, firebase ext:export --mode functions দ্বারা এক্সপোর্ট করা ফরম্যাটটি একটি এনভায়রনমেন্ট ভেরিয়েবল ফাইলে পড়ার জন্য আপনার index.ts ফাইলটি সেট আপ করুন।

বিশেষত, আপনার ফাংশনগুলো এক্সপোর্ট করে এমন শীর্ষ-স্তরের index.ts ফাইলে, FUNCTION_DEFAULT_REGION এর জন্য একটি প্যারামিটার সংজ্ঞায়িত করুন এবং EXT_MIGRATED_SYSTEM_<GLOBAL_OPTION> ফর্মের এনভায়রনমেন্ট ভেরিয়েবল সহ setGlobalOptions কল করুন, যা CLI দ্বারা ব্যবহৃত index-kit-migration.ts টেমপ্লেটের অনুরূপ:

import { setGlobalOptions } from "firebase-functions";
import { MemoryOption, VpcEgressSetting, IngressSetting } from "firebase-functions/v2/options";
import { defineString } from "firebase-functions/params";

export const regionParam = defineString("FUNCTION_DEFAULT_REGION", {
  input: { text: { nonEmpty: true } },
  description: "Global default region where functions should be deployed. Can be overridden per-function.",
});

setGlobalOptions({
  region: regionParam,
  memory: (process.env.EXT_MIGRATED_SYSTEM_MEMORY as MemoryOption) ?? undefined,
  timeoutSeconds: process.env.EXT_MIGRATED_SYSTEM_TIMEOUTSECONDS
    ? Number(process.env.EXT_MIGRATED_SYSTEM_TIMEOUTSECONDS)
    : undefined,
  vpcConnectorEgressSettings:
    process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS &&
    process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS !== "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"
      ? (process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS as VpcEgressSetting)
      : undefined,
  vpcConnector: process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOR ?? undefined,
  maxInstances: process.env.EXT_MIGRATED_SYSTEM_MAXINSTANCES
    ? Number(process.env.EXT_MIGRATED_SYSTEM_MAXINSTANCES)
    : undefined,
  minInstances: process.env.EXT_MIGRATED_SYSTEM_MININSTANCES
    ? Number(process.env.EXT_MIGRATED_SYSTEM_MININSTANCES)
    : undefined,
  ingressSettings: (process.env.EXT_MIGRATED_SYSTEM_INGRESSSETTINGS as IngressSetting) ?? undefined,
  // Parses a comma-separated string of key:value pairs into a key-value object
  // (for example, "key1:value1,key2:value2" -> { key1: "value1", key2: "value2" }).
  labels: process.env.EXT_MIGRATED_SYSTEM_LABELS
    ? process.env.EXT_MIGRATED_SYSTEM_LABELS.split(",").reduce<Record<string, string> | undefined>(
        (acc, curr) => {
          const [key, value] = curr.split(":");
          const trimmedKey = key?.trim();
          const trimmedValue = value?.trim();
          if (!trimmedKey || !trimmedValue) {
            return acc;
          }
          acc = acc ?? {};
          acc[trimmedKey] = trimmedValue;
          return acc;
        },
        undefined,
      )
    : undefined,
});

// Re-export all functions so the Firebase CLI can deploy them
export * from "./your-functions";

স্থানান্তরের আগে আপনার কিট পরীক্ষা করুন।

এখন আপনার কাছে একটি লোকাল ফাংশন কিট আছে, যা ডেপ্লয় করার পর আপনার এক্সটেনশনের একটি নতুন ইনস্টলেশনের মতোই আচরণ করে। পরবর্তী পদক্ষেপ হলো, আপনার প্রোডাকশন এক্সটেনশন ইনস্ট্যান্সগুলোকে এতে মাইগ্রেট করার আগে, এই প্রক্রিয়ায় দুর্ঘটনাবশত সৃষ্ট যেকোনো সমস্যা যাচাই করে সমাধান করা।

প্রথমে, আপনার ফর্কটিকে একটি লোকাল কিট হিসেবে যুক্ত করুন, কনফিগার করুন এবং একটি টেস্ট প্রজেক্টে ডেপ্লয় করুন। লোকাল ফাংশন কিট অবশ্যই আপনার Firebase প্রজেক্টের ভেতরে থাকতে হবে, তাই যদি ক্লোন করা এক্সটেনশন রিপোজিটরিটি আপনার Firebase প্রজেক্টের বাইরে থাকে, তবে সেটিকে প্রজেক্ট ডিরেক্টরির ভেতরে নিয়ে আসুন। এরপর, এটিকে লোকাল কিট হিসেবে ইনস্টল করতে নিম্নলিখিত কিট ইনস্টলেশন কমান্ডটি চালান:

firebase functions:kits:install --directory <path-to-your-fork> --project <test-project-id>

এই কমান্ডটি আপনাকে আপনার প্রথম টেস্ট ইনস্ট্যান্সের জন্য একটি কিট আইডি, একটি ইনস্ট্যান্স আইডি এবং একটি কনফিগারেশন বেছে নিতে সাহায্য করে। এরপর এটি আপনার firebase.json ফাইলটি পরিবর্তন করে আপনার ফোর্ক করা ডিরেক্টরিকে নির্দেশ করে একটি লোকাল কিট রেজিস্টার করে, যেখানে প্রতিটি ইনস্ট্যান্সের কনফিগারেশন function-kits/<kit-id>/config-<instance-id> -এ অবস্থিত একটি .env ফাইলে সংরক্ষিত থাকে।

এর আচরণ পরীক্ষা করার জন্য আপনার স্থানীয় কিটটিকে উপযুক্ত রিসোর্স সহ একটি টেস্ট প্রজেক্টে স্থাপন করুন। আপনার এক্সটেনশন পরীক্ষা করার জন্য যদি আগে থেকেই একটি টেস্ট প্রজেক্ট তৈরি করা থাকে, তাহলে নিম্নলিখিত কমান্ডটি চালান:

firebase deploy --only functions:<kit-instance-id> --project <test-project-id>

কার্যকারী উদাহরণ: Cloud Firestore থেকে BigQuery স্ট্রিম করুন ( firestore-bigquery-export )

Cloud Firestore থেকে BigQuery এন্ড-টু-এন্ড সিঙ্ক যাচাই করুন:

  1. Firebase কনসোলের Cloud Firestore পৃষ্ঠায়, আপনার সেট করা COLLECTION_PATH ( users ) কালেকশনটি তৈরি করুন, যদি সেটি আগে থেকে বিদ্যমান না থাকে।
  2. bigquery-mirror-test নামে একটি ডকুমেন্ট তৈরি করুন, যাতে যেকোনো ফিল্ডের যেকোনো মান থাকবে।
  3. Google Cloud কনসোলের BigQuery পেজে, raw changelog টেবিলটি কোয়েরি করুন। এতে ডকুমেন্ট তৈরির তথ্য সম্বলিত একটিমাত্র সারি থাকা উচিত:

    SELECT * FROM `PROJECT_ID.analytics.users_raw_changelog`
    
  4. সর্বশেষ ভিউটি কোয়েরি করুন, যা উপস্থিত একমাত্র ডকুমেন্টটির জন্য সর্বশেষ পরিবর্তন ইভেন্টটি ফেরত দেবে ( bigquery-mirror-test ):

    SELECT * FROM `PROJECT_ID.analytics.users_raw_latest`
    
  5. Cloud Firestore bigquery-mirror-test ডকুমেন্টটি ডিলিট করুন। এটি লেটেস্ট ভিউ থেকে অদৃশ্য হয়ে যাবে এবং র' চেঞ্জলগ টেবিলে একটি DELETE ইভেন্ট যুক্ত হবে।

    আপনি একটিমাত্র ডকুমেন্টের সম্পূর্ণ ইতিহাস নিম্নোক্ত উপায়ে দেখতে পারেন:

    SELECT *
       FROM `PROJECT_ID.analytics.users_raw_changelog`
       WHERE document_name = "bigquery-mirror-test"
       ORDER BY timestamp ASC
    

এক্সটেনশনটি পরীক্ষা করার ফলে প্রাপ্ত পার্থক্যসমূহ:

  • ট্রিগারটি kit-<kit-instance-id>-fsexportbigquery হিসেবে ডেপ্লয় হয়, ext-<instanceId>-fsexportbigquery নয়। Cloud Functions ড্যাশবোর্ড এবং লগ-এ এই নামটি খুঁজুন।
  • আপনার কোড Firebase Local Emulator Suite স্ট্যান্ডার্ড ফাংশন হিসেবে রান করে। আপনি .env.local ব্যবহার করে এমুলেটরে ব্যবহারের জন্য প্যারামিটারের মান নির্ধারণ করতে পারেন। এছাড়াও, Cloud Functions ইউনিট টেস্টিং -এ বর্ণিত পদ্ধতি অনুযায়ী আপনি firebase-functions-test SDK ব্যবহার করে আপনার কোডের ইউনিট টেস্ট করতে পারেন।
  • প্রোভিশনিং এখন আর এক্সটেনশনস রানটাইম দ্বারা চালিত হয় না। ডিপ্লয়ের পর যদি চেঞ্জলগ টেবিলটি অনুপস্থিত থাকে, তাহলে সেটআপ টাস্কটি ম্যানুয়ালি পুনরায় চালান: firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id> । টাস্কটি আইডম্পোটেন্ট, তাই এটি পুনরায় চালালে ডেটাসেট, টেবিল এবং ভিউগুলো রিকনসাইল হয়ে যায়।
  • প্যারামিটারের মানগুলো ইনস্টলেশন ফর্মের পরিবর্তে .env ফাইল থেকে আসে, তাই .env ফাইলের কাজ শেষ হয়ে গেলে firebase deploy পুনরায় চালালে তা আর ইন্টারেক্টিভ থাকে না।

(ঐচ্ছিক) পরীক্ষা শেষে পরিষ্করণ

পরীক্ষা করার পর যদি আপনি এই টেস্ট ইনস্ট্যান্সটি সরাতে চান, তবে এটি আনইনস্টল করুন:

firebase functions:kits:uninstall --instance <kit-instance-id> --project <test-project-id>

এটি কিটটি ডেপ্লয় করার মাধ্যমে তৈরি হওয়া সমস্ত ক্লাউড রিসোর্স এবং এর ইনস্ট্যান্স কনফিগারেশন মুছে দেয়। যদি আপনার কিটটির কেবল একটি ইনস্ট্যান্স থাকে, তবে এটি firebase.json থেকে কিট এন্ট্রিটিও মুছে দেয়। এটি আপনার লোকাল সোর্স কোড ডিরেক্টরি মুছে ফেলে না। আপনার প্রোডাকশন মাইগ্রেশনের জন্য যখন আপনি কিটটি ইনস্টল করবেন, তখন আপনি আবার একটি কিট আইডি বেছে নিতে পারবেন।

এক্সটেনশন থেকে আপনার স্থানীয় কিটে স্থানান্তরিত করুন

আপনার লোকাল কিট পরীক্ষা করা হয়ে গেলে, আপনি আপনার লাইভ ডেপ্লয় করা এক্সটেনশন ইনস্ট্যান্সটি মাইগ্রেট করতে পারেন।

১. প্রতিস্থাপন ফাংশন কিট ইনস্ট্যান্সটি ইনস্টল করুন

আপনার স্থানীয় ফাংশন কিট ইনস্টল করুন এবং ম্যানুয়াল কনফিগারেশন এড়িয়ে যেতে --no-configure পাস করুন, যাতে পরবর্তী ধাপে আপনার বিদ্যমান এক্সটেনশন কনফিগারেশন সরাসরি এই কিট ইনস্ট্যান্সে এক্সপোর্ট করা যায়:

firebase functions:kits:install --no-configure --directory <path-to-your-fork> --project <project-id>

২. এক্সটেনশনের অনুরূপভাবে ফাংশন কিট ইনস্ট্যান্সটি কনফিগার করুন।

যে এক্সটেনশনটিকে এটি প্রতিস্থাপন করছে, তার অনুরূপ একটি কনফিগারেশন দিয়ে আপনাকে এই কিট ইনস্ট্যান্সটি কাস্টমাইজ করতে হবে। আপনি আপনার এক্সটেনশন ইনস্ট্যান্স কনফিগারেশন একটি .env ফাইলে এক্সপোর্ট করতে পারেন, যা কিট সহ সমস্ত Cloud Functions জন্য প্যারামিটার, এনভায়রনমেন্ট ভেরিয়েবল এবং সিক্রেট রেফারেন্স কনফিগারেশন ডেটা সংরক্ষণ করে। এটিকে সরাসরি আপনার কিটের কনফিগারেশন ফাইলে এক্সপোর্ট করতে, চালান:

firebase ext:export --mode functions --instance <extension-instance-id> --kit-instance <kit-instance-id> --project <project-id>

এই ধাপের শেষে, এই ইনস্ট্যান্সের কনফিগারেশন তথ্য আপনার ইনস্ট্যান্স কনফিগ ডিরেক্টরিতে থাকা একটি প্রজেক্ট-নির্দিষ্ট .env ফাইলে সংরক্ষিত হয়, যেমন: function-kits/<kit-name>/config-<instance-id>/.env.<project-id>

৩. কিট প্রতিস্থাপন স্থাপন ও যাচাই করুন

এখন যেহেতু কিটটি ইনস্টল করা হয়েছে এবং ফাংশনের একটি সেট হিসাবে উপলব্ধ, আপনি কিট প্রতিস্থাপনটি ডেপ্লয় করতে পারেন। ফাংশন কিটগুলো সাধারণ ফাংশনের মতোই কাজ করে, যেখানে প্রতিটি কিট ইনস্ট্যান্স আপনার ফাংশনগুলোকে সংগঠিত করার জন্য একটি পৃথক কোডবেস হিসাবে কাজ করে। আপনি আপনার সমস্ত ফাংশন অথবা শুধু একটি নির্দিষ্ট কিট ইনস্ট্যান্স ডেপ্লয় করতে পারেন। একটিমাত্র এক্সটেনশন ইনস্ট্যান্স মাইগ্রেট করার সময়, শুধুমাত্র সেই কিট ইনস্ট্যান্সটিই ডেপ্লয় করুন।

আপনার কিট যদি এমন কোনো নতুন প্যারামিটার ব্যবহার করে যা আপনি যে এক্সটেনশন ইনস্ট্যান্স থেকে মাইগ্রেট করেছেন সেখানে ছিল না, তাহলে ডেপ্লয়মেন্ট প্রক্রিয়ার শুরুতে Firebase CLI আপনাকে সেগুলোর জন্য অনুরোধ করবে। একটি আপ-টু-ডেট firestore-bigquery-export এক্সটেনশনের এই উদাহরণে এটি প্রত্যাশিত নয়, কিন্তু অনেক কিটই তাদের ব্যবহৃত যেকোনো ইভেন্ট ট্রিগার সোর্সের জন্য নতুন প্যারামিটারের অনুরোধ করে। এই মাইগ্রেশনের অংশ হিসেবে, আপডেট করা কিটগুলো এখন ২য় প্রজন্মের ফাংশন ব্যবহার করছে, যেখানে এক্সটেনশনগুলো আগে ১ম প্রজন্মের ফাংশন ব্যবহার করত। ২য় প্রজন্মে, ফাংশনগুলো তাদের ইভেন্ট সোর্সের কাছাকাছি থাকে এবং একটি অতিরিক্ত প্যারামিটার হিসেবে যুক্ত হয়। ভবিষ্যতের আপডেটে, যদি নতুন প্যারামিটার যোগ করা হয়, তাহলে পরবর্তী ডেপ্লয়মেন্টের সময় CLI আপনাকে অনুরোধ করবে।

সমাধান করা উদাহরণ:

firebase deploy --only functions:firestore-bigquery-export --project my-project

আউটপুট:

=== Deploying to 'my-project'...
i  deploying functions
i  functions: Loaded environment variables from function-kits/firestore-bigquery-export/config-firestore-bigquery-export/.env.my-project
i  functions: ensuring required API bigquery.googleapis.com is enabled...
i  functions: ensuring required API cloudtasks.googleapis.com is enabled...
✔  functions: required APIs are enabled
i  functions: granting declarative IAM roles to managed service account:
   - BigQuery Data Editor
   - BigQuery User
   - Cloud Datastore User
   - Eventarc Event Receiver
   - roles/run.invoker
✔  functions: successfully granted IAM roles
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-fsexportbigquery(us-central1)...
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-initBigQuerySync(us-central1)...
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-setupBigQuerySync(us-central1)...
✔  functions[kit-firestore-bigquery-export-fsexportbigquery(us-central1)] Successful create operation.
✔  functions[kit-firestore-bigquery-export-initBigQuerySync(us-central1)] Successful create operation.
✔  functions[kit-firestore-bigquery-export-setupBigQuerySync(us-central1)] Successful create operation.
i  functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔  functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/us-central1/queues/kit-firestore-bigquery-export-initBigQuerySync.
✔  Deploy complete!

কিটটির firebase deploy কোনো ত্রুটি হয়নি তা যাচাই করতে, ডিপ্লয়মেন্ট লগগুলো পরীক্ষা করে দেখুন কোনো লাইফসাইকেল হুক ট্রিগার হয়েছে কিনা। স্ট্রিম Cloud Firestore টু BigQuery মতো জনপ্রিয় এক্সটেনশনগুলো লাইফসাইকেল হুক ব্যবহার করে। একটি লাইফসাইকেল হুক ট্রিগার হলে দেখতে কেমন হয়, তার একটি উদাহরণ নিচে দেওয়া হলো:

i  functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔  functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/europe-west1/queues/kit-firestore-bigquery-export-initBigQuerySync.
i  functions: View logs for afterFirstDeploy at: https://console.cloud.google.com/logs/query;query=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22kit-firestore-bigquery-export--initbigquerysync%22%0Aresource.labels.location%3D%22europe-west1%22;project=my-project

এই লগ বার্তাগুলো নিম্নলিখিত বিষয়গুলো নিশ্চিত করে:

  • একটি লাইফসাইকেল হুক খুঁজে পাওয়া গেছে এবং কার্যকর করা হয়েছে।
  • লাইফসাইকেল হুকটির সংশ্লিষ্ট টাস্ক কিউতে একটি টাস্ক যুক্ত করা হয়েছিল।
  • ক্লাউড লগিং-এর একটি লিঙ্ক দেওয়া হয়েছে, যাতে আপনি যাচাই করতে পারেন যে কাজটি কোনো ত্রুটি ছাড়াই সম্পন্ন হয়েছে।

লগগুলিতে কোনও ত্রুটি নেই এবং আপনার টাস্ক কিউ ইভেন্টটি সফলভাবে প্রক্রিয়া করা হয়েছে কিনা তা যাচাই করতে লগস লিঙ্কে ক্লিক করে Google Cloud কনসোলে যান। যদি লাইফসাইকেল ইভেন্টটি সফলভাবে সম্পাদিত না হয়, তবে আপনি নিম্নলিখিত কমান্ডটি চালিয়ে এটি পুনরায় ট্রিগার করতে পারেন:

firebase functions:lifecycle:run <hook-name> <codebase>

আপনি যদি প্রথমবারের মতো একটি ফাংশন কিট ইনস্ট্যান্স ডেপ্লয় করেন, তাহলে চালান:

firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id>

যাচাইকরণ চলাকালীন যেকোনো সময়ে যদি আপনি এই মাইগ্রেশনটি থামাতে বা পূর্বাবস্থায় ফেরাতে চান, তাহলে আপনি ‘এক্সটেনশন আনইনস্টল করুন’ অংশে দেওয়া নির্দেশাবলী অনুসরণ করে কিটটি আনইনস্টল করতে পারেন।

৪. এক্সটেনশনটি আনইনস্টল করুন

আপনার ডেপ্লয় করা ফাংশন কিট যাচাই করার পরে, আপনি আপনার এক্সটেনশনটি আনইনস্টল করতে পারেন, যাতে কিটের জন্য একবার এবং এক্সটেনশনের জন্য একবার এর আচরণের পুনরাবৃত্তি না ঘটে। আপনি --immediate ফ্ল্যাগটি পাস করে, যেভাবেই ইনস্টল করে থাকুন না কেন, Firebase CLI থেকে সমস্ত এক্সটেনশন আনইনস্টল করতে পারেন:

firebase ext:uninstall <extension-instance-id> --project <project-id> --immediate

সমাধান করা উদাহরণ:

firebase ext:uninstall firestore-bigquery-export --project my-project --immediate

আউটপুট:

i  extensions: uninstalling firestore-bigquery-export...
i  extensions: deleting extension instance resources in project my-project...
✔  extensions: successfully uninstalled firestore-bigquery-export

উন্নত স্থানান্তর

আপনি একাধিক Firebase প্রোজেক্টে এক্সটেনশন রাখতে পারেন, যেগুলো আপনি একটিমাত্র কোডবেস দিয়ে পরিচালনা করতে চান। উদাহরণস্বরূপ, যদি আপনি একই ইনফ্রাস্ট্রাকচার একটি testing এনভায়রনমেন্ট এবং একটি production এনভায়রনমেন্টে ডেপ্লয় করেন, যার প্রতিটিতে একটি documents Cloud Firestore ইনস্ট্যান্স আছে যা আপনি BigQuery তে এক্সপোর্ট করেন, তাহলে আপনার firestore-bigquery-export এক্সটেনশনটির দুটি ইনস্ট্যান্স ইনস্টল করা থাকতে পারে:

  • export-documents-testing
  • export-documents-production

আপনি যদি Firebase CLI ব্যবহার করে একটি কোডবেসের মধ্যে এই দুটি এক্সটেনশন ইনস্ট্যান্সকে দুটি ফাংশন কিট ইনস্ট্যান্সে মাইগ্রেট করেন এবং firebase deploy --project testing ও firebase deploy --project production কমান্ড ব্যবহার করে ডিপ্লয় করেন, তাহলে প্রতিটি ডিপ্লয়ের ফলে testing এবং production উভয় এনভায়রনমেন্টেই দুটি করে ইনস্ট্যান্স তৈরি হবে।

এর পরিবর্তে, দুটি এক্সটেনশন ইনস্ট্যান্সকে firestore-bigquery-export এর একটি ফাংশন কিট ইনস্ট্যান্স দিয়ে প্রতিস্থাপন করুন, যা একাধিক প্রজেক্টে ডেপ্লয় করা থাকবে এবং প্রতিটি প্রজেক্টের নিজস্ব কনফিগারেশন থাকবে। ইনস্ট্যান্সটির জন্য আপনার কনফিগারেশন ডিরেক্টরিটি নিম্নলিখিতের মতো দেখতে হবে:

  • config-export-documents/
    • .env.testing
    • .env.production

testing এবং production প্রতিটি ডেপ্লয়মেন্ট সংশ্লিষ্ট কনফিগারেশন সহ আপনার কিটের একটি ইনস্ট্যান্স তৈরি করে। বিদ্যমান CLI কমান্ডগুলো এই সেটআপটি তৈরি করে, যদি আপনি ext:migrate বা functions:kits:install এর প্রতিটি আহ্বানে --project ফ্ল্যাগটি পাস করেন।

সমাধান করা উদাহরণ:

firebase functions:kits:install --package @firebase-function-kits/firestore-bigquery-export --project testing --no-configure --template migration
✔ What would you like to name this kit? firestore-bigquery-export
✔ What would you like to name this instance? export-documents
✔  Wrote function-kits/firestore-bigquery-export/source/package.json
✔  Wrote function-kits/firestore-bigquery-export/source/tsconfig.json
✔  Wrote function-kits/firestore-bigquery-export/source/.gitignore
✔  Wrote function-kits/firestore-bigquery-export/source/src/index.ts
i  functions: Running npm install
✔  Wrote configuration info to firebase.json
✔  functions: Function kit firestore-bigquery-export successfully installed.
# This creates the export-documents instance with an empty .env.testing file
# for the testing project. Now populate it via export:
firebase ext:export --mode functions --instance export-documents-testing \
  --kit-instance export-documents --project testing

# Repeat the export for production into the same kit instance to create
# .env.production from the export-documents-prod instance:
firebase ext:export --mode functions --instance export-documents-prod \
  --kit-instance export-documents --project production

এখন আপনার কাছে একটিমাত্র কিট ইনস্ট্যান্স কনফিগার করা আছে, যা আপনার testing এবং production প্রজেক্টে তাদের নিজ নিজ কনফিগারেশন সহ ডেপ্লয় করার জন্য ব্যবহৃত হবে। আপনি যদি testing প্রজেক্টে একটি ইনস্ট্যান্স তৈরি করেন এবং production প্রজেক্টে একই প্যাকেজের জন্য functions:kits:install কমান্ডটি চালান, তাহলে আপনাকে testing জন্য কনফিগার করা ইনস্ট্যান্সটি পুনরায় ব্যবহার করার অথবা একটি দ্বিতীয় ইনস্ট্যান্স ইনস্টল করার বিকল্প দেখানো হবে।