初探 Backstage:快速上手指南
Backstage 簡(jiǎn)介
Backstage 是一個(gè)用于構(gòu)建開發(fā)人員門戶的開放平臺(tái),統(tǒng)一了所有基礎(chǔ)設(shè)施工具、服務(wù)和文檔,以創(chuàng)建端到端的簡(jiǎn)化開發(fā)環(huán)境,由 Spotify 開源并捐贈(zèng)給 CNCF[2]。Backstage 提供了開箱即用的幾個(gè)核心功能:
軟件目錄
軟件目錄[3](Software Catalog)是一個(gè)集中式系統(tǒng),用于跟蹤生態(tài)系統(tǒng)中所有軟件(服務(wù)、網(wǎng)站、庫(kù)、數(shù)據(jù)管道等)的所有權(quán)和元數(shù)據(jù)。開發(fā)人員提供軟件的實(shí)體信息,Backstage 根據(jù)實(shí)體的信息與已有實(shí)體建立關(guān)聯(lián),并生成最終版本的軟件實(shí)體保存在目錄中。
從 Backstage 倉(cāng)庫(kù)的軟件目錄示例中可以找到 多種類型的實(shí)體定義[4]。
軟件模板
軟件模板[5] (Software Template)是一個(gè)可以幫助開發(fā)在 Backstage 中創(chuàng)建組件的工具。默認(rèn)情況下,它能夠加載代碼骨架、帶有變量中的模板,然后將模板發(fā)布到某些位置,例如 GitHub 或 GitLab。
技術(shù)文檔
技術(shù)文檔[6](TechDocs) 是 Spotify 自行開發(fā)的直接內(nèi)置于 Backstage 中的類文檔代碼解決方案。開發(fā)人員在與代碼一起存在的 Markdown 文件中編寫文檔 - 只需很少的配置即可在 Backstage 中獲得一個(gè)漂亮的文檔站點(diǎn)。
插件支持
插件支持[7](Plugins)Backstage 本身是一個(gè)由一組插件組成的單頁(yè)面應(yīng)用程序,通過插件平臺(tái)開發(fā)人員可以將幾乎任何類型的基礎(chǔ)設(shè)施或軟件開發(fā)工具作為 Backstage 中的功能公開。
我覺得插件是 Backstage 的最大亮點(diǎn),通過 插件生態(tài)系統(tǒng)[8] 極大增強(qiáng)的可定制性,目前 Backstage 有 5 個(gè)核心插件以及近 200 個(gè)第三方插件。
圖片
要運(yùn)行 Backstage 可以直接在本地運(yùn)行,也可以進(jìn)行容器化部署。
本地運(yùn)行
為了在本地運(yùn)行 Backstage,需要 NodeJS 18、yarn 1.22 和 npx 環(huán)境。以下是啟動(dòng) Backstage 的步驟:
創(chuàng)建 Backstage App
執(zhí)行下面的命令,并根據(jù)提示輸入應(yīng)用名創(chuàng)建 Backstage 應(yīng)用。也可以使用 我創(chuàng)建的[9]。
npx @backstage/create-app@latest
默認(rèn)情況下,本地運(yùn)行使用 better-sqlite3 來作為軟件目錄的存儲(chǔ)。啟動(dòng)之前需要執(zhí)行下面的命令:
npm rebuild better-sqlite3
啟動(dòng) Backstage
之后就可以執(zhí)行 yarn dev 啟動(dòng) Backstage,在瀏覽器中打開 http://localhost:3000 就能訪問 Backstage 了。
圖片
當(dāng)然 Backstage 也支持?jǐn)?shù)據(jù)庫(kù)進(jìn)行持久化,比如 PostgreSQL??梢栽?nbsp;app-config.yaml 中,將數(shù)據(jù)庫(kù)配置為下面:
backend:
database:
# client: better-sqlite3
# connection: ':memory:'
client: pg
connection:
host: ${POSTGRES_SERVICE_HOST}
port: ${POSTGRES_SERVICE_PORT}
user: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
修改配置后,添加環(huán)境變量并重新執(zhí)行命令。
export POSTGRES_SERVICE_HOST=127.0.0.1
export POSTGRES_SERVICE_PORT=5432
export POSTGRES_USER= backstage
export POSTGRES_PASSWORD=backstage
yarn dev
添加軟件實(shí)體
我在已有的一個(gè) Java 項(xiàng)目中,添加了 `catalog-info.yaml`[10] 并添加了軟件實(shí)體信息。
圖片
在軟件目錄的頁(yè)面上依次點(diǎn)擊 CREATE 和 REGISTER EXISTING COMPONENT,在表單中填入上面的 catalog-info.yaml 的地址 https://github.com/addozhang/tekton-demo/blob/main/catalog-info.yaml,然后點(diǎn)擊 ANALYZE 和 IMPORT。
此時(shí)就可以看到導(dǎo)入的實(shí)體信息以及根據(jù)信息創(chuàng)建的組件關(guān)系。
圖片
除了展示軟件的信息,我們希望對(duì)項(xiàng)目進(jìn)行構(gòu)建。我提前為其添加了一個(gè) GitHub 工作流[11],接下來看看如何在 Backstage 上進(jìn)行構(gòu)建。
配置 CI/CD
此時(shí)如果打開 CI/CD 卡片,可以彈窗要求對(duì) Backstage 進(jìn)行授權(quán)允許其訪問 GitHub 倉(cāng)庫(kù)。由于配置認(rèn)證提供這,會(huì)看到如下錯(cuò)誤。
圖片
在 GitHub 開發(fā)者設(shè)置[12] 中填入信息創(chuàng)建一個(gè)應(yīng)用:
- 應(yīng)用程序名稱:Backstage(或者其他名字)
- 主頁(yè)網(wǎng)址:http://localhost:3000
- 授權(quán)回調(diào) URL:http://localhost:7007/api/auth/github/handler/frame
創(chuàng)建成功后,可以獲取 CLIENT_ID 和 CLIENT_SECRET。
修改 Backstage 的配置文件 app-config.yaml,添加配置:
auth:
environment: development
providers:
github:
development:
clientId: ${AUTH_GITHUB_CLIENT_ID}
clientSecret: ${AUTH_GITHUB_CLIENT_SECRET}
其中
export POSTGRES_SERVICE_HOST=127.0.0.1
export POSTGRES_SERVICE_PORT=5432
export POSTGRES_USER= backstage
export POSTGRES_PASSWORD=backstage
export AUTH_GITHUB_CLIENT_ID=e1c1fc80ec2014c91543
export AUTH_GITHUB_CLIENT_SECRET=0641e5e5af60c485a03f19f8bf63218d06ab7876
yarn dev
圖片
Kubernetes 上運(yùn)行
首先要有個(gè) K8s 集群。在 Kubernetes 上我們這次使用 PostgreSQL 作為持久化存儲(chǔ)。
kubectl create namespace backstage
部署 PostgreSQL
創(chuàng)建 Secret 用于配置 PostgreSQL 的認(rèn)證信息。
kubectl apply -n backstage -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: postgres-secrets
type: Opaque
data:
POSTGRES_USER: YmFja3N0YWdl
POSTGRES_PASSWORD: YmFja3N0YWdl
EOF
使用本地磁盤創(chuàng)建 PVC 和 PVC。
kubectl apply -n backstage -f - <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-storage
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 2G
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: '/mnt/data'
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-storage-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2G
EOF
部署 PostgreSQL。
kubectl apply -n backstage -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: backstage
spec:
replicas: 1
selector:
matchLabels:
app: backstage
template:
metadata:
labels:
app: backstage
spec:
containers:
- name: backstage
image: addozhang/backstage
imagePullPolicy: Always
ports:
- name: http
containerPort: 7007
envFrom:
- secretRef:
name: postgres-secrets
- secretRef:
name: github-oauth-secrets
---
apiVersion: v1
kind: Service
metadata:
name: backstage
spec:
selector:
app: backstage
ports:
- name: http
port: 80
targetPort: http
EOF
配置 GitHub OAuth 認(rèn)證信息
kubectl apply -n backstage -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: github-oauth-secrets
type: Opaque
data:
AUTH_GITHUB_CLIENT_ID: <CLIENT_ID base64>
AUTH_GITHUB_CLIENT_SECRET: <CLIENT_SECRET base64>
EOF
部署 Backstage
kubectl apply -n backstage -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: backstage
spec:
replicas: 1
selector:
matchLabels:
app: backstage
template:
metadata:
labels:
app: backstage
spec:
volumes:
- name: config-volume
configMap:
name: bs-app-config
items:
- key: "app-config.production.yaml"
path: "app-config.production.yaml"
containers:
- name: backstage
image: addozhang/backstage:latest
imagePullPolicy: Always
ports:
- name: http
containerPort: 7007
envFrom:
- secretRef:
name: github-oauth-secrets
- secretRef:
name: postgres-secrets
---
apiVersion: v1
kind: Service
metadata:
name: backstage
spec:
selector:
app: backstage
ports:
- name: http
port: 80
targetPort: http
EOF
訪問 Backstage 頁(yè)面 http://localhost:7077。
kubectl port-forward --namespace=backstage svc/backstage 7007:80
總結(jié)
通過這篇文章,我們了解了 Backstage 的基本概念和如何在不同環(huán)境中運(yùn)行它。
我認(rèn)為,Backstage 更適合被定義為一個(gè)開發(fā)者門戶而不是一個(gè)全面的開發(fā)者平臺(tái)。它本質(zhì)上是一個(gè)靈活的框架,而非一個(gè)即開即用的全套解決方案。為了充分發(fā)揮其潛力,平臺(tái)團(tuán)隊(duì)需要深入了解開發(fā)人員的需求,并通過引入或開發(fā)專門的插件來定制 Backstage,從而實(shí)現(xiàn)真正的自服務(wù)能力。
此外,Backstage 并不意味著要取代 DevOps。事實(shí)上,DevOps 更多是一種文化和實(shí)踐理念,而非具體的工具。Backstage 的框架加插件的組合方式,實(shí)際上是為了解決 DevOps 實(shí)踐中遇到的具體挑戰(zhàn),尤其是在其落地實(shí)施的最后階段。
總之,Backstage 為開發(fā)者提供了一個(gè)強(qiáng)大而靈活的工具集,通過集成多樣的功能和服務(wù),幫助團(tuán)隊(duì)更好地實(shí)現(xiàn) DevOps 理念,提升開發(fā)效率和項(xiàng)目管理的效能。
參考資料
[1] Backstage: https://backstage.io
[2] Spotify 開源并捐贈(zèng)給 CNCF: https://backstage.io/blog/2022/03/16/backstage-turns-two/#out-of-the-sandbox-and-into-incubation
[3] 軟件目錄: https://backstage.io/docs/features/software-catalog/
[4] 多種類型的實(shí)體定義: https://github.com/backstage/backstage/tree/master/packages/catalog-model/examples
[5] 軟件模板: https://backstage.io/docs/features/software-templates/
[6] 技術(shù)文檔: https://backstage.io/docs/features/techdocs/
[7] 插件支持: https://backstage.io/docs/plugins/
[8] 插件生態(tài)系統(tǒng): https://backstage.io/plugins/
[9] 我創(chuàng)建的: https://github.com/addozhang/backstage-quickstart
[10] catalog-info.yaml: https://github.com/addozhang/tekton-demo/blob/main/catalog-info.yaml
[11] GitHub 工作流: https://github.com/addozhang/tekton-demo/blob/main/.github/workflows/build.yml
[12] GitHub 開發(fā)者設(shè)置: https://github.com/settings/developers