Zum Hauptinhalt springen
Version: Weekly Build

Erstellen von Service Providern

Codesphere ermöglicht es dir, bestehende Codesphere-Landscapes als Managed Service Provider zu veröffentlichen. Dadurch können andere Entwickler deine individuellen Lösungen entdecken und einsetzen.

Landscape-basierte Service Provider

Ein Landscape-basierter Service Provider ermöglicht es anderen, deine Codesphere-Landscape als vorkonfigurierten Managed Service zu instanziieren, den sie über den Servicekatalog bereitstellen und verwalten können.

info

Das Veröffentlichen von Providern erfordert Cluster-Admin-Berechtigungen. Team-Admins können beantragen, dass Provider auf bestimmte Teams beschränkt werden.

Voraussetzungen

Bevor du einen Landscape-basierten Service Provider erstellst, benötigst du:

  1. Ein Git-Repository, das eine gültige Codesphere-Landscape mit einer ci.yml-Datei enthält.
  2. Eine Provider-Definition, entweder als provider.yml-Datei im Root-Verzeichnis des Repositorys oder direkt in der API-Anfrage angegeben.
  3. Git-Zugriff auf das Landscape-Repository. Codesphere zieht das Repository über deine Git-Verbindung, daher muss das Konto, mit dem du den Provider erstellst, über die entsprechende Zugriffsberechtigung verfügen. Deine Git-Verbindungen kannst du in deinen Benutzereinstellungen verwalten.

Der Git-Zugriff ist an einen Benutzer gebunden

Für das Abrufen des Landscape-Repositorys wird die Git-Verbindung des Benutzers verwendet, der den Provider erstellt (oder zuletzt aktualisiert) hat. Verliert dieser Benutzer den Zugriff auf das Repository, schlagen Deployments des Providers fehl. Um den Provider auf die Git-Verbindung eines anderen Benutzers zu übertragen, sendet dieser Benutzer eine PUT- oder PATCH-Anfrage für den Provider — anschließend wird dessen Verbindung für das Abrufen verwendet. Bei langlebigen Providern empfiehlt sich die Veröffentlichung über einen technischen Benutzer.

Provider-Definition

Die Datei provider.yml definiert alle Metadaten und Konfigurationsschemas für deinen Service Provider.

name: mattermost
schemaVersion: v1
author: Your Team
displayName: Mattermost
iconUrl: https://example.com/mattermost-icon.png
category: collaboration
description: |
Open-source team messaging and collaboration platform.
Supports channels, direct messaging, and file sharing.

backend:
landscape:
gitUrl: https://github.com/your-org/mattermost-landscape

configSchema:
type: object
properties:
SITE_NAME:
type: string
description: Display name for your Mattermost instance
default: mattermost
readOnly: false
MAX_USERS:
type: integer
description: Maximum number of users allowed
x-update-constraint: increase-only
required: ['MAX_USERS']

secretsSchema:
type: object
properties:
ADMIN_PASSWORD:
type: string
format: password

detailsSchema:
type: object
properties:
hostname:
type: string
port:
type: integer

plans:
# The plan has no influence on the resource usage, so you should only define one.
# You can also set plans to an empty array to disable the plan selection UI.
- id: 0
name: Default Plan
description: Resource usage depends on the ci-profile of the landscape.
parameters: {}

versions:
0.0.1:
ciProfile: debug
# gitRef can be a commit-hash, branch or tag
gitRef: 1a410efbd13591db07496601ebc7a059dd55cfe9
description: Initial release
1.0.0-rc:
appVersion: Nextcloud v33
ciProfile: prod
gitRef: release-branches/1-0-0-rc
description: |
Release Candidate.
Changelog:
- Feature X
- Feature Y
- Fix Z
1.0.0:
appVersion: Nextcloud v33
ciProfile: prod
gitRef: release-tags/1-0-0
description: Long Term Support Release
scope:
type: team
teamIds: [4008]

Provider-Felder

