תבניות הגדרת תצורה מרחוק וניהול גרסאות


Remote Config תבניות הן קבוצות של פרמטרים ותנאים בפורמט JSON שיצרתם עבור פרויקט Firebase. אפשר ליצור תבניות לקוח, שהאפליקציה מאחזרת מהן ערכים, ותבניות שרת, ששרתי לקוחות יכולים לאחזר מהן ערכים.

בקטע הזה נסביר על תבניות לקוח. כדי לקבל מידע על תבניות ספציפיות לשרת, לוחצים על Server templates (תבניות שרת).

אפשר לשנות את התבנית ולנהל אותה באמצעות מסוף Firebase, שבו מוצגים התוכן של התבנית בפורמט גרפי בכרטיסיות הכרטיסיות Parameters ו-Conditions.

אפשר גם להשתמש בRemote Config REST API וב-Admin SDK או ב-Firebase CLI כדי לשנות ולנהל את תבנית הלקוח.

דוגמה לקובץ תבנית של שרת:

{
  "parameters": {
    "preamble_prompt": {
      "defaultValue": {
        "value": "You are a helpful assistant who knows everything there is to know about Firebase! "
      },
      "description": "Add this prompt to the user's prompt",
      "valueType": "STRING"
    },
    "model_name": {
      "defaultValue": {
        "value": "gemini-pro-test"
      },
      "valueType": "STRING"
    },
    "generation_config": {
      "defaultValue": {
        "value": "{\"temperature\": 0.9, \"maxOutputTokens\": 2048, \"topP\": 0.9, \"topK\": 20}"
      },
      "valueType": "JSON"
    },
  },
  "version": {
    "versionNumber": "19",
    "isLegacy": true
  }
}

אפשר לבצע את משימות ניהול הגרסאות האלה באמצעות מסוף Firebase:

  • הצגת רשימה של כל הגרסאות השמורות של התבנית
  • אחזור של גרסה ספציפית
  • חזרה לגרסה ספציפית של הלקוח
  • מחיקת תבניות Remote Config מהדף היסטוריית השינויים

יש מגבלה כוללת של 300 גרסאות מאוחסנות לכל סוג תבנית (300 תבניות לקוח ו-300 תבניות שרת), כולל מספרי גרסאות מאוחסנים של תבניות שנמחקו. אם מפרסמים יותר מ-300 גרסאות של תבנית לכל סוג תבנית במהלך חיי הפרויקט, הגרסאות המוקדמות ביותר נמחקות, כך שיישארו לכל היותר 300 גרסאות מהסוג הזה.

בכל פעם שמעדכנים פרמטרים, Remote Config יוצר תבנית חדשה עם גרסה Remote Config ושומר את התבנית הקודמת כגרסה שאפשר לאחזר או לחזור אליה לפי הצורך. מספרי הגרסאות עולים ברצף מהערך הראשוני שמאוחסן על ידי Remote Config. כל התבניות כוללות שדה version כמו שמוצג, שמכיל מטא-נתונים לגבי הגרסה הספציפית הזו.

אפשר למחוק תבניות Remote Config לפי הצורך מהדף היסטוריית השינויים במסוף Remote Config.

ניהול גרסאות של תבניות Remote Config

בקטע הזה מוסבר איך לנהל גרסאות של Remote Configתבנית.

הצגת רשימה של כל הגרסאות השמורות של התבנית Remote Config

אפשר לאחזר רשימה של כל הגרסאות השמורות של תבנית Remote Config. כך עושים את זה:

מסוף Firebase

בכרטיסייה פרמטרים, לוחצים על סמל השעון שמוצג בפינה השמאלית העליונה. ייפתח הדף היסטוריית שינויים שבו מופיעה רשימה של כל הגרסאות השמורות של התבנית בתפריט רשימה בצד שמאל.

הפרטים שמוצגים לכל גרסה מאוחסנת כוללים מידע על מקור השינויים: מהמסוף, מ-REST API, משחזור או משינויים מצטברים משמירה מאולצת של התבנית.

Firebase CLI

firebase remoteconfig:versions:list

אפשר להשתמש באפשרות --limit כדי להגביל את מספר הגרסאות שמוחזרות. מעבירים את הערך '0' כדי לאחזר את כל הגרסאות.

Node.js

function listAllVersions() {
  admin.remoteConfig().listVersions()
    .then((listVersionsResult) => {
      console.log("Successfully fetched the list of versions");
      listVersionsResult.versions.forEach((version) => {
        console.log('version', JSON.stringify(version));
      });
    })
    .catch((error) => {
      console.log(error);
    });
}

Java

ListVersionsPage page = FirebaseRemoteConfig.getInstance().listVersionsAsync().get();
while (page != null) {
  for (Version version : page.getValues()) {
    System.out.println("Version: " + version.getVersionNumber());
  }
  page = page.getNextPage();
}

// Iterate through all versions. This will still retrieve versions in batches.
page = FirebaseRemoteConfig.getInstance().listVersionsAsync().get();
for (Version version : page.iterateAll()) {
  System.out.println("Version: " + version.getVersionNumber());
}

REST

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig:listVersions

רשימת התבניות כוללת מטא-נתונים של כל הגרסאות שנשמרו, כולל זמן העדכון, המשתמש שביצע אותו והאופן שבו הוא בוצע. דוגמה לאלמנט גרסה:

```json
{
  "versions": [{
    "version_number": "6",
    "update_time": "2022-05-12T02:38:54Z",
    "update_user": {
      "name": "Jane Smith",
      "email": "jane@developer.org",
      "imageUrl": "https://lh3.googleusercontent.com/a-/..."
    },
    "description": "One small change on the console",
    "origin": "CONSOLE",
    "update_type": "INCREMENTAL_UPDATE"
  }]
}
```

אחזור של גרסה ספציפית של תבנית Remote Config

אפשר לאחזר כל גרסה ספציפית של תבנית Remote Config שנשמרה. כדי לאחזר גרסה של תבנית שאוחסנה:

מסוף Firebase

כברירת מחדל, בחלונית הפרטים בכרטיסייה היסטוריית שינויים מוצגת התבנית הפעילה הנוכחית. כדי לראות פרטים של גרסה אחרת ברשימה, בוחרים אותה בתפריט השמאלי.

כדי לראות השוואה מפורטת בין הגרסה שנבחרה לבין גרסה אחרת ששמורה, מעבירים את העכבר מעל תפריט ההקשר של גרסה שלא נבחרה ובוחרים באפשרות השוואה עם הגרסה שנבחרה.

Firebase CLI

firebase remoteconfig:get -v VERSION_NUMBER

אפשר גם לכתוב את הפלט בקובץ שצוין באמצעות -o, FILENAME.

Node.js

מעבירים את getTemplate() ללא ארגומנטים כדי לאחזר את הגרסה האחרונה של התבנית, או משתמשים ב-getTemplateAtVersion() כדי לאחזר גרסה ספציפית.

// Get template version: 6
admin.remoteConfig().getTemplateAtVersion('6')
  .then((template) => {
    console.log("Successfully fetched the template with ETag: " + template.etag);
  })
  .catch((error) => {
    console.log(error);
  });

Java

Template template = FirebaseRemoteConfig.getInstance().getTemplateAtVersionAsync(versionNumber).get();
// See the ETag of the fetched template.
System.out.println("Successfully fetched the template with ETag: " + template.getETag());

REST

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig?version_number=6

הפרמטר ?version_number של כתובת ה-URL תקף רק לפעולות GET. אי אפשר להשתמש בו כדי לציין מספרי גרסאות לעדכונים. בקשת get דומה ללא הפרמטר ?version_number תחזיר את התבנית הפעילה הנוכחית.

חזרה לגרסה ספציפית של תבנית Remote Config שנשמרה

אפשר לחזור לכל גרסה שמורה של התבנית. כדי לבטל שינוי בתבנית:

מסוף Firebase

בגרסאות קודמות של תבניות שאפשר לחזור אליהן, מוצג לחצן אפשרות לחזרה לגרסה הזו בפינה השמאלית העליונה של הדף היסטוריית שינויים. צריך ללחוץ ולאשר רק אם בטוחים שרוצים לחזור לגרסה הזו ולהשתמש בערכים האלה באופן מיידי בכל האפליקציות והמשתמשים.

Firebase CLI

firebase remoteconfig:rollback -v VERSION_NUMBER

Node.js

// Roll back to template version: 6
admin.remoteConfig().rollback('6')
  .then((template) => {
    console.log("Successfully rolled back to template version 6.");
    console.log("New ETag: " + template.etag);
  })
  .catch((error) => {
    console.log('Error trying to rollback:', e);
  })

Java

