Aller au contenu

Backstage

Plateforme open-source de portail développeur interne par Spotify pour gérer le catalogue logiciel et l’expérience développeur.

CommandeDescription
npx @backstage/create-app@latestCréer une nouvelle application Backstage
npx @backstage/create-app@latest --skip-installCréer l’application sans installer les dépendances
cd my-backstage-app && yarn installInstaller les dépendances
yarn devDémarrer le frontend et le backend en mode développement
yarn startDémarrer le frontend uniquement
yarn start-backendDémarrer le backend uniquement
yarn build:backendCompiler le backend pour la production
yarn buildCompiler tous les paquets
node_modules/.bin/backstage-cli --versionAfficher la version du CLI Backstage
CommandeDescription
yarn build:backend --config ../../app-config.yamlCompiler le backend avec la config
docker build -t backstage -f packages/backend/Dockerfile .Construire l’image Docker
docker run -p 7007:7007 backstageExécuter le conteneur Backstage
CommandeDescription
yarn backstage-cli package startDémarrer un paquet en mode dev
yarn backstage-cli package buildCompiler un paquet
yarn backstage-cli package lintAnalyser le code source du paquet
yarn backstage-cli package testExécuter les tests du paquet
yarn backstage-cli repo build --allCompiler tous les paquets du monorepo
yarn backstage-cli repo lint --allAnalyser tous les paquets
yarn backstage-cli versions:bumpMettre à jour les dépendances Backstage vers la dernière version
yarn backstage-cli versions:bump --release nextMettre à jour vers la pré-version suivante
yarn backstage-cli migrate package-rolesMigrer les paquets pour utiliser les rôles
CommandeDescription
yarn backstage-cli create-pluginCréer un nouveau plugin frontend
yarn backstage-cli create-plugin --backendCréer un nouveau plugin backend
yarn backstage-cli create-plugin --id my-pluginCréer un plugin avec un ID spécifique
yarn newCréer interactivement un composant à partir d’un template
CommandeDescription
Ajouter catalog-info.yaml à la racine du dépôtEnregistrer un composant dans le catalogue
kind: Component dans catalog-info.yamlDéfinir un composant logiciel
kind: API dans catalog-info.yamlDéfinir une entité API
kind: System dans catalog-info.yamlDéfinir un regroupement système
kind: Domain dans catalog-info.yamlDéfinir un domaine métier
kind: Resource dans catalog-info.yamlDéfinir une ressource d’infrastructure
kind: Group dans catalog-info.yamlDéfinir une équipe/un groupe
kind: User dans catalog-info.yamlDéfinir un utilisateur
kind: Location dans catalog-info.yamlRéférencer d’autres fichiers de catalogue
CommandeDescription
Définir spec.owner: team-nameDéfinir la propriété de l’entité
Définir spec.lifecycle: productionDéfinir l’étape du cycle de vie de l’entité
Définir spec.type: serviceDéfinir le type de composant (service, website, library)
Définir spec.dependsOn: ['component:other']Définir les dépendances
Définir spec.providesApis: ['api-name']Déclarer les APIs fournies
Définir spec.consumesApis: ['api-name']Déclarer les APIs consommées
Définir spec.system: system-nameAssigner à un système
Définir metadata.annotations pour les intégrationsConnecter au CI/CD, monitoring, etc.
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: payment-service
  description: Handles payment processing and billing
  annotations:
    github.com/project-slug: org/payment-service
    backstage.io/techdocs-ref: dir:.
    jenkins.io/job-full-name: payment-service/main
    pagerduty.com/service-id: PABC123
    sonarqube.org/project-key: org_payment-service
  tags:
    - java
    - payments
  links:
    - url: https://dashboard.example.com/payments
      title: Monitoring Dashboard
      icon: dashboard
    - url: https://wiki.example.com/payment-service
      title: Wiki
spec:
  type: service
  lifecycle: production
  owner: team-payments
  system: billing
  providesApis:
    - payment-api
  consumesApis:
    - user-api
    - notification-api
  dependsOn:
    - resource:payments-db
    - component:auth-service
apiVersion: backstage.io/v1alpha1
kind: API
metadata:
  name: payment-api
  description: Payment processing REST API
  tags:
    - rest
    - payments
