APC 技術ブログ

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

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

【Backstage】Software Templateのバージョン管理を実現する

はじめに

みなさんこんにちは。 Backstage にどっぷり浸かっている ACS事業部亀崎です。

Backstageの主要機能の1つであるSoftware Template、みなさんご利用されていますか?

techblog.ap-com.co.jp

Software Templateを使うと、リポジトリを作成するタイミングでカタログ情報も一緒に登録することができます。

通常は作成したらテンプレート元と作成されたものの関係はそれで終わり、だったのですが、そのカタログ情報に、「いつSoftware Template」を実行したのか、それはどのテンプレートなのか、バージョンはいつのものかを動的に付与するアクションがcommunity-pluginにありました。

ほんのちょっと情報を付加するアクションですが、実はSoftware Templateの適用ライフサイクルをより改善する機能ともなり得るものなのでご紹介します。

Software Templateのライフサイクルを改善するPlugin

annotation action

それでは今回の主役、『カタログ情報に、いつSoftware Templateを実行したのか、それはどのテンプレートなのか、バージョンはいつのものかを動的に付与するアクション』に登場いただきましょう。

それが annotator action plugin です。

github.com

Pluginのドキュメントにも記載がありますが、こちらのPluginを導入すると次のアクションが使えるようになります。

Action Description
catalog:timestamping backstage.io/createdAt annotationに現在のタイムスタンプを挿入する
catalog:scaffolded-from spec.scaffoldedFrom に実行しているTemplateの entityRef を挿入する
catalog:annotate 指定した独自のannotationを挿入する
catalog:template:version Templateに記載されているバージョンをbackstage.io/template-version に挿入する

「いつSoftware Templateを実行したのか」(catalog:timestamping )、「どのテンプレートを使用したのか」(catalog:scaffolded-from)、「バージョンはいつのものか」(catalog:template:version)がこれらのアクションを使うことで、把握できるようになるというわけです。

実際のテンプレートの例(一部改変)をみてみましょう。

apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: create-react-app-template-with-timestamp-entityRef
  title: Create React App Template
  description: Create a new CRA website project
  annotations:
    backstage.io/template-version: 0.0.1
  tags:
    - react
    - cra
spec:
  owner: web@example.com
  type: website
  parameters:
    - title: Provide some simple information
      required:
        - component_id
        - owner
      properties:
        component_id:
          title: Name
  # 〜〜以下 parameters 部省略〜〜

  steps:
    - id: template
      name: Fetch Skeleton + Template
      action: fetch:template
      input:
        # 〜〜入力値省略〜〜

    # タイムスタンプを記載
    - id: timestamp
      name: Add Timestamp to catalog-info.yaml
      action: catalog:timestamping

    # catalog-info.yamlにテンプレートバージョンを埋め込み
    - id: version-templateRef
      name: Append the version of this template to the entityRef
      action: catalog:template:version

    # 実行するテンプレート(=このテンプレート)のEntityRefを埋め込み
    - id: append-templateRef
      name: Append the entityRef of this template to the entityRef
      action: catalog:scaffolded-from

    - id: publish
      name: Publish
      action: publish:github
      input:
        description: This is ${{ parameters.component_id }}
        repoUrl: ${{ parameters.repoUrl }}
        repoVisibility: public

    - id: register
      name: Register
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
        catalogInfoPath: '/catalog-info.yaml'

  output:
    links:
      - title: Repository
        url: ${{ steps.publish.output.remoteUrl }}
      - title: Open in catalog
        icon: catalog
        entityRef: ${{ steps.register.output.entityRef }}

こちらを実行すると catalog-info.yaml には以下のような形式で出力されます。

apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: xxxxxxx
  annotations:
    backstage.io/createdAt: 12/3/2025, 2:38:46 PM # ★
    backstage.io/template-version: 0.0.1 # ★
  labels: {}
spec:
  type: service
  owner: group:default/guests
  lifecycle: experimental
  scaffoldedFrom: template:default/create-react-app-template-with-timestamp-entityRef # ★

今回のアクションで挿入された部分は ★印の部分です。

こうした情報が挿入されると何がよいのでしょうか?

その利点は 次の pluginを導入すると現れます。

scaffolder relation catalog processor

scaffolder relation catalog processor は、先程挿入した annotation spec.scaffoldedFrom を活用するカタログ情報プロセッサです。

github.com

このPluginには2つの機能があります。1つ目はさきほど挿入した spec.scaffoldedFrom 情報をもとに オリジナルのテンプレートと作成されたカタログ情報との間に relation情報を挿入します。

これにより、Backstageのrelationshipとしてテンプレート元/テンプレート実行先の関係を把握することができるようになります。 以下のようなイメージです。

テンプレート元を中心に表示した場合、そこから生成されたカタログ情報がすべてこの依存関係図から把握することができるようになります。
テンプレート提供側として考えた場合、修正内容を通知したいのだけれど、、、といった状況にも対応することができるようになります。

2つ目の機能が Notification です。こちらの機能は Backstage Notification を利用し、テンプレート元のバージョンが更新されると、そのテンプレートから生成されたリポジトリのカタログ情報に対して(つまりそのカタログ情報のオーナーに)テンプレートが更新されたことを通知します。

通知されたあとどのように対応をするかはそのテンプレートの提供元や利用者が決定する必要がありますが、まずバージョンアップされたということは伝えることができます。

このように、テンプレート実行時にカタログ情報にテンプレート元がどこか、そのバージョンはなにかを設定しておくことで、その後のライフサイクルで変更があった場合の対応につなげることができるようになるのです。

テンプレート機能で作成して終わり、ではなくなるというのは大きな進歩ではないでしょうか。

Community Pluginなどのリポジトリを散策すると「お、これ使えるのでは!?」というようなものが見つかったりします。 ぜひ皆さんもときにはこちらのリポジトリを覗いてみてはいかがでしょうか。

github.com

PlaTTのご紹介

このような便利な機能がいくつもあるBackstageですが、必要なPluginを探してそれを導入したり、アップデート等の管理が面倒になりがち。 また、導入して終わりというものでもなく、使い方を探求することでその能力を100%発揮できるようになるものも多いです。 こういうところを1つ1つ解消するのって面倒ではありませんか? そんな面倒さを解消するのが、私たちが提供するBackstageのManaged Service「PlaTT」です。

techblog.ap-com.co.jp

これまで多くの記事を見ていただいてもわかる通り、自社で様々な検証も行っており、皆さんの「面倒」を解消することができると考えています。 ご興味のある方がいらっしゃいましたらぜひ弊社までご連絡ください。

よろしくお願いします。

www.ap-com.co.jp

www.ap-com.co.jp