FeldBeschreibung
nameEindeutige Kennung für den Provider. Muss dem Muster ^[-a-z0-9_]+$ entsprechen.
versionVersionsstring im Format v[0-9]+ (z. B. v1, v2).
displayNameMenschenlesbarer Name, der im Marketplace UI angezeigt wird.
iconUrlURL zum Provider-Icon (absoluter oder relativer Pfad).
categoryKategorisierung (z. B. databases, messaging, monitoring).
authorOrganisation oder Einzelperson, die für den Provider verantwortlich ist.
descriptionMarkdown-formatierte Beschreibung des Services.
backend.landscape.gitUrlGit-Repository-URL, die die Landscape-Konfiguration enthält.
configSchemaJSON Schema, das die vom Benutzer konfigurierbaren Optionen definiert. Diese Werte werden der Landscape als Umgebungsvariablen übergeben.
secretsSchemaJSON Schema, das geheime Werte definiert (z. B. Passwörter). Diese Werte werden im Secrets Vault der Landscape gesetzt.
detailsSchemaJSON Schema, das die nach der Provisionierung bereitgestellten Runtime-Details definiert.
versionsVersionen des Services, die Benutzer deployen können. Mindestens eine Version ist erforderlich. Siehe Provider-Versionen.
scopeSichtbarkeit des Providers: global macht ihn für alle verfügbar, team beschränkt ihn auf die aufgeführten teamIds. Siehe Provider-Scopes.

configSchema, secretsSchema und detailsSchema erfüllen unterschiedliche Zwecke, verwenden aber dasselbe Format: Jedes muss ein gültiges OpenAPI-Schema-Objekt sein, da Codesphere sie auf dieser Basis parst. Wie in OpenAPI können Eigenschaften als required markiert oder mit sinnvollen default-Werten versehen werden.

Nachfolgend siehst du, wo die jeweiligen Schema-Typen in der Codesphere-UI erscheinen:

Das configSchema definiert die Konfigurationseigenschaften, die der Benutzer beim Erstellen eines Services festlegt — zum Beispiel die zu deployende PostgreSQL-Version. Nach der Erstellung des Services kann die Konfiguration in den Service-Einstellungen eingesehen werden. Eigenschaften, die nicht als readOnly markiert sind, können später aktualisiert werden (siehe Update-Einschränkungen).

Config Schema in den Service-Einstellungen

vorsicht

Das Aktualisieren von Konfigurationsparametern kann zu einem kurzen Ausfall des Services führen.

Provider-Versionen

Jeder Provider muss mindestens einen Eintrag in versions definieren. Jede Version legt den exakten Zustand der zu deployenden Landscape fest:

  • gitRef: Ein Commit-Hash, Branch oder Tag des Landscape-Repositorys.
  • ciProfile: Das CI-Profil aus der ci.yml-Datei der Landscape, das für das Deployment verwendet wird.
  • appVersion (optional): Eine menschenlesbare Bezeichnung für die deployte Anwendungsversion.
  • description (optional): Markdown-formatierte Release-Notes, die dem Benutzer angezeigt werden.

Beim Erstellen eines Services wählt der Benutzer aus, welche Version deployt werden soll.

Veraltete Felder

backend.landscape.ciProfile und backend.landscape.gitRef wurden früher verwendet, um diese Werte einmalig für den gesamten Provider zu definieren. Sie sind veraltet — ciProfile und gitRef werden nun pro Version definiert — bleiben jedoch aus Gründen der Abwärtskompatibilität verfügbar.

Veröffentlichen und Aktualisieren eines Landscape-basierten Providers

Der empfohlene Weg, einen Provider zu veröffentlichen und zu aktualisieren, ist der idempotente Upsert-Endpunkt der Codesphere Public API. Sende eine PUT-Anfrage an /managed-services/providers:

  • Existiert noch kein Provider mit demselben name und derselben schemaVersion, wird er erstellt.
  • Existiert bereits einer, werden alle veränderbaren Felder direkt aktualisiert.

Das bedeutet, du kannst dieselbe Anfrage verwenden, um einen Provider zu erstellen und um spätere Änderungen auszurollen — du musst nicht nachverfolgen, ob der Provider bereits existiert. Das ist zum Beispiel in CI/CD-Pipelines nützlich.

Du kannst entweder eine Git-URL angeben, die die provider.yml-Datei enthält, oder die vollständige Provider-Spezifikation direkt im Payload bereitstellen.

tipp

Es gibt weiterhin dedizierte Endpunkte für Erstellung (POST) und Aktualisierung (PATCH) für partielle Updates und explizitere Workflows. Für die meisten Fälle ist der Upsert-Endpunkt jedoch die einfachste Wahl.

Versionen können nur ergänzt werden

Du kannst neue Einträge zu versions hinzufügen, aber bestehende Versionseinträge können über einen Upsert nicht geändert oder entfernt werden. Alle anderen Provider-Felder werden direkt aktualisiert.

Der einfachste Ansatz ist die Angabe der Git-Repository-URL. Codesphere ruft die provider.yml-Datei automatisch aus deinem Repository ab und validiert sie.

hinweis

Wird gitRef nicht angegeben, wird der Standard-Branch des Repositorys verwendet, um die provider.yml-Datei abzurufen.