spec:
  type: openapi
  lifecycle: production
  owner: team-payments
  system: billing
  definition: |
    openapi: "3.0.0"
    info:
      title: Payment API
      version: 1.0.0
    paths:
      /payments:
        post:
          summary: Create a payment
          responses:
            "201":
              description: Payment created
apiVersion: backstage.io/v1alpha1
kind: System
metadata:
  name: billing
  description: Billing and payment processing system
spec:
  owner: team-payments
  domain: commerce
---
apiVersion: backstage.io/v1alpha1
kind: Domain
metadata:
  name: commerce
  description: E-commerce domain covering orders, payments, and fulfillment
spec:
  owner: group:engineering-leadership
CommandeDescription
kind: Template dans template.yamlDéfinir un template logiciel
Définir spec.type: serviceLe template crée un service
Définir spec.steps[] pour les actions du templateDéfinir les étapes de scaffolding
action: fetch:templateRécupérer et rendre les fichiers du template
action: publish:githubPublier le dépôt scaffoldé sur GitHub
action: publish:github:pull-requestCréer une PR au lieu d’un nouveau dépôt
action: catalog:registerEnregistrer l’entité créée dans le catalogue
action: github:actions:dispatchDéclencher un workflow GitHub Actions
Utiliser ${{ parameters.name }} dans les templatesRéférencer les paramètres de saisie utilisateur
Définir spec.parameters[] pour les champs de formulaireDéfinir le formulaire de saisie du template
Utiliser ui:widget: textarea dans les paramètresPersonnaliser le widget de champ de formulaire
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: microservice-template
  title: Create a Microservice
  description: Scaffold a new microservice with CI/CD, monitoring, and docs
  tags:
    - recommended
    - microservice
spec:
  owner: team-platform
  type: service
  parameters:
    - title: Service Details
      required:
        - name
        - description
        - owner
      properties:
        name:
          title: Service Name
          type: string
          description: Unique name of the service
          ui:autofocus: true
          ui:options:
            rows: 5
        description:
          title: Description
          type: string
        owner:
          title: Owner
          type: string
          description: Team that owns this service
          ui:field: OwnerPicker
          ui:options:
            catalogFilter:
              kind: Group
    - title: Infrastructure
      properties:
        language:
          title: Language
          type: string
          enum: ["go", "java", "python", "typescript"]
          default: go
        database:
          title: Database
          type: string
          enum: ["postgres", "mysql", "none"]
          default: postgres
        enableMonitoring:
          title: Enable Monitoring
          type: boolean
          default: true
  steps:
    - id: fetch-base
      name: Fetch Base Template
      action: fetch:template
      input:
        url: ./skeleton
        values:
          name: ${{ parameters.name }}
          description: ${{ parameters.description }}
          owner: ${{ parameters.owner }}
          language: ${{ parameters.language }}
    - id: publish
      name: Publish to GitHub
      action: publish:github
      input:
        allowedHosts: ["github.com"]
        repoUrl: github.com?owner=my-org&repo=${{ parameters.name }}
        description: ${{ parameters.description }}
        defaultBranch: main
        repoVisibility: internal
    - id: register
      name: Register in Catalog
      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 }}
CommandeDescription
yarn add @backstage/plugin-catalogInstaller le plugin catalogue
yarn add @backstage/plugin-techdocsInstaller le plugin TechDocs
yarn add @backstage/plugin-kubernetesInstaller le plugin Kubernetes
yarn add @backstage/plugin-github-actionsInstaller le plugin GitHub Actions
yarn add @backstage/plugin-searchInstaller le plugin recherche
yarn add @backstage/plugin-scaffolderInstaller le plugin scaffolder
yarn add @backstage/plugin-api-docsInstaller le plugin documentation API
yarn add @backstage/plugin-cost-insightsInstaller le plugin analyse des coûts

Enregistrer les plugins frontend dans packages/app/src/App.tsx :

import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';
import { TechDocsReaderPage } from '@backstage/plugin-techdocs';
import { SearchPage } from '@backstage/plugin-search';

const routes = (
  <FlatRoutes>
    <Route path="/catalog" element={<CatalogIndexPage />} />
    <Route path="/catalog/:namespace/:kind/:name" element={<CatalogEntityPage />}>
      <EntityLayout>
        <EntityLayout.Route path="/" title="Overview">
          <EntityOverviewContent />
        </EntityLayout.Route>
        <EntityLayout.Route path="/api" title="API">
          <EntityApiContent />
        </EntityLayout.Route>
        <EntityLayout.Route path="/docs" title="Docs">
          <EntityTechDocsContent />
        </EntityLayout.Route>
      </EntityLayout>
    </Route>
    <Route path="/docs" element={<TechDocsReaderPage />} />
    <Route path="/search" element={<SearchPage />} />
    <Route path="/catalog-graph" element={<CatalogGraphPage />} />
  </FlatRoutes>
);

Enregistrer les plugins backend dans packages/backend/src/index.ts :

import { createBackend } from '@backstage/backend-defaults';

const backend = createBackend();

backend.add(import('@backstage/plugin-app-backend'));
backend.add(import('@backstage/plugin-catalog-backend'));
backend.add(import('@backstage/plugin-catalog-backend-module-github-org'));
backend.add(import('@backstage/plugin-scaffolder-backend'));
backend.add(import('@backstage/plugin-techdocs-backend'));
backend.add(import('@backstage/plugin-search-backend'));
backend.add(import('@backstage/plugin-search-backend-module-catalog'));
backend.add(import('@backstage/plugin-search-backend-module-techdocs'));
backend.add(import('@backstage/plugin-auth-backend'));
backend.add(import('@backstage/plugin-auth-backend-module-github-provider'));
backend.add(import('@backstage/plugin-kubernetes-backend'));

backend.start();
CommandeDescription
npx @techdocs/cli servePrévisualiser TechDocs localement
npx @techdocs/cli serve --docker-image techdocs-containerServir avec une image Docker personnalisée
npx @techdocs/cli generateGénérer le site statique TechDocs
npx @techdocs/cli generate --source-dir .Générer depuis un répertoire spécifique
npx @techdocs/cli publish --publisher-type googleGcsPublier TechDocs sur GCS
npx @techdocs/cli publish --publisher-type awsS3Publier TechDocs sur S3
Ajouter l’annotation backstage.io/techdocs-refActiver TechDocs pour une entité
Créer un répertoire docs/ avec mkdocs.ymlConfigurer la source TechDocs
Définir techdocs.builder: 'local' dans la configUtiliser le builder TechDocs local
Définir techdocs.builder: 'external' dans la configUtiliser un builder CI/CD externe
site_name: Payment Service
nav:
  - Home: index.md
  - Architecture: architecture.md
  - API Reference: api-reference.md
  - Runbooks:
      - Deployment: runbooks/deployment.md
      - Incident Response: runbooks/incident-response.md
plugins:
  - techdocs-core
markdown_extensions:
  - admonition
  - pymdownx.highlight
  - pymdownx.superfences
CommandeDescription
yarn add @backstage/plugin-searchInstaller le frontend de recherche
yarn add @backstage/plugin-search-backendInstaller le backend de recherche
yarn add @backstage/plugin-search-backend-module-catalogAjouter le collator de recherche du catalogue
yarn add @backstage/plugin-search-backend-module-techdocsAjouter le collator de recherche TechDocs
Configurer le moteur de recherche dans app-config.yamlConfigurer Lunr, Elasticsearch ou PgStore
Définir search.pg dans la configUtiliser PostgreSQL pour la recherche
Définir search.elasticsearch dans la configUtiliser Elasticsearch pour la recherche
CommandeDescription
Modifier app-config.yamlFichier de configuration principal
Modifier app-config.local.yamlSurcharges de développement local
Modifier app-config.production.yamlConfiguration de production
Définir app.baseUrl dans la configConfigurer l’URL du frontend
Définir backend.baseUrl dans la configConfigurer l’URL du backend
Définir backend.database dans la configConfigurer la connexion à la base de données
Définir backend.cors.origin dans la configConfigurer les origines CORS
Définir auth.providers dans la configConfigurer les fournisseurs d’authentification
Définir catalog.locations[] dans la configAjouter des sources d’entités au catalogue
Définir catalog.rules[] dans la configDéfinir les règles de validation des entités
Définir integrations.github[] dans la configConfigurer le token d’intégration GitHub
app:
  title: My Company Developer Portal
  baseUrl: http://localhost:3000

