Dependencies¶
Polycrate unterstützt Block-Dependencies durch die from: Referenz in der workspace.poly. Wenn ein Block-Instanz von einem Template-Block erbt, wird dieser automatisch als Dependency behandelt.
from: nur in workspace.poly
Die from:-Angabe erfolgt ausschließlich in der workspace.poly, nicht in der block.poly. Siehe Vererbung für Details.
Wie funktionieren Dependencies?¶
In der workspace.poly referenzieren Block-Instanzen Template-Blocks via from::
# workspace.poly
blocks:
- name: my-postgres
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1 # <- Dependency
config:
namespace: production
In diesem Beispiel ist der Registry-Block cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1 eine Dependency. Polycrate erkennt dies automatisch und pullt den Block bei Bedarf.
Dependency-Auflösung¶
Interaktiver Dependency-Prompt¶
Ab Version 0.28.0 zeigt Polycrate einen interaktiven Prompt, wenn beim Laden eines Workspaces fehlende oder veraltete Block-Dependencies erkannt werden.
Erkannte Status:
| Status | Bedeutung | Aktion |
|---|---|---|
| [MISSING] | Block ist nicht installiert | Block wird gepullt |
| [UPGRADE] | Installierte Version ist älter als angefordert | Update auf neue Version |
| [DOWNGRADE] | Installierte Version ist neuer als angefordert ⚠️ | Warnung + Bestätigung erforderlich |
Beispiel-Prompt:
┌─────────────────────────────────────────────────────────────────────────────┐
│ Block Dependency Issues │
├─────────────────────────────────────────────────────────────────────────────┤
│ The following block dependencies need to be resolved: │
│ │
│ ● cargo.ayedo.cloud/ayedo/k8s/cert-manager:v2.0.0 [MISSING] │
│ └─ required by: cert-manager │
│ │
│ ● cargo.ayedo.cloud/ayedo/k8s/ingress-nginx:v1.5.0 [UPGRADE] │
│ └─ installed: v1.4.0 → requested: v1.5.0 │
│ │
├─────────────────────────────────────────────────────────────────────────────┤
│ ▸ Install/Update all │
│ Solve manually │
└─────────────────────────────────────────────────────────────────────────────┘
Optionen:
- Install/Update all - Alle Abhängigkeiten automatisch auflösen
- Solve manually - Zeigt die benötigten Befehle zur manuellen Auflösung
Downgrade-Warnung
Bei Downgrades (Installation einer älteren Version als bereits installiert) wird eine zusätzliche Bestätigung angefordert, da Downgrades zu Datenverlust oder Inkompatibilitäten führen können.
CI/CD-Umgebungen:
In nicht-interaktiven Umgebungen (CI/CD-Pipelines, Pipes) wird automatisch eine detaillierte Fehlermeldung mit allen benötigten Befehlen ausgegeben:
Block dependency issues found:
MISSING: cargo.ayedo.cloud/ayedo/k8s/cert-manager:v2.0.0
required by: cert-manager
UPGRADE: cargo.ayedo.cloud/ayedo/k8s/ingress-nginx
installed: v1.4.0 → requested: v1.5.0
To resolve, run:
polycrate block pull cargo.ayedo.cloud/ayedo/k8s/cert-manager:v2.0.0
polycrate block pull cargo.ayedo.cloud/ayedo/k8s/ingress-nginx:v1.5.0
Or use: polycrate run --blocks-auto-pull <block>.<action>
Polycrate erkennt automatisch gängige CI/CD-Umgebungen (GitHub Actions, GitLab CI, Jenkins, CircleCI, etc.) und deaktiviert interaktive Prompts.
Automatische Auflösung mit --blocks-auto-pull¶
Alternativ können Sie das --blocks-auto-pull Flag verwenden. Polycrate pullt dann automatisch alle fehlenden Dependencies ohne Prompt:
# Bei jeder Workspace-Interaktion
polycrate run my-postgres install --blocks-auto-pull
# Bei Workflow-Ausführung
polycrate workflows run deploy-stack --blocks-auto-pull
Mit --blocks-auto-pull werden alle in der workspace.poly referenzierten Blocks automatisch von der Registry gepullt, falls sie nicht lokal vorhanden sind.
Nicht-interaktiver Modus¶
Mit dem Flag --non-interactive können Sie interaktive Prompts explizit deaktivieren:
In diesem Modus wird bei fehlenden Dependencies ein Fehler ausgegeben statt eines Prompts.
Manuelles Pullen von Dependencies¶
Sie können Dependencies auch manuell pullen:
# Block von Registry pullen (vollständiger Pfad erforderlich)
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
# Von eigener Registry pullen
polycrate blocks pull registry.my-org.com/infra/postgres:1.2.0
Vollständiger Registry-Pfad erforderlich
Kurznamen wie postgres-base:1.2.0 funktionieren nicht. Sie müssen immer den vollständigen Registry-Pfad angeben:
Dependencies in workspace.poly¶
Alle Dependencies werden in der workspace.poly definiert:
# workspace.poly
name: my-workspace
blocks:
# Cluster-Block (Template von Registry)
- name: k8s
from: registry.my-org.com/blocks/k8s/cluster:1.0.0
# Datenbank-Block (Template von Registry)
- name: postgres
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
kubeconfig:
from: k8s # Nutzt Kubeconfig vom k8s-Block
config:
namespace: databases
# App-Block (lokaler Template-Block)
- name: my-app
from: my-app-template # Lokaler Block in blocks/my-app-template/
kubeconfig:
from: k8s
Ein Level Vererbung
Es gibt nur ein Level der Vererbung: Block-Instanz → Template-Block. Keine Verkettung von from: in verschiedenen block.poly Dateien.
Dependency-Quellen¶
Dependencies werden in der workspace.poly definiert und können aus verschiedenen Quellen stammen:
1. Lokale Template-Blocks¶
Wenn base-app im lokalen Workspace existiert (in blocks/base-app/), wird er direkt als Template verwendet.
2. Registry-Blocks¶
Wenn der Block nicht lokal vorhanden ist, wird er von der angegebenen Registry gepullt.
Vollständiger Registry-Pfad erforderlich
Kurznamen wie postgres-base werden nicht automatisch vom Hub gepullt. Polycrate interpretiert sie als lokale Blocks. Verwenden Sie immer den vollständigen Registry-Pfad:
Praktische Workflows¶
Workflow 1: Projekt-Setup mit Dependencies¶
# 1. Workspace klonen
git clone https://github.com/myorg/my-workspace.git
cd my-workspace
# 2. Alle Dependencies automatisch pullen (bei vollständigen Registry-Pfaden in workspace.poly)
polycrate run my-app install --blocks-auto-pull
# Oder manuell:
# polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
# polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/redis:0.1.5
# polycrate run my-app install
Workflow 2: Dependency aktualisieren¶
Achtung: Block-Versionen sind Singletons
Eine Block-Version kann nur einmal im Workspace existieren. Beim Pullen einer neuen Version wird der bestehende Template-Block vollständig überschrieben. Alle Block-Instanzen, die diesen Block nutzen, müssen danach aktualisiert werden!
# 1. Prüfen, welche Instanzen den Block nutzen
grep -r "cloudnative-pg" workspace.poly
# 2. Neue Version pullen (überschreibt alte Version!)
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.4.0
# 3. ALLE Block-Instanzen in workspace.poly anpassen:
# from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.4.0
# 4. Workspace validieren
polycrate workspace compile
# 5. Testen
polycrate run my-postgres install
Wichtig: Wenn mehrere Instanzen denselben Template-Block nutzen, müssen alle from:-Referenzen aktualisiert werden, sonst kompiliert der Workspace nicht.
Workflow 3: CI/CD mit Dependencies¶
# .github/workflows/deploy.yml
name: Deploy
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install Polycrate
run: |
curl -sSL https://get.polycrate.io | bash
- name: Deploy with auto-pull
run: |
polycrate run my-app install --blocks-auto-pull
Dependency-Management Best Practices¶
1. Explizite Versionierung verwenden¶
Immer explizite Versionen angeben
Block-Instanzen sollten die Block-Version im from:-Key immer explizit angeben, um böse Überraschungen zu vermeiden. Ohne explizite Version riskieren Sie, dass polycrate block pull unbeabsichtigt eine andere Version installiert.
Nutzen Sie spezifische Versionen für stabile Dependencies:
# workspace.poly
blocks:
# ✅ Gut: Explizite, spezifische Version
- name: my-postgres
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
# ❌ Schlecht: Latest (kann unerwartet brechen)
- name: my-postgres-bad
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:latest
# ❌ Schlecht: Keine Version (riskiert unerwartete Updates)
- name: my-postgres-risky
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg
Warum explizite Versionen kritisch sind:
- Reproduzierbarkeit: Identisches Verhalten bei jedem
polycrate block pull - Keine Überraschungen: Kein versehentliches Up-/Downgrade
- Team-Konsistenz: Alle Team-Mitglieder arbeiten mit derselben Version
- Rollback-Sicherheit: Bei Problemen wissen Sie genau, zu welcher Version Sie zurückkehren können
2. Lokale Kopien für Anpassungen¶
Wenn Sie eine Dependency anpassen müssen, pullen Sie sie lokal:
# Dependency lokal pullen
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
# Jetzt ist sie in blocks/cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg/
# Sie können sie anpassen (z.B. Playbooks modifizieren)
# workspace.poly - Block nutzt automatisch die lokale Kopie
blocks:
- name: my-postgres
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1 # Nutzt lokale Kopie wenn vorhanden
3. Private Registries¶
Für private/proprietäre Blocks nutzen Sie private Registries:
Authentifizierung über:
# Docker Registry Login
docker login registry.mycompany.com
# Polycrate nutzt Docker-Credentials
polycrate blocks pull registry.mycompany.com/apps/base-app:1.0.0
4. Dependency-Dokumentation¶
Dokumentieren Sie Dependencies in der Workspace-README:
# my-workspace
## Externe Dependencies
| Block | Template | Version | Beschreibung |
|-------|----------|---------|--------------|
| `my-postgres` | `cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg` | `1.2.0` | PostgreSQL-Datenbank |
| `my-app` | `registry.mycompany.com/apps/base-app` | `1.0.0` | Interne App |
## Installation
polycrate run my-postgres install --blocks-auto-pull
Troubleshooting¶
Dependency nicht gefunden¶
Lösung:
# Manuell pullen mit vollständigem Registry-Pfad
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
# Oder auto-pull verwenden (bei vollständigem Registry-Pfad in workspace.poly)
polycrate run my-app install --blocks-auto-pull
Vollständiger Registry-Pfad
Stellen Sie sicher, dass in workspace.poly der vollständige Registry-Pfad verwendet wird, z.B. from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
Block-Versionen sind Singletons¶
Kritisches Konzept verstehen
Ein Template-Block aus der Registry kann im Workspace nicht in mehreren Versionen gleichzeitig existieren. Es gibt keine parallele Installation von z. B. …/cloudnative-pg:1.3.1 und …/cloudnative-pg:1.4.0 im selben Workspace.
- Eine Version pro Block: Alle Block-Instanzen, die denselben Registry-Block nutzen, müssen dieselbe
from:-Version (eine Zeile, ein Tag) referenzieren. pullersetzt die Vorlage:polycrate blocks pullmit einer anderen Version ersetzt die lokale Kopie dieser Block-Vorlage; es bleibt nicht absichtlich eine ältere Version „nebenher“ bestehen.- Canary / parallele Tests gehören in einen anderen Workspace, einen Branch oder eine sequenzielle Migration – nicht in zwei konkurrierende
from:-Versionen in einerworkspace.poly.
Beispiel: Mehrere Instanzen, eine Version:
# workspace.poly - Beide Instanzen teilen sich denselben Template-Block
blocks:
- name: app-database
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1 # ← Teilen sich
config:
namespace: app
- name: analytics-database
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1 # ← denselben Block!
config:
namespace: analytics
Was passiert bei einem Update:
# Neue Version pullen - ÜBERSCHREIBT den bestehenden Block!
polycrate block pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.4.0
Nach dem Pull müssen alle Instanzen aktualisiert werden:
# workspace.poly - ALLE from:-Referenzen anpassen!
blocks:
- name: app-database
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.4.0 # ← Aktualisiert
- name: analytics-database
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.4.0 # ← Aktualisiert
Workflow für sichere Updates
- Vor dem Pull:
grep -r "block-name" workspace.polyum alle Instanzen zu finden - Pull durchführen:
polycrate block pull ... - Alle Referenzen aktualisieren: Jeden
from:-Eintrag inworkspace.polyanpassen - Validieren:
polycrate workspace compileausführen - Testen: Alle betroffenen Instanzen einzeln testen
Keine parallelen Versionen desselben Blocks¶
Ein schrittweiser Rollout oder ein Canary mit zwei verschiedenen Tags desselben Registry-Blocks in einer workspace.poly ist nicht vorgesehen: Der Workspace arbeitet mit genau einer installierten Version dieser Vorlage.
Stattdessen:
- Anderer Workspace (oder Klon) für Tests mit einer neueren
from:-Version - Nacheinander: Version in allen
from:-Zeilen anheben, pullen, validieren (polycrate workspace compile), deployen - Getrennte Umgebungen (z. B. staging vs. production) mit jeweils eigener
workspace.polyund einer konsistenten Version pro Umgebung
Registry nicht erreichbar¶
Lösung (OCI-Registry):
# Netzwerk und Authentifizierung für die Registry, von der Sie pullen
# (Hostname aus Ihrem from:-Pfad, z. B. cargo.ayedo.cloud)
docker login cargo.ayedo.cloud
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
Der Polycrate Hub (Weboberfläche zur Suche und Dokumentation) ist kein Docker-Registry-Endpunkt und ersetzt kein docker login. Authentifizierung fürs Pull von Block-Images erfolgt immer gegen die OCI-Registry, die im from:-Pfad steht.
Hub-URL nur für die Hub-Website/API (Browse, Metadaten), nicht fürs Pull:
Eine „alternative Hub“-URL ändert nicht, von welcher Registry polycrate blocks pull Images bezieht – dafür ist ausschließlich der from:-Pfad in der workspace.poly maßgeblich.
Polycrate Hub¶
Von ayedo bereitgestellte, öffentlich verfügbare Blocks finden Sie im Polycrate Hub:
Der Hub bietet unter anderem:
- Fertige Blocks für häufige Use Cases (Postgres, Redis, Nginx, usw.)
- Versionierte Releases für stabile Deployments
- Dokumentation für jeden Block
- Suchfunktion, um passende Blocks zu finden
Zusammenhang mit anderen Konzepten¶
- Vererbung: Dependencies basieren auf der
from:Vererbung - Registry: Dependencies werden von OCI-Registries gepullt
- Polycrate Hub: Katalog und Dokumentation öffentlicher Blocks (nicht identisch mit der OCI-Registry)
- Blocks: Dependencies sind Blocks, die von anderen Blocks genutzt werden