try {
  Template template = FirebaseRemoteConfig.getInstance().rollbackAsync(versionNumber).get();
  System.out.println("Successfully rolled back to template version: " + versionNumber);
  System.out.println("New ETag: " + template.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Error trying to rollback template.");
    System.out.println(rcError.getMessage());
  }
}

REST

כדי לחזור לתבנית Remote Config מאוחסנת, שולחים בקשת HTTP POST עם השיטה המותאמת אישית :rollback, ובגוף הבקשה מציינים את הגרסה הספציפית שרוצים להחיל. לדוגמה:

curl --compressed -D headers -H "Authorization: Bearer <var>token</var>" -H "Content-Type: application/json" -X POST https://firebaseremoteconfig.googleapis.com/v1/projects/<var>my-project-id</var>/remoteConfig:rollback -d '{"version_number": 6}'

התשובה מכילה את התוכן של התבנית המאוחסנת שהופעלה, עם המטא-נתונים של הגרסה החדשה שלה.

שימו לב: פעולת החזרה לגרסה קודמת יוצרת למעשה גרסה חדשה עם מספר. לדוגמה, אם מבצעים חזרה מגרסה 10 לגרסה 6, נוצרת למעשה עותק חדש של גרסה 6, ששונה מהגרסה המקורית רק במספר הגרסה שלה, שהוא 11. גרסה 6 המקורית עדיין מאוחסנת, בהנחה שהיא לא הגיעה לתאריך התפוגה שלה, וגרסה 11 הופכת לתבנית הפעילה.

מחיקה של תבנית Remote Config

אפשר למחוק תבניות של Remote Config ממסוף Firebase. כדי למחוק תבנית Remote Config:

1. בדף Remote Config פרמטרים לוחצים על היסטוריית שינויים.
  1. עוברים לתבנית שרוצים למחוק, לוחצים על אפשרויות נוספות ובוחרים באפשרות מחיקה.

  2. כשמופיעה בקשה לאישור המחיקה, לוחצים על מחיקה.

הורדה ופרסום של תבניות Remote Config

אפשר להוריד ולפרסם תבניות של Remote Config כדי לשלב אותן במערכות לניהול גרסאות ובמערכות build, להפוך עדכוני הגדרות לאוטומטיים ולשמור על סנכרון בין פרמטרים וערכים בכמה פרויקטים.

אפשר להוריד את תבנית Remote Configממסוף Firebase. אחר כך תוכלו לעדכן את קובץ ה-JSON שייצאתם ולפרסם אותו באותו פרויקט, או לפרסם אותו בפרויקט חדש או קיים.

נניח שיש לכם כמה פרויקטים שמייצגים שלבים שונים במחזור החיים של פיתוח התוכנה, כמו סביבות פיתוח, בדיקה, Staging וייצור. במקרה כזה, תוכלו להעביר תבנית שנבדקה באופן מלא מסביבת הבדיקה לסביבת הייצור. לשם כך, תצטרכו להוריד אותה מפרויקט הבדיקה ולפרסם אותה בפרויקט הייצור.

אפשר גם להשתמש בשיטה הזו כדי להעביר הגדרות מפרויקט אחד לפרויקט אחר, או כדי לאכלס פרויקט חדש בפרמטרים ובערכים מפרויקט קיים.

פרמטרים וערכי פרמטרים שנוצרו במיוחד כווריאציות בניסוי A/B Testing לא נכללים בתבניות שמיוצאות.

כדי לייצא ולייבא תבניות של Remote Config:

  1. מורידים את תבנית ההגדרות הנוכחית של Remote Config.
  2. מאמתים את התבנית Remote Config.
  3. מפרסמים את התבנית של Remote Config.

הורדת התבנית הנוכחית של הגדרת התצורה מרחוק

כדי להוריד את תבנית Remote Config הפעילה בפורמט JSON:

מסוף Firebase

  1. בכרטיסייה Remote Config Parameters or Conditions (פרמטרים או תנאים), פותחים את התפריט ובוחרים באפשרות Download current config file (הורדת קובץ ההגדרות הנוכחי).
  2. כשמופיעה בקשה, לוחצים על Download config file, בוחרים את המיקום שבו רוצים לשמור את הקובץ ואז לוחצים על Save.

Firebase CLI

firebase remoteconfig:get -o filename

Node.js

function getTemplate() {
  var config = admin.remoteConfig();
  config.getTemplate()
      .then(function (template) {
        console.log('ETag from server: ' + template.etag);
        var templateStr = JSON.stringify(template);
        fs.writeFileSync('config.json', templateStr);
      })
      .catch(function (err) {
        console.error('Unable to get template');
        console.error(err);
      });
}