curl -X PUT "https://<your-codesphere-url>/api/managed-services/providers" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"gitUrl": "https://github.com/your-org/mattermost-landscape",
"gitRef": "my-branch",
"scope": {
"type": "global"
}
}'

Provider-Scopes

Beim Erstellen eines Providers kannst du dessen Sichtbarkeitsbereich festlegen:

Scope-TypBeschreibung
globalFür alle Teams der Codesphere-Instanz verfügbar. Erfordert Cluster-Admin-Berechtigungen.
teamNur für die angegebenen Teams verfügbar. Ein Array von teamIds wird angegeben.

Übergabe von Konfiguration an Landscapes

Wird ein Service aus einem Landscape-basierten Provider erstellt, werden die Eingaben des Benutzers an die Landscape weitergegeben: Eigenschaften aus dem configSchema werden als Umgebungsvariablen gesetzt, und Secrets aus dem secretsSchema werden in den Vault der Landscape eingefügt. Beide können in der ci.yml-Datei der Landscape referenziert werden:

schemaVersion: v0.2
run:
my-service:
steps:
- command: ./start.sh
env:
APP_VERSION: ${{ workspace.env['APP_VERSION'] }}
ADMIN_PASSWORD: ${{ vault.ADMIN_PASSWORD }}

In diesem Beispiel ist APP_VERSION eine Eigenschaft des configSchema des Providers und ADMIN_PASSWORD eine Eigenschaft des secretsSchema des Providers.

Update-Einschränkungen mit x-update-constraint

Das configSchema unterstützt eine benutzerdefinierte Erweiterung x-update-constraint, mit der du einschränken kannst, wie einzelne Eigenschaften nach der Erstellung eines Services geändert werden können. Das ist nützlich, um betriebliche Regeln durchzusetzen — zum Beispiel um zu verhindern, dass Speicherplatz verringert wird, oder um die Version einer Datenbank-Engine nach der Ersteinrichtung festzuschreiben.

Füge das Schlüsselwort x-update-constraint zu einer beliebigen Eigenschaft in deinem configSchema hinzu:

configSchema:
type: object
properties:
storage:
type: integer
description: Storage allocation in GB
x-update-constraint: increase-only
version:
type: string,
description: Version of the Postgres DB.
enum: ['17.6', '16.10', '15.14', '14.19', '13.22']
x-update-constraint: immutable,

Verfügbare Einschränkungen

EinschränkungVerhalten
increase-onlyDer neue Wert muss größer oder gleich dem aktuellen Wert sein. Gilt nur für numerische Felder.
immutableDie Eigenschaft kann nach dem Setzen nicht mehr geändert werden.

info

Update-Einschränkungen greifen nur beim Aktualisieren eines bestehenden Services. Bei der Ersterstellung werden alle Werte akzeptiert, solange sie die Standard-Schemavalidierung bestehen.

Unterstützte Formate

Provider-Schemas verwenden die JSON Schema-Validierung. Die folgenden format-Werte werden in Schema-Eigenschaften unterstützt:

int32, int64, float, double, byte, binary, date, date-time, password, uri, hostname

Dynamische Details mit x-endpoint

Das detailsSchema unterstützt eine benutzerdefinierte OpenAPI-Erweiterung x-endpoint, mit der du Runtime-Details dynamisch von deinem Service abrufen kannst. Das ist nützlich, um Live-Statusinformationen, Metriken oder andere Daten abzurufen, die sich nach der Provisionierung ändern.

Ist x-endpoint für eine Eigenschaft gesetzt, ruft Codesphere den Wert vom angegebenen Endpunkt ab. Die Endpunkt-URL unterstützt Interpolation mithilfe anderer Details-Felder.

detailsSchema:
type: object
properties:
hostname:
type: string
port:
type: integer
status:
type: object
properties:
state:
type: string
uptime:
type: number
x-endpoint: "https://{{hostname}}:{{port}}/status"

In diesem Beispiel wird die Eigenschaft status dynamisch über den /status-Endpunkt des Services abgerufen, unter Verwendung der Werte hostname und port.

info

Für x-endpoint werden nur GET-Anfragen unterstützt. Der Endpunkt muss JSON zurückgeben, das der Schema-Definition der Eigenschaft entspricht.

Benutzerdefinierte REST-Backends

Die Managed-Services-Architektur von Codesphere ist erweiterbar konzipiert. Falls Landscape-basierte Provider deinen spezifischen Anforderungen nicht entsprechen, kannst du dein eigenes benutzerdefiniertes REST-Backend implementieren.

tipp

Eine vollständige Anleitung zur Implementierung der Managed Service Adapter API-Spezifikation findest du unter Ein benutzerdefiniertes REST-Backend erstellen.