Erstellen eines Static Builds
Diese Seite erklärt, wie eine Landscape für den Export vorbereitet wird und wie der Export über den Landscape Config Editor oder die Public API ausgeführt wird.
Voraussetzungen
Eine v0.5-Landscape-Konfiguration
Static Builds erfordern mindestens schemaVersion: v0.5. Der Export lehnt ältere Konfigurationen ab, und der Landscape Config Editor bietet an, eine v0.4-Konfiguration mit einem Klick zu migrieren. In v0.5 listet ein Service seine Ports als einfache Zahlen auf, und der Service, der den öffentlichen Traffic der Landscape empfängt, benennt seinen Port unter network.landscapeGateway. Eine Landscape mit mehreren öffentlichen Services fügt einen Router-Service mit type: router und network.isLandscapeGateway: true hinzu, der die Pfade enthält.
schemaVersion: v0.5
prepare:
steps:
- name: Install dependencies
command: npm ci
- name: Compile
command: npm run build
run:
web:
image: node:24-slim
plan: 21
network:
ports: [3000]
landscapeGateway:
httpPort: 3000
steps:
- name: Start
command: node dist/server.js
Der Landscape Config Editor bearbeitet v0.5-Konfigurationen, bei allem, was das Formular nicht zeigt, auf Edit YAML klicken. Eine v0.5-Landscape wird wie jede andere bereitgestellt, also vor dem Export testen.
Aktualisieren des CI.yml-Schemas mit einem Klick in der UI.
Ein Image auf jedem Reactive
In einer regulären Deployment läuft ein Reactive ohne image auf dem Base Image des Workspace. Ein Static Build kann noch nicht auf dieses Image zurückfallen. Er baut jeden Reactive auf dem im image-Feld genannten Image auf, und der Export schlägt bei einem Reactive ohne dieses Feld fehl. Ein Image wählen, das die vom Startbefehl benötigte Runtime mitbringt, zum Beispiel node:24-slim oder python:3.13-slim. Im visuellen Editor unter Runtime Config in den Service-Einstellungen Custom Base Image auswählen.
Nur kopierte Dateien gelangen ins Image
Das Image eines Reactive enthält drei Dinge: das Base Image, die Pfade, die sein build-Abschnitt hineinkopiert, und seinen Startbefehl. Nichts anderes aus dem Workspace wird übernommen. Insbesondere:
- Im Workspace installierte Tools bleiben dort, egal ob sie über
nix,aptoder einenprepare-Schritt installiert wurden. Ihre Dateien werden nicht kopiert, und die Shell-Umgebung des Workspace, die sie in denPATHeinträgt, ist ebenfalls nicht Teil des Images. - Dateien unter
/home/user/app, die nicht untercopyaufgeführt sind, einschließlich Abhängigkeiten, dieprepareinstalliert hat, wienode_modulesoder eine virtuelle Umgebung.
Ein Service, der im Workspace problemlos startet, kann daher im Artefakt mit einem fehlenden Befehl oder Modul fehlschlagen. Für jedes Tool und jede Abhängigkeit, die der Startbefehl benötigt, entweder ein Base Image verwenden, das es mitbringt, oder es in einem build-Schritt erzeugen und hineinkopieren. Das Beispiel im nächsten Abschnitt kopiert dist, node_modules und package.json für eine Node-Anwendung. Nach dem Export das <profile> (static build)-Profil, das er im Workspace hinterlässt, deployen, um das Ergebnis zu prüfen, bevor das Artefakt weitergegeben wird.
Registry-Zugangsdaten
Für eine private Ziel-Registry die Zugangsdaten einmalig unter Team > Settings > Container Registries konfigurieren. Der Export verwendet den Eintrag, dessen Adresse mit dem Ziel-Repository übereinstimmt, und dieselben Einträge ermöglichen es auch, private Base Images zu ziehen. Siehe Verwendung einer privaten Registry.
Option A: Konfigurieren einer neuen Container-Registry durch Navigation zu den Resource-Group-(Team-)Einstellungen aus der Workspace-Tabelle.
Option B: Konfigurieren einer neuen Container-Registry aus dem Static-Build-Export-Dialog.
Konfigurieren des Build-Abschnitts
Jeder Reactive kann einen build-Abschnitt enthalten, der angibt, welche Workspace-Dateien in sein Image gelangen und welche Befehle vor dem Kopieren ausgeführt werden. Ohne einen solchen enthält das Image nur das Base Image und den Startbefehl.
- UI
- YAML
Im Landscape Config Editor die Einstellungen des Reactive öffnen und zum Tab Build wechseln.
- Optional Context festlegen, das Verzeichnis, in dem die Schritte ausgeführt werden, relativ zum Workspace-Root.
- Unter Copy Mapping für jeden Pfad, der ins Image kopiert werden soll, auf Add Path klicken. Source ist relativ zum Context, Destination ist ein Pfad innerhalb des Images.
- Unter Steps für Befehle, die vor dem Kopieren ausgeführt werden sollen, auf Add Step klicken.
- Den Service speichern.
Konfigurieren der Build-Schritte für ausgewählte Services.
run:
web:
image: node:24-slim
steps:
- command: node dist/server.js
build:
context: .
copy:
- dist:dist
- node_modules:node_modules
- package.json:package.json
steps:
- name: Drop dev dependencies
command: npm prune --omit=dev
- context (optional): das Verzeichnis, in dem die Schritte ausgeführt werden, relativ zum Workspace-Root. Standardwert
.. - copy (optional): Einträge im Format
source:destination. Die Quelle ist relativ zum Context. Ein relatives Ziel landet unter/home/user/appim Image, wo diestepsdes Services ausgeführt werden. - steps (optional): Befehle, die der Reihe nach im Context-Verzeichnis ausgeführt werden, bevor die Pfade kopiert werden.
Die Build-Schritte laufen nach den prepare-Schritten des Profils, im Workspace, der den Export durchführt, sodass sie sich auf alles verlassen können, was prepare installiert hat. Nur die kopierten Pfade gelangen ins Image.
Exportieren
- UI
- Public API
- Deploy > Landscape Config Editor öffnen und das gewünschte CI Profile auswählen. Änderungen speichern, der Export ist verfügbar, sobald das Profil gespeichert und gültig ist.
- Auf Export as Static Build in der Editor-Kopfzeile klicken.
- Das Target-Repository eingeben, zum Beispiel
registry.example.com/team-1/shop, und einen Tag, zum Beispielv1. - Auf Export klicken.
Der Dialog zeigt den Fortschritt des Exports an. Er kann geschlossen werden, der Export läuft weiter. Nach Abschluss zeigt der Dialog Static Build Pushed mit der Artefakt-Referenz, und der Workspace erhält ein Profil namens <profile> (static build) mit der exportierten Konfiguration, sodass die statische Version direkt dort deployt werden kann, um das Ergebnis zu überprüfen.
Exportieren einer Landscape als Static Build.
POST /api/static-builds startet einen Export aus einem Workspace oder einem Git-Repository und liefert eine conversionId zurück. Siehe Public API für die Authentifizierung.
curl -X POST "https://<your-codesphere-url>/api/static-builds" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source": { "workspaceId": 12345 },
"ciFileName": "ci.prod.yml",
"target": {
"repository": "registry.example.com/team-1/shop",
"indexTag": "v1"
}
}'
Um stattdessen aus einem Git-Repository zu exportieren, zum Beispiel aus einer Release-Pipeline, eine Git-Quelle übergeben. Das Repository wird in einen temporären Workspace des angegebenen Teams und Plans geklont, der nach dem Export gelöscht wird:
"source": {
"teamId": 1,
"planId": 21,
"gitUrl": "https://github.com/your-org/shop",
"gitRef": "v1.0.0",
"isPrivateRepo": false
}
ciFileName ist optional und ist standardmäßig ci.yml. GET /api/static-builds/{conversionId}/events streamt den Fortschritt als Server-Sent Events. Das letzte Ereignis ist entweder converted, mit der Artefakt-Referenz und dem Digest jedes gepushten Images, oder failed mit dem Fehler.
curl -N "https://<your-codesphere-url>/api/static-builds/<conversionId>/events" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: text/event-stream"
Ein Export kann mit Warnungen abgeschlossen werden. Sie weisen auf Teile der Landscape hin, die das Artefakt nicht vollständig erfasst, zum Beispiel einen Reactive ohne build-Abschnitt.
Ein Verbraucher liest ein privates Artefakt mit den Container-Registry-Zugangsdaten der Resource Group (Team), die es deployt, nicht mit den eigenen. Siehe Private Artefakte.