Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜Golden Path作成編①〜

# はじめに
[前回の記事](https://qiita.com/shin7446/items/c35010c3ea566beadc5a)では、Golden Pathの作成の事前準備として、Red Hat Developer Hub(RHDH)とGitHubの連携設定を行いました。
ここではいよいよGolden Pathの作成に入っていきます。

# 実現する環境
今回は以下の環境を構成します。
![ScreenShot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/e5c69ce7-0a0a-9d3d-5e72-bc99bae59a0a.png)


# 章項目
今回のテーマは6つの記事で構成されています。
* [Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜環境導入編〜](https://qiita.com/shin7446/items/bafb3619caf5c8ba28c1) 
* [Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜認証設定編〜](https://qiita.com/shin7446/items/b54ebda4ee91ea5f4ca2) 
* [Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜GitHub Integration編〜](https://qiita.com/shin7446/items/c35010c3ea566beadc5a)
* [Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜Golden Path作成編①〜](https://qiita.com/shin7446/items/ce86d9bbb5121579f9ce) この記事
* [Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜Golden Path作成編②〜](https://qiita.com/shin7446/items/0c181c2f7cc63917bd7c)
* Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜Catalog UI改善編〜

# Golden Pathとは
Golden Pathとは、開発のベストプラクティスを実際に動作する環境と共に開発者に提供する仕組みです。
Golden Pathには、実際に動くサンプルアプリとそのソースコード、アプリの開発に必要なCIパイプラインやGitOps環境、そしてGolden Pathによって構築された環境の可観測性や、Golden Pathの価値を正しく理解して活用するためのTechDocsが含まれます。

このGolden PathをPlatform Engineering Teamから提供することで、
開発者に守ってほしいルールを付与しつつ、実際に動くアプリとコードを提供することで、開発者のノウハウ習得をサポートします。

このGolden PathこそBackstageの真価の根幹であり、全てはこのGolden Pathの実行から開発者体験は始まります。
逆にいうと、Platform EngineerはBackstageを準備しただけでは価値はあまりありません。Platform Engineerの提供価値はGolden Pathを提供して初めて発揮されます。

# BackstageでGolden Pathを提供する仕組み
Backstageでは、Golden Pathを`Software Templates`として開発者に公開します。
開発者はBackstage上で該当の`Software Templates`を選択し、必要なパラメータを入力するだけで開発に必要な各種テンプレートを取得できます。

百聞は一見にしかず、実際にGolden Pathを作って動作を見ていきましょう。

# 前提条件
以下の記事の実行が完了していること
1. [Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜環境導入編〜](https://qiita.com/shin7446/items/bafb3619caf5c8ba28c1) 
1. [Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜認証設定編〜](https://qiita.com/shin7446/items/b54ebda4ee91ea5f4ca2)
1. [Red Hat Developer Hub (Backstage) でGolden Pathを作ろう〜GitHub Integration編〜](https://qiita.com/shin7446/items/c35010c3ea566beadc5a)

# 今回作成するGolden Path
今回は以下のようなGolden Pathを作成します。
![ScreenShot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/e5c69ce7-0a0a-9d3d-5e72-bc99bae59a0a.png)

**Golden Path概要**
* 自分のOrganizationに新しいリポジトリ(`App`と`Manifest`)を作成して、事前に準備したGitリポジトリのテンプレート`Skeleton Repo`の中のファイル群を格納する
* `Manifest Repo`にあるArgoCDの`Application`リソースをデプロイして、Tektonの`Pileline`、およびGitHubからのWebhookを受けて`Pipeline`を実行するための`EventTrigger`を作成する

# Golden Pathのyamlファイルを作成する
Golden Pathを作成するために、まずはGolden Pathのyamlファイルやテンプレートとなる`Skeleton Repo`を作成します。

## Gitリポジトリの作成
あらかじめRHDHに連携したGitHub Organizationにて新しいリポジトリを作成します。作成手順は割愛しますが、公開範囲は`public`にしておきます。
名前は`sample-skeleton`としました。
![ScreenShot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/e9ce680a-8d70-8096-1a90-250c558a5307.png)

localにCloneしてきます。
```
git clone <Git Repo URL>
cd sample-skeleton
```

ファイルとディレクトリを作成します。
```
mkdir -p app-skeleton \
touch app-skeleton/catalog-info.yaml
touch template.yaml
```
できたディレクトリ構成はこんな感じ↓
```
tree
.
├── app-skeleton
│   └── catalog-info.yaml
└── template.yaml
```

gitにPushしておきます。
```
git add -A
git commit -m "fix"
git push origin main
```
それぞれのディレクトリの用途は以下の通りです。
* `app-skeleton`: このディレクトリは主にアプリケーションのサンプルコードとDockefileを格納します。開発者がメインで扱うリポジトリのSkeletonになります。


* `template.yaml`がGolden Path用のファイルになります。

## `template.yaml`の作成
まずは以下のような内容を追記し、GitHubにPushしましょう。`spec.owner`は適宜書き換えて下さい。
長いですが、後ほど中身を説明します。
```template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: sample-app-template
  title: Create a sample application with a CI pipeline
  description: Provides the sample code and CI pipeline to build and deploy a sample application on OpenShift.
  tags:
    - recommended
spec:
  owner: user:default/<自分のGitHub ID>
  type: service

  parameters:
    - title: Provide information about the new component
      required:
        - app_name
        - owner
        - system
      properties:
        app_name:
          title: Repository Name
          type: string
          default: "sample-app"
        description:
          title: Description
          type: string
          description: Help others understand what this component is for
        owner:
          title: Owner
          type: string
          description: Owner of the component
          ui:field: OwnerPicker
          ui:options:
            catalogFilter:
              kind:
                - Group
        system:
          title: System
          type: string
          ui:field: EntityPicker
          ui:options:
            catalogFilter:
              kind:
                - System

    - title: Provide information about the git to used
      required:
        - git
        - git_host_url
        - git_owner_name
      properties:
        git:
          title: Git of Destination
          type: string
          description: This action will store the application source code on the selected Git server
          enum:
            - github
          enumNames:
            - GitHub
      dependencies:
        git:
          oneOf:
            - properties:
                git:
                  enum:
                    - github
                git_host_url:
                  title: Git Host URL
                  type: string
                  default: github.com
                  description: Specify the GitHub or GitLab host URL(e.g., github.com)
                git_owner_name:
                  title: GitHub Organization Name or User Name
                  type: string
                  description: Specify the GitHub Organization or User to register the repository
  steps:
    - id: app_template
      name: Generating the Application Source Code Component
      action: fetch:template
      input:
        url: ./app-skeleton
        values:
          git: ${{ parameters.git }}
          git_host_url: ${{ parameters.git_host_url }}
          git_owner_name: ${{ parameters.git_owner_name }}
          app_name: ${{ parameters.app_name }}
          owner: ${{ parameters.owner }}
          system: ${{ parameters.system }}
          description: ${{ parameters.description }}
        targetPath: ./tenant-app

    - id: publish-app-to-github
      if: ${{ parameters.git == "github" }}
      name: Publish App Repository to GitHub
      action: publish:github
      input:
        repoUrl: ${{ parameters.git_host_url }}?owner=${{ parameters.git_owner_name }}&repo=${{ parameters.app_name }}-app
        repoVisibility: public
        sourcePath: ./tenant-app
        defaultBranch: develop
        protectDefaultBranch: false

    - id: register-to-github
      if: ${{ parameters.git == "github" }}
      name: Registering the Catalog Info Component to GitHub
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps['publish-app-to-github'].output.repoContentsUrl }}
        catalogInfoPath: "/catalog-info.yaml"
  output:
    links:
      - title: Open the Source Code Repository
        if: ${{ parameters.git == "github" }}
        url: ${{ steps['publish-app-to-github'].output.remoteUrl }}
      - title: Open the Catalog Info Component
        if: ${{ parameters.git == "github" }}
        icon: catalog
        entityRef: ${{ steps['register-to-github'].output.entityRef }}
```

次に`app-skeleton/catalog-info.yaml`にも追記を行います。
```app-skeleton/catalog-info.yaml
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: ${{ values.app_name }}
  {%- if values.description %}
  description: ${{ values.description }}
  {%- endif %}
spec:
  type: service
  system: ${{ values.system }}
  lifecycle: production
  owner: ${{ values.owner }}
  git: ${{ values.git }}
  git_host_url: ${{ values.git_host_url }}
  git_owner_name: ${{ values.git_owner_name }}
```

そして`ｔemplate.yaml`をRHDHが読み込むように、`app-config-rhdh.yaml`を変更します。

```(一部抜粋)app-config-rhdh.yaml
    catalog:
      providers:
        githubOrg:
          default:
            id: production
            orgUrl: 'https://github.com/${GITHUB_ORG_NAME}'
      # ここから
      locations:
      - type: url
        rules:
        - allow:
          - Template
        target: https://github.com/<作成したOrg名>/sample-skeleton/blob/main/template.yaml
      # ここまで
```
スクリプトを実行して設定を反映させます。
```
 ./create-secret.sh
```

## Golden Pathの実行
ではRHDHにアクセスして、`Create...`を選択しましょう。すると`Templates`に先程GitHubにアップした`template.yaml`をもとにひとつ追加されていることがわかります。
このTemplateの`CHOOSE`を選択します。
![ScreenShot 173.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/128e0914-bf0f-eb8a-8496-d699fd846704.png)


すると入力項目が表示されるので、そこで必要事項を入力します。`Repository Name`はデフォルトのまま`sample-app`に、`Onwer`はプルダウンで表示されたGitHub Team名を選択します。Systemはいったん`test-system`としましょう。
![ScreenShot 164.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/fa5fcca3-d33c-5863-fb91-3b76d0dd50a0.png)

`Next Step`を選択すると今度はGitの情報を入力します。
これはこのGolden Pathによって作成されるコピー先のGitHub情報になります。
`GitHub Organization Name or Use Name`にはGitHub Organization名か、自分のGitHub IDを入力します。
![ScreenShot 165.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/97a5acce-3f10-18d3-647b-0f71d66abe05.png)

情報が正しく入力されていることを確認し、`CREATE`を選択します。
 ![ScreenShot 166.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/4ace506c-f13f-ac39-e0bb-6f40b52c70c6.png)

するとパイプラインっぽいものが実行され、全てチェックが完了します。
![ScreenShot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/04bbf8ab-fc0f-c12d-2135-e0f76e996aff.png)


この状態で左メニューの`Catalog`を選択すると、さきほど入力した情報をもとに`Catalog`が払い出されました。
![ScreenShot 169.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/d5475033-db76-c068-e192-dee6c99d5663.png)

選択してみると、払い出された`Catalog`の情報が表示されます。
`About`の中の`VIEW SOURCE`を選択してみます。
![ScreenShot 170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/61fd3feb-8e70-64b1-98d5-df83c44b9a37.png)

すると別タブで、Golden Pathの実行によって作成されたappリポジトリが表示されます。中には`app-skeleton`に予め作成した`catalog-info.yaml`が格納されていることがわかります。
![ScreenShot 171.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/d1c42dd6-8ed9-82f8-3e6a-2b8745bacb3f.png)

## `template.yaml`を読み解く
とりあえずポチポチやってGolden Pathの実行が完了しましたが、その大元となる`template.yaml`の記載内容が理解できないと、何をしているのかピンとこないので、順番に読み解いていきましょう。

### 冒頭部分
```（抜粋）template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: sample-app-template
  title: Create a sample application with a CI pipeline
  description: Provides the sample code and CI pipeline to build and deploy a sample application on OpenShift.
  tags:
    - recommended
spec:
  owner: user:default/<自分のGitHub ID>
  type: service

...
```

まずは冒頭部分ですが、これはこのGolden Pathの概要が記述されています。
どのパラメータがどこに紐づいているかは、上記のコードとRHDHの画面を見比べると分かりやすいかと思います。
![ScreenShot 173.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/7942b62b-b674-1205-c962-dd375f8607b1.png)
* `metadata.name` : このGolden Pathの名前です。画面には反映されませんが、URLのPathとして使われます。
* `metadata.title` : このGolden Pathのタイトルです。画面ではこちらがGolden Path名になります。
* `metadata.description` : このGolden Pathの説明です。こちらも画面で確認できます。
* `metadata.tags` : このGolden Pathを検索する際に活用できるキーワードを設定します。
* `spec.owner` : このGolden Pathの管理者の名前です。
* `type: service` : このGolden Pathの属性を定義できます。任意の値を設定可能ですが、`service`か`api`がメジャーのようです。これもタイトルの上部に表示されます。

---

### `parameters`部分①
```(抜粋)template.yaml
  parameters:
    - title: Provide information about the new component
      required:
        - app_name
        - owner
        - system
      properties:
        app_name:
          title: Repository Name
          type: string
          default: "sample-app"
        description:
          title: Description
          type: string
          description: Help others understand what this component is for
        owner:
          title: Owner
          type: string
          description: Owner of the component
          ui:field: OwnerPicker
          ui:options:
            catalogFilter:
              kind:
                - Group
        system:
          title: System
          type: string
          ui:field: EntityPicker
          ui:options:
            catalogFilter:
              kind:
                - System
```
`parameters`では、基本的にリスト形式で利用者側に入力してほしい項目を書いていきます。
上記の記述範囲は以下の画面を構成しています。
![ScreenShot 164.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/3ad4a7a4-c005-a2e6-273c-911bc5107699.png)
* `title` : Stepごとの入力画面のタイトルになります。
* `required` : この入力画面で必須項目となるパラメータkeyを指定します。
* `properties.xxx` : `properties`配下に入力項目を並べていきます。`xxx`の部分がパラメータkeyになります。
    * `xxx.title` : 画面に表示するパラメータ名です。
    * `xxx.type` : パラメータの型を定義します。
    * `xxx.description` : このパラメータの説明です。こちらは画面に表示されるため、パラメータの補足として利用します。
    * `xxx.default` : このパラメータのデフォルト値です。

上記までが一般的な記述内容になります。一方で、例えばすでにRHDHに登録済みのパラメータ(`Group`や`User`、`System`など)を参照してプルダウン形式で選択させたい場合は、`ui:field:`と`ui:options:`を活用します。
* `xxx.ui:field` : `EntityPicker` `OwnerPicker` `RepoUrlPicker`の3種類から選択できます。それぞれパラメータの属性に応じて適切なものを選択します。詳細は[こちら](https://backstage.io/docs/features/software-templates/ui-options-examples/)を参照下さい。
    * `xxx.ui:field.OwnerPicker.catalogFilter` : ここでプルダウンで表示させる値をフィルタリングしています。`owner`の場合はRHDH内に登録してある`group`、すなわちGitHubのTeam名がここに表示されることになります。

このtemplateでは、この`ui:field`を`onwer`と`system`というパラメータで使用しています。
onwerについては上記で説明した`OwnerPicker`でRHDH上に登録してある`kind: onwer`の情報を取得しています。
systemでは`EntityPicker`でRHDH上に登録してある`kind: system`の情報を取得します。

---
### `parameters`部分②
```(抜粋)template.yaml
    - title: Provide information about the git to used
      required:
        - git
        - git_host_url
        - git_owner_name
      properties:
        git:
          title: Git of Destination
          type: string
          description: This action will store the application source code on the selected Git server
          enum:
            - github
          enumNames:
            - GitHub
      dependencies:
        git:
          oneOf:
            - properties:
                git:
                  enum:
                    - github
                git_host_url:
                  title: Git Host URL
                  type: string
                  default: github.com
                  description: Specify the GitHub or GitLab host URL(e.g., github.com)
                git_owner_name:
                  title: GitHub Organization Name or User Name
                  type: string
                  description: Specify the GitHub Organization or User to register the repository
```
この部分では主にGolden Pathをもとにユーザーに払い出されるGitHubの情報を入力する画面を設定しています。
基本的な記述方法は全画面と同様ですが、ここでは新しい記述方法があります。
* `properties.git.enum` : これは、ユーザーに設定する選択肢を耐える場合に利用します。プルダウンで表示するため`ui:field`と似ていますが、RHDH上のリソースを選択するのではなく、純粋にパラメータ(ここでは`git`というパラメータ)に設定したい文字列や数値をリストで記載できます。今回は`github`という値のみしか選択肢に表示されない記述となっていますが、例えば`gitlab`という選択肢を増やして、作成先のGitサービスを選択させるといった使い方もできます。（その際は別途`app-config`でGitLabとの連携設定が必要です。）

* `properties.git.enumNames` : これは`enum`で設定した値を設定する際、画面上ではどんな文字列にするかを指定できます。今回の場合は`github`という値を`git`に設定する場合、`GitHub`という選択肢を画面上で指定する、といった意味になります。`enum`の記載順序と合わせておく必要があります。

* `dependencies` : これは、ある値によって画面に表示させる入力画面を分けたい場合に使用します。画面で入力する際、`Git of Detination`を`GitHub`にしたタイミングで`Git Host URL`や`GitHub Organization Name or User Name`の入力欄が表示されたかと思います。その挙動はこの記述によって実現されています。
* `dependencies.git.oneOf` : ここでは`git`の入力値によって表示画面を使い分けることを記述しています。`oneOf`配下にリスト形式で使い分ける画面の情報を記述します。
* `dependencies.git.oneOf.properties.git.enum:[github]` : この記述によって、"`git=github`の時にこの入力画面を表示させる"ことができます。

ユーザーに入力させる画面を生成する`parameters`部分の説明は以上です。
次にGolden Pathの実行部分である`steps`を見ていきます。

### `steps.id: app_template`
```（抜粋）template.yaml
  steps:
    - id: app_template
      name: Generating the Application Source Code Component
      action: fetch:template
      input:
        url: ./app-skeleton
        values:
          git: ${{ parameters.git }}
          git_host_url: ${{ parameters.git_host_url }}
          git_owner_name: ${{ parameters.git_owner_name }}
          app_name: ${{ parameters.app_name }}
          owner: ${{ parameters.owner }}
          system: ${{ parameters.system }}
          description: ${{ parameters.description }}
        targetPath: ./tenant-app
```
`steps`では、Golden Pathの実行部分を記述します。このstepsはリスト形式で各処理を記述していき、その順番通りに実行されていきます。その実行される内容を指定しているのが`action`になります。

#### Templateのactionについて
このactionが実質RHDHで自動化するタスクを表しています。
actionの種類はプラグインの導入によって増やすことが可能です。
`https://<RHDHのURL>/create/actions`にアクセスすることで、現在の状態で利用可能な`action`を確認することができます。
今回は`action: fetch:template`を指定しているので、その部分を見てみましょう。
![ScreenShot 178.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/51ee3d8c-1e23-a681-1d3d-530e5e1f764f.png)
`Downloads a skeleton, templates variables into file and directory names and content, and places the result in the workspace, or optionally in a subdirectory specified by the targetPath input option.`
とあるように、テンプレート元から情報を取得して、変数を代入してワークスペースに格納する`action`になります。

まずはパラメータを確認していきましょう。
* `input.url` : 取得するテンプレートの相対パスになります。この`template.yaml`は`sample-skeleton`リポジトリ直下にあるため、そこからの相対パスとして`./app-skeleton`を指定しています。
* `input.values` : この値が変数に代入するパラメータになります。
* `input.targetPath` : これはローカル（RHDH Pod内）のワークスペースを指定します。ディレクトリがなければ`/tmp`配下に作成されます。今回は`tenant-app`に`app-skeleton`のファイル群を一時的に格納します。



"変数を代入"というところについては、すでに皆さんも作成済の`catalog-info.yaml`で記述しています。
```app-skeleton/catalog-info.yaml
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: ${{ values.app_name }}
  {%- if values.description %}
  description: ${{ values.description }}
  {%- endif %}
spec:
  type: service
  system: ${{ values.system }}
  lifecycle: production
  owner: ${{ values.owner }}
  git: ${{ values.git }}
  git_host_url: ${{ values.git_host_url }}
  git_owner_name: ${{ values.git_owner_name }}
```
このファイルは`app-skeleton`ディレクトリ配下に作成したので、これも`fetch:template`actionにて取得されています。そして`${{ values.app_name }}`というような形で記述すると、`input.values`で渡した値に書き換えてくれます。
たいていのGolden Pathは、GitにあるSkeletonを取得して変数を代入してPushする、という処理になるかと思うので、このactionの記述方法は理解しておきましょう。

### `steps.id: publish-app-to-github`
```（抜粋）template.yaml
    - id: publish-app-to-github
      if: ${{ parameters.git == "github" }}
      name: Publish App Repository to GitHub
      action: publish:github
      input:
        repoUrl: ${{ parameters.git_host_url }}?owner=${{ parameters.git_owner_name }}&repo=${{ parameters.app_name }}-app
        repoVisibility: public
        sourcePath: ./tenant-app
        defaultBranch: develop
        protectDefaultBranch: false
```
ここでは`publish:github`という`action`を指定しています。
これはローカルにあるデータをもとに、GitHubに新しいリポジトリとしてPushするものです。
パラメータを見ていきましょう。
* `if` : これはこのactionを実行する際の条件を指定します。ここでは`parameters.git`が`github`の場合のみ実行するよう指定しています。
* `input.repoUrl` : Pushする先のGitHubのURLです。これでPushできる先は前回の記事で連携設定を行ったOrganizationに限られます。ただ、`parameters.git_owner_name`はGitHubのTeamから取得したTeam名をプルダウンで選択させているため、今回はユーザーは気にせず設定可能です。
* `input.repoVisibility` : GitHubのリポジトリの公開設定です。`Public`か`Private`を設定できます。
* `input.sourcePath` : GitHubにPushするデータが格納されているパスを指定します。ここでは前の`fetch:template`actionでskeletonから取得＆変数代入を行った`./tenant-app`を指定します。
* `input.defaultBranch` : Pushする際のデフォルトのBranchになります。今回は`develop`をデフォルトのブランチとしています。
* `input.protectDefaultBranch` : GitHubはデフォルトブランチが保護されています。今回はデモ実行する際に保護していない方がラクなので`false`にします。

### `steps.id: register-to-github`
```（抜粋）template.yaml
    - id: register-to-github
      if: ${{ parameters.git == "github" }}
      name: Registering the Catalog Info Component to GitHub
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps['publish-app-to-github'].output.repoContentsUrl }}
        catalogInfoPath: "/catalog-info.yaml"
```
`catalog:register`actionは、指定のGitリポジトリに存在するRHDHの`catalog`用yamlファイルをRHDHに登録することができます。
これによって、今回新たに作成されたgitリポジトリ上の`catalog-info.yaml`をRHDHから確認できる状況になります。このactionのおかげでRHDHの画面上からComponentを確認できるようになります。
![ScreenShot 176.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/fbc5de6d-ccfe-17ce-a49a-91ee15a89775.png)

## `output`
```（抜粋）template.yaml
  output:
    links:
      - title: Open the Source Code Repository
        if: ${{ parameters.git == "github" }}
        url: ${{ steps['publish-app-to-github'].output.remoteUrl }}
      - title: Open the Catalog Info Component
        if: ${{ parameters.git == "github" }}
        icon: catalog
        entityRef: ${{ steps['register-to-github'].output.entityRef }}
```
ここは、Golden Pathの実行結果の画面に表示する内容を記述します。
主にGolden Pathで生成されたGitリポジトリのURLや`catalog-info.yaml`のURLなどを貼るケースが多いかと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/756229b2-52fb-5065-9eae-b44f6c8bcf85.png"  width=50%>

# おわりに

以上が今回の`Template`すなわちGolden Pathの全貌になります。
次回はさらにこの`Template`を拡充していき、実践的なものに仕上げていきます。


# 【番外編】Catalogって何なんだ？
RHDH(Backstage)は`User`や`Group`、などいくつかの`kind`を持っています。そしてそれらの`kind`は、RHDH上ではすべて`Catalog`という親コンポーネントの配下に存在する形になります。実は今回作成したGolden Pathも`Template`という`kind`であり、これも`Catalog`のひとつです。またこのGolden Pathによってデプロイされた環境を管理するために作成した`catalog-info.yaml`も、中身を見てみると`kind: Component`となっています。これも実は`Catalog`の一種です。
```catalog-info.yaml
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: sample-app
  description: test description
spec:
  type: service 
  system: sample-system
  lifecycle: production
  owner: group:default/skitamura-team
  git: github
  git_host_url: github.com
  git_owner_name: rhdh-skitamura-org
```

本編ではスルーしていましたが、実は`System`も`Template`や`Component`と同様に`Catalog`として事前にyamlで定義することができます。

ためしに、今の状態でCatalog一覧の`Owned components`にある`test-system`を選択してみます。
![ScreenShot 176.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/fbc5de6d-ccfe-17ce-a49a-91ee15a89775.png)

するとWarningが出てきます。これは、RHDH上で`test-system`という`system`が登録されていないことが原因です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/13194f69-45f5-f408-fde4-812722cb7d73.png"  width=50%>

ここで以下のような`catalog-info.yaml`を`sample-skeleton`配下に置きます。
```
apiVersion: backstage.io/v1alpha1
kind: System
metadata:
  name: test-system
  description: test-system
spec:
  owner: <GitHubのTeam名>
```
これをGitHubにPushしておきます。

そして、`app-config-rhdh.yaml`の`location`にこのyamlファイルを読み込むように設定します。
```（抜粋）app-config-rhdh.yaml
      locations:
      - type: url
        rules:
        - allow:
          - Template
        target: https://github.com/<作成したOrg名>/sample-skeleton/blob/main/template.yaml
      # ここから
      - type: url
        rules:
        - allow:
          - System
        target: https://github.com/<作成したOrg名>/sample-skeleton/blob/main/system.yaml
      # ここまで
```

設定を反映させます。
```
./create-secret.sh
```

この状態で先程と同様に`test-system`を選択すると、以下のように`test-system`の画面が表示されます。
![ScreenShot 180.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/d79708a7-06dc-32f7-38b4-efa190ffa44c.png)
システムによっては、いくつかのマイクロサービスの集合体となっている場合があります。この`System`をうまく使うことで、それぞれのGolden Pathがどのシステムの一部なのかを効率よく管理することができます。

ちなみに`Catalog`画面左のkindのプルダウンを開くと、これまで色々設定・作成したリソース種別が確認できます。このようにRHDH(Backstage)においては、様々なコンポーネント（`User`,`Group`,`System`,`Templete`など）を`Catalog`として管理します。そして基本的にその`Catalog`の元となる情報はGitHubやGitLabに格納されたyamlファイルを参照して管理されることを把握しておきましょう。
![ScreenShot 181.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/b8c98e52-bace-3d70-52ee-3e98dedd62e6.png)