Java

Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get();
// See the ETag of the fetched template.
System.out.println("ETag from server: " + template.getETag());

REST

curl --compressed -D headers -H "Authorization: Bearer token" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -o filename

הפקודה הזו יוצרת קובץ אחד עם מטען ה-JSON, וקובץ headers נפרד עם הכותרות (כולל ה-ETag).

אימות תבנית ההגדרה מרחוק

אפשר לאמת את העדכונים בתבנית לפני שמפרסמים אותם באמצעות Firebase Admin SDK או באמצעות API ל-REST. תבניות עוברות אימות גם כשמנסים לפרסם מ-Firebase CLI או מ-Firebase console.

במהלך אימות התבנית, המערכת בודקת אם יש שגיאות כמו מפתחות כפולים של פרמטרים ותנאים, שמות תנאים לא תקינים או תנאים שלא קיימים, או תגי ETag בפורמט שגוי. לדוגמה, אם בקשה מכילה יותר ממספר המפתחות המותר – 2, 000 – תוחזר הודעת השגיאה Param count too large.

Node.js

function validateTemplate(template) {
  admin.remoteConfig().validateTemplate(template)
      .then(function (validatedTemplate) {
        // The template is valid and safe to use.
        console.log('Template was valid and safe to use');
      })
      .catch(function (err) {
        console.error('Template is invalid and cannot be published');
        console.error(err);
      });
}

Java

try {
  Template validatedTemplate = FirebaseRemoteConfig.getInstance()
          .validateTemplateAsync(template).get();
  System.out.println("Template was valid and safe to use");
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Template is invalid and cannot be published");
    System.out.println(rcError.getMessage());
  }
}

REST

כדי לאמת את העדכונים בתבנית, מוסיפים את הפרמטר של כתובת ה-URL ?validate_only=true לבקשת הפרסום:

curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig?validate_only=true -d @filename

אם התבנית אומתה בהצלחה, פקודת ה-curl מחזירה את תבנית ה-JSON ששלחתם, ובקובץ headers שנשמר יופיע סטטוס HTTP/2 200 ו-ETag מעודכן עם הסיומת -0. אם התבנית לא אומתה, תקבלו את שגיאת האימות בתגובת ה-JSON, וקובץ headers יכיל תגובה שאינה 200 (ולא ETag).

פרסום תבנית Remote Config

אחרי שמורידים תבנית, מבצעים את השינויים הנדרשים בתוכן ה-JSON ומאמתים אותו, אפשר לפרסם אותו בפרויקט.

כשמפרסמים תבנית, היא מחליפה את כל תבנית ההגדרות הקיימת בקובץ המעודכן, והגרסה של התבנית עולה באחת. מכיוון שההגדרה כולה מוחלפת, אם מוחקים פרמטר מקובץ ה-JSON ומפרסמים אותו, הפרמטר נמחק מהשרת ולא זמין יותר ללקוחות.

אחרי הפרסום, השינויים בפרמטרים ובערכים זמינים באופן מיידי באפליקציות שלכם ולמשתמשים. במידת הצורך, אפשר לחזור לגרסה קודמת.

כדי לפרסם את התבנית, משתמשים בפקודות הבאות:

מסוף Firebase

  1. בכרטיסייה Remote Config פרמטרים או תנאים, פותחים את התפריט ובוחרים באפשרות פרסום מקובץ.
  2. כשמופיעה בקשה לכך, לוחצים על עיון, עוברים אל קובץ Remote Config שרוצים לפרסם ובוחרים אותו, ואז לוחצים על בחירה.
  3. המערכת תאמת את הקובץ, ואם האימות יצליח, תוכלו ללחוץ על פרסום כדי שההגדרה תהיה זמינה באופן מיידי לאפליקציות ולמשתמשים.

Node.js

function publishTemplate() {
  var config = admin.remoteConfig();
  var template = config.createTemplateFromJSON(
      fs.readFileSync('config.json', 'UTF8'));
  config.publishTemplate(template)
      .then(function (updatedTemplate) {
        console.log('Template has been published');
        console.log('ETag from server: ' + updatedTemplate.etag);
      })
      .catch(function (err) {
        console.error('Unable to publish template.');
        console.error(err);
      });
}

Java

try {
  Template publishedTemplate = FirebaseRemoteConfig.getInstance()
          .publishTemplateAsync(template).get();
  System.out.println("Template has been published");
  // See the ETag of the published template.
  System.out.println("ETag from server: " + publishedTemplate.getETag());
} catch (ExecutionException e) {
  if (e.getCause() instanceof FirebaseRemoteConfigException) {
    FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause();
    System.out.println("Unable to publish template.");
    System.out.println(rcError.getMessage());
  }
}

REST

curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -d @filename

בפקודה curl הזו, אפשר לציין את התוכן באמצעות התו @ ואחריו שם הקובץ.

Remote Config התאמות אישיות ותנאים נכללים בתבניות שהורדתם, ולכן חשוב לשים לב למגבלות הבאות כשמנסים לפרסם בפרויקט אחר:

  • אי אפשר לייבא התאמות אישיות מפרויקט לפרויקט.

    לדוגמה, אם הפעלתם התאמות אישיות בפרויקט והורדתם תבנית ועריכתם אותה, תוכלו לפרסם אותה באותו פרויקט, אבל לא תוכלו לפרסם אותה בפרויקט אחר אלא אם תמחקו את ההתאמות האישיות מהתבנית.

  • אפשר לייבא תנאים מפרויקט לפרויקט, אבל חשוב לזכור שערכים מותנים ספציפיים (כמו מזהי אפליקציות או קהלים) צריכים להיות קיימים בפרויקט היעד לפני הפרסום.

    לדוגמה, אם יש לכם פרמטר Remote Config שמשתמש בתנאי שמציין ערך פלטפורמה של iOS, אפשר לפרסם את התבנית בפרויקט אחר, כי ערכי הפלטפורמה זהים לכל הפרויקטים. עם זאת, אם הוא מכיל תנאי שמסתמך על מזהה אפליקציה ספציפי או על קהל משתמשים שלא קיים בפרויקט היעד, האימות ייכשל.

  • אם התבנית שאתם מתכננים לפרסם מכילה תנאים שמסתמכים על Google Analytics, צריך להפעיל את Analytics בפרויקט היעד.

הורדה של ברירות המחדל של תבנית Remote Config

יכול להיות שהאפליקציה שלכם לא תמיד תהיה מחוברת לאינטרנט, ולכן כדאי להגדיר ערכי ברירת מחדל של האפליקציה בצד הלקוח לכל הפרמטרים של Remote Config. כדאי גם לסנכרן מעת לעת את ערכי ברירת המחדל של לקוח האפליקציה ואת ערכי ברירת המחדל של הפרמטרים ב-Remote Configbackend, כי הם עשויים להשתנות לאורך זמן.

כפי שמתואר בקישורים הספציפיים לפלטפורמה בסוף הקטע הזה, אפשר להגדיר את ברירות המחדל האלה באפליקציה באופן ידני, או לייעל את התהליך הזה על ידי הורדת קבצים שמכילים רק את צמדי המפתח/ערך של כל הפרמטרים וערכי ברירת המחדל שלהם בתבנית הפעילה Remote Config. אחר כך תוכלו לכלול את הקובץ הזה בפרויקט ולהגדיר את האפליקציה כך שתייבא את הערכים האלה.

אפשר להוריד את הקבצים האלה בפורמט XML לאפליקציות ל-Android, בפורמט plist לאפליקציות ל-iOS ובפורמט JSON לאפליקציות אינטרנט.

מומלץ להוריד מדי פעם את Remote Config הגדרות ברירת המחדל לפני כל גרסה חדשה של האפליקציה, כדי לוודא שהאפליקציה וRemote Config העורף האחורי נשארים מסונכרנים.

.

כדי להוריד קובץ שמכיל את ברירות המחדל של התבנית:

REST

curl --compressed -D headers -H "Authorization: Bearer token -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig:downloadDefaults?format=file_format'

משתמשים בערך XML,‏ PLIST או JSON בשדה format, בהתאם לפורמט הקובץ שרוצים להוריד.

מסוף Firebase

  1. בכרטיסייה פרמטרים, פותחים את התפריט ובוחרים באפשרות הורדת ערכי ברירת מחדל.
  2. כשמופיעה הנחיה, לוחצים על לחצן האפשרויות שמתאים לפורמט הקובץ שרוצים להוריד, ואז לוחצים על הורדת הקובץ.

מידע נוסף על ייבוא Remote Config ערכי ברירת מחדל לאפליקציה