Шаблоны удаленной конфигурации и управление версиями


Шаблоны Remote Config — это наборы параметров и условий в формате JSON, созданные вами для вашего проекта Firebase. Вы можете создать клиентские шаблоны, из которых ваше приложение будет получать значения, и серверные шаблоны, из которых клиенты сервера смогут получать значения.

В этом разделе обсуждаются клиентские шаблоны. Чтобы узнать о шаблонах, специфичных для сервера, нажмите «Шаблоны сервера» .

Вы можете изменять и управлять шаблоном с помощью консоли Firebase , которая отображает содержимое шаблона в графическом формате вВкладки «Параметры» и «Условия» .

Вы также можете использовать REST API Remote Config и 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);
    });
}

Ява

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());
}

ОТДЫХ

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);
  });

Ява

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());

ОТДЫХ

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

Параметр URL ?version_number действителен только для операций 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);
  })

Ява

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());
  }
}

ОТДЫХ

Чтобы вернуться к сохранённому шаблону 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 , чтобы интегрировать их в свои системы управления исходным кодом и сборки, автоматизировать обновления конфигураций и синхронизировать параметры и значения в нескольких проектах.

Вы можете загрузить текущий активный шаблон Remote Configиз консоли Firebase .Затем вы можете обновить экспортированный JSON-файл и опубликовать его в том же проекте или опубликовать его в новом или существующем проекте.

Предположим, у вас есть несколько проектов, представляющих разные этапы жизненного цикла разработки программного обеспечения, такие как среды разработки, тестирования, промежуточной среды и производственной среды. В этом случае вы можете перенести полностью протестированный шаблон из промежуточной среды в производственную среду, загрузив его из промежуточного проекта и опубликовав в производственном проекте.

Этот метод также можно использовать для переноса конфигураций из одного проекта в другой или для заполнения нового проекта параметрами и значениями из существующего проекта.

Параметры и значения параметров, созданные специально как варианты в эксперименте A/B Testing не включаются в экспортируемые шаблоны.

Чтобы экспортировать и импортировать шаблоны Remote Config :

  1. Загрузите текущий шаблон конфигурации Remote Config .
  2. Проверьте шаблон Remote Config .
  3. Опубликуйте шаблон Remote Config .

Загрузите текущий шаблон удаленной конфигурации

Для загрузки активного шаблона Remote Config в формате JSON используйте следующее:

Консоль Firebase

  1. На вкладке «Параметры или условия Remote Config » откройте меню и выберите «Загрузить текущий файл конфигурации» .
  2. При появлении запроса нажмите «Загрузить файл конфигурации» , выберите место, где вы хотите сохранить файл, затем нажмите «Сохранить» .

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);
      });
}

Ява

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

ОТДЫХ

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

Эта команда выводит полезную нагрузку JSON в один файл, а заголовки (включая ETag) — в отдельный файл headers .

Проверьте шаблон удаленной конфигурации

Вы можете проверить обновления шаблонов перед их публикацией с помощью Firebase Admin SDK или REST API. Шаблоны также проверяются при попытке публикации из Firebase CLI или консоли Firebase .

Процесс проверки шаблона проверяет наличие ошибок, таких как дублирование ключей для параметров и условий, недопустимые имена условий или несуществующие условия, а также некорректный формат ETag. Например, запрос, содержащий больше допустимого количества ключей (2000), вернёт сообщение об ошибке 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);
      });
}

Ява

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());
  }
}

ОТДЫХ

Проверьте обновления шаблона, добавив параметр 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);
      });
}

Ява

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());
  }
}

ОТДЫХ

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 Config , поскольку они могут меняться со временем.

Как описано в ссылках для конкретных платформ в конце этого раздела, вы можете вручную задать эти значения по умолчанию в своём приложении или упростить этот процесс, загрузив файлы, содержащие только пары «ключ-значение» для всех параметров и их значения по умолчанию в активном шаблоне Remote Config . Затем вы можете включить этот файл в свой проект и настроить приложение для импорта этих значений.

Вы можете загрузить эти файлы в формате XML для приложений Android, в формате списка свойств (plist) для приложений iOS и в формате JSON для веб-приложений.

Мы рекомендуем периодически загружать настройки Remote Config по умолчанию перед выпуском любого нового приложения, чтобы гарантировать синхронизацию вашего приложения и бэкэнда Remote Config .

Чтобы загрузить файл, содержащий шаблоны по умолчанию:

ОТДЫХ

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 по умолчанию в ваше приложение см. в разделе: