APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Pluginの条件ローディングがBackstage v1.30でサポートされました

はじめに

先日公開された Backstage v1.30.x について、以下の記事で取り上げさせていただきました。

techblog.ap-com.co.jp

この記事を書いたときは「・・・これはアップデートとは直接関係ないな」と思って紹介しなかった機能が1つあります。それが「Dynamic Backend Feature Loaders」です。これは起動時に特定のPluginをローディングするかしないかを決定できる機能です。

どんなときに使うかというと、一例としてローカル開発時にはDBはオンメモリを使うけれど、ProductionではPostgreSQLを使うためにPostgreSQL用のPluginを追加でローディングするといったケースが多いかなと思います。

今回はその機能をご紹介します。

公式Conditional Loading以前

これまで実は起動時にPluginをローディングするかどうかを選択する機能は公式には提供されていませんでした。 私たちが提供している「ちょこっとBackstage」では、一部のPluginでローディングの切替を実現するため、実は独自でその問題を解決していました。

それがこちらのコードです。(実際のコードはこちら

const source = ConfigSources.default({});
ConfigSources.toConfig(source).then(config => {
  const backend = createBackend();

  backend.add(import('@backstage/plugin-app-backend/alpha'));
  
  backend.add(import('@backstage/plugin-auth-backend'));
  backend.add(import('@internal/backstage-plugin-auth-backend-module-github-as-guest-provider'))

  // catalog plugin
  backend.add(import('@backstage/plugin-catalog-backend/alpha'));
  backend.add(import('@backstage/plugin-catalog-backend-module-github/alpha'));
  // 条件ローディング
  if (config.getOptionalConfig('catalog.providers.githubOrg')) {
    backend.add(import('@backstage/plugin-catalog-backend-module-github-org'));
  }
 backend.add(import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'));

  // 〜〜中略〜〜  
  backend.add(import('@backstage/plugin-search-backend/alpha'));
  backend.add(import('@backstage/plugin-search-backend-module-catalog/alpha'));
  backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha'));
  // 条件ローディング
  if (config.getOptionalConfig('search.pg')) {
    backend.add(import('@backstage/plugin-search-backend-module-pg/alpha'));
  }
  backend.add(import('@backstage/plugin-techdocs-backend/alpha'));
  
  backend.start();
});

ConfigSources.default というものでconfigオブジェクトが生成されるため、まずそちらを最初に行ってそれを利用して configの指定にあわせてローディングする/しないを切り替えていました(コード中の // 条件ローディング のところです)

独自拡張していたので、いつ仕様が変わって動かなくなるかドキドキものの対応でした。

公式Conditional Loading以後

v1.30で Backend Feature Loaderの機能が追加され、Conditional Loadingもその中でサポートされました。

backstage.io

先程の独自実装の部分をこの機能で置き換えると次のようになります。(実際のコードはこちら

const conditionalFeatureLoader = createBackendFeatureLoader({
  deps: {
    config: coreServices.rootConfig,
  },
  *loader({ config }) {
    if (config.getOptionalConfig('catalog.providers.githubOrg')) {
      yield import('@backstage/plugin-catalog-backend-module-github-org');
    }
    if (config.getOptionalConfig('search.pg')) {
      yield import('@backstage/plugin-search-backend-module-pg/alpha');
    }
  },
});

const backend = createBackend();

backend.add(import('@backstage/plugin-app-backend/alpha'));

// 〜〜中略〜〜  

backend.add(import('@backstage/plugin-techdocs-backend/alpha'));
// conditional loading
backend.add(conditionalFeatureLoader);                                                       // <<====== 条件ローディング

backend.start();

conditionalFeatureLoader の部分でconfigオブジェクトをBackstageのメインロジックから受け取り、configの指定内容に合わせてローディングする/しないを切り替えます。これを backstage.add(conditionalFeatureLoader) とするだけ。

もしかすると以前とそんなに変わらない、と思われるかもしれません。しかしなんといっても公式のサポートです。

「ちょこっとBackstage」で独自に実現していたため、実はリリースのたびに「よかった、今回も問題なかった」「次は大丈夫だろうか」という不安を抱えていたものだったのですが、今回公式対応が出たことでその部分の心配はなくなりました。

ということで早速公式に合わせました。これで、一安心。

一安心ついでにブログとしても投稿させていただきました。

最後に

本ブログでは様々なテーマでBackstageについて取り上げています。ぜひそちらもご覧ください。

techblog.ap-com.co.jp

弊社ではBackstageの導入や運用をManagedで行うサービスを提供しています。ご興味のある方はぜひご連絡ください。

techblog.ap-com.co.jp

また、「ちょこっとBackstage」のほうもご利用いただけると嬉しいです。

github.com

それでは、またの機会にお会いしましょう。