organization:
  name: My Company

backend:
  baseUrl: http://localhost:7007
  listen:
    port: 7007
  cors:
    origin: http://localhost:3000
    methods: [GET, HEAD, PATCH, POST, PUT, DELETE]
  database:
    client: pg
    connection:
      host: ${POSTGRES_HOST}
      port: ${POSTGRES_PORT}
      user: ${POSTGRES_USER}
      password: ${POSTGRES_PASSWORD}

integrations:
  github:
    - host: github.com
      token: ${GITHUB_TOKEN}

auth:
  environment: development
  providers:
    github:
      development:
        clientId: ${GITHUB_CLIENT_ID}
        clientSecret: ${GITHUB_CLIENT_SECRET}

catalog:
  import:
    entityFilename: catalog-info.yaml
    pullRequestBranchName: backstage-integration
  rules:
    - allow: [Component, System, API, Resource, Location, Domain, Group, User]
  locations:
    - type: url
      target: https://github.com/my-org/backstage-catalog/blob/main/all-components.yaml
    - type: github-discovery
      target: https://github.com/my-org
    - type: github-org
      target: https://github.com/my-org

techdocs:
  builder: local
  generator:
    runIn: local
  publisher:
    type: local

kubernetes:
  serviceLocatorMethod:
    type: multiTenant
  clusterLocatorMethods:
    - type: config
      clusters:
        - url: ${K8S_CLUSTER_URL}
          name: production
          authProvider: serviceAccount
          serviceAccountToken: ${K8S_TOKEN}
RelationDeVersDescription
ownerOfGroup/UserComponent/APILe groupe possède l’entité
ownedByComponent/APIGroup/UserL’entité est possédée par le groupe
consumesApiComponentAPILe composant utilise une API
providesApiComponentAPILe composant expose une API
dependsOnComponentComponent/ResourceLe composant dépend d’un autre
dependencyOfComponent/ResourceComponentEst une dépendance de
partOfComponentSystemLe composant appartient au système
hasPartSystemComponentLe système contient le composant
parentOfGroupGroupRelation d’équipe parente
childOfGroupGroupRelation d’équipe enfant
memberOfUserGroupL’utilisateur appartient au groupe
hasMemberGroupUserLe groupe contient l’utilisateur
  1. Utiliser catalog-info.yaml dans chaque dépôt — assurez-vous que tous les services, bibliothèques et APIs sont enregistrés dans le catalogue pour une visibilité complète.

  2. Définir une propriété significative — chaque entité devrait avoir un champ owner pointant vers un Group valide, permettant la responsabilisation et le routage.

  3. Annoter richement les entités — ajoutez des annotations pour le CI/CD, le monitoring, PagerDuty et la documentation pour faire du catalogue un véritable hub.

  4. Créer des templates pour les golden paths — utilisez le scaffolder pour définir des manières standardisées de créer de nouveaux services, garantissant la cohérence.

  5. Implémenter TechDocs — gardez la documentation à côté du code en utilisant le plugin TechDocs et mkdocs.yml pour une documentation vivante.

  6. Utiliser la découverte GitHub — configurez github-discovery dans les emplacements du catalogue pour découvrir et enregistrer automatiquement les dépôts.

  7. Modéliser votre organisation — définissez les Groups et Users pour refléter la structure de votre équipe, permettant le suivi de la propriété et les pages d’équipe.

  8. Garder app-config.yaml sensible à l’environnement — utilisez app-config.local.yaml pour le développement et des variables d’environnement pour les secrets de production.

  9. Construire un écosystème de plugins — créez des plugins frontend et backend personnalisés pour étendre Backstage avec les outils spécifiques de votre organisation.

  10. Définir des Systems et Domains — modélisez l’architecture de haut niveau en utilisant Systems et Domains pour donner aux développeurs une carte de votre plateforme.