Vorlagen zum Kopieren und Einfügen für gängige Programmiersprachen, private Registries und Enterprise-Infrastruktur.
Vorlagen zum Kopieren und Einfügen für gängige Programmiersprachen und Anwendungsfälle. Jede Vorlage ist in sich abgeschlossen. Kombinieren Sie sie zu Ihrer vollständigen Konfiguration.Eine vollständige Aufschlüsselung aller Felder finden Sie in der Blueprint-Referenz.
Secrets: Vorlagen referenzieren Secrets über $SECRET_NAME. Konfigurieren Sie diese unter Settings > Secrets, bevor Sie eine Vorlage verwenden. Hinterlegen Sie Zugangsdaten niemals hartcodiert in Ihrem Blueprint.
Minimale Blueprints für die gängigsten Setups. Kopieren Sie einen, fügen Sie ihn in den Blueprint-Editor ein, und Sie sind fertig.
Node.js-Projekt
initialize: | npm install -g pnpmmaintenance: | pnpm installknowledge: - name: lint contents: | Führen Sie `pnpm lint` aus, um auf Fehler zu prüfen. - name: test contents: | Führen Sie `pnpm test` für die vollständige Testsuite aus.
Python-Projekt
initialize: | curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: | uv syncknowledge: - name: lint contents: | Führen Sie `uv run ruff check .` zum Linten aus. - name: test contents: | Führen Sie `uv run pytest` für die vollständige Testsuite aus.
Repo-spezifische Build-Schritte, Abhängigkeitsmanagement und Knowledge-Einträge. Lege diese unter Settings > Umgebungskonfiguration > [dein Repo] fest.
initialize: | nvm install 20 nvm use 20maintenance: | npm installknowledge: - name: lint contents: | npx eslint . - name: test contents: | npm test - name: build contents: | npm run build
Verwenden Sie in maintenancenpm install (nicht npm ci). Dadurch wird ein inkrementelles Update durchgeführt, während npm cinode_modules löscht und in jeder Sitzung alles von Grund auf neu installiert.
Rust (über rustup) und Cargo sind im Basis-Image von Devin vorinstalliert. Überspringen Sie den Installationsschritt, wenn die standardmäßige stabile Toolchain ausreicht. Sie müssen nur die Abhängigkeiten abrufen.
Monorepo mit einem Node.js-Frontend und einem Python-Backend. Jedes Teilprojekt erhält eigene Knowledge-Einträge.
initialize: - name: Install pnpm run: npm install -g pnpm - name: Install uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: - name: Install frontend dependencies run: (cd packages/frontend && pnpm install) - name: Install backend dependencies run: (cd packages/backend && uv sync) - name: Build shared library run: (cd packages/shared && pnpm install && pnpm build)knowledge: - name: structure contents: | Dies ist ein Monorepo mit drei Packages: - `packages/frontend` — React-App (TypeScript, pnpm) - `packages/backend` — Python-API (FastAPI, uv) - `packages/shared` — Gemeinsame TypeScript-Utilities (muss vor dem Frontend gebaut werden) - name: frontend contents: | Führe `cd packages/frontend && pnpm dev` aus, um den Dev-Server zu starten. Führe `cd packages/frontend && pnpm lint` aus, um zu linten. Führe `cd packages/frontend && pnpm test` aus, um zu testen. - name: backend contents: | Führe `cd packages/backend && uv run uvicorn app.main:app --reload` aus, um die API zu starten. Führe `cd packages/backend && uv run ruff check .` aus, um zu linten. Führe `cd packages/backend && uv run pytest` aus, um zu testen.
Verwende Subshells (cd dir && command) anstelle von cd dir && command, damit das Arbeitsverzeichnis zwischen den Schritten zurückgesetzt wird.
Java-Monorepo, in dem verschiedene Services unterschiedliche JDK-Versionen erfordern. Installiere bei der Einrichtung beide JDKs und verwende dann knowledge-Einträge, um Devin mitzuteilen, welches JAVA_HOME für welchen Service verwendet werden soll.
Konfigurieren Sie Paketmanager so, dass sie Abhängigkeiten aus privaten Registries beziehen. Konfigurieren Sie dies unter Settings > Umgebungskonfiguration > Org-wide setup (oder pro Repo, wenn es nur für ein Repo benötigt wird).
Die Konfiguration von Zugangsdaten gehört in maintenance, nicht in initialize. Schritte, die Secrets (Registry-Passwörter, Auth-Token) in Konfigurationsdateien schreiben, sollten maintenance verwenden, damit Zugangsdaten
in jeder Sitzung neu geladen werden. Secrets werden entfernt, bevor der Snapshot gespeichert wird. Daher enthalten Konfigurationsdateien, die während initialize geschrieben werden, beim Start von Sitzungen keine gültigen Zugangsdaten.
Wenn Ihre private Registry eine Unternehmens-CA verwendet, stellen Sie sicher, dass das CA-Zertifikat zuerst auf Enterprise-Ebene installiert ist. Die folgende Konfiguration setzt voraus, dass das Vertrauen in HTTPS
bereits hergestellt ist.
Konfigurieren Sie npm so, dass Packages mit Scope (z. B. @myorg/*) aus einer privaten Registry bezogen werden, während öffentliche Packages weiterhin aus der Standard-npm-Registry kommen.
Erforderliche Secrets
- GITHUB_PACKAGES_TOKEN — Personal Access Token oder GitHub-App-Token mit dem Geltungsbereich read:packages
maintenance: - name: Configure npm scoped registry run: | npm config set @myorg:registry https://npm.pkg.github.com npm config set //npm.pkg.github.com/:_authToken $GITHUB_PACKAGES_TOKEN
Ersetzen Sie @myorg durch Ihren npm-Scope. Gängige private Registry-URLs:
Leiten Sie alle npm-Packages über Ihre private Registry weiter (nicht nur Packages mit Scope).
Erforderliche Secrets
NPM_REGISTRY_URL — Vollständige URL Ihrer npm-Registry (z. B. https://artifactory.example.com/artifactory/api/npm/npm-virtual) - NPM_REGISTRY_HOST — Nur der Hostname, ohne Protokoll (z. B.
artifactory.example.com) - REGISTRY_TOKEN — npm-Auth-Token für die Registry
maintenance: - name: Configure npm to use private registry run: | npm config set registry $NPM_REGISTRY_URL npm config set //${NPM_REGISTRY_HOST}/:_authToken $REGISTRY_TOKEN npm config set strict-ssl true
Konfigurieren Sie pnpm so, dass Packages aus einer privaten Registry bezogen werden.
Erforderliche Secrets
NPM_REGISTRY_URL — Vollständige URL Ihrer npm-Registry - NPM_REGISTRY_HOST — Nur der Hostname, ohne Protokoll - REGISTRY_TOKEN — npm-Auth-Token für die Registry
initialize: - name: Install pnpm run: npm install -g pnpmmaintenance: - name: Configure pnpm for private registry run: | pnpm config set registry $NPM_REGISTRY_URL pnpm config set //${NPM_REGISTRY_HOST}/:_authToken $REGISTRY_TOKEN
Konfigurieren Sie Yarn (Classic v1 oder Berry v2+) so, dass Packages aus einer privaten Registry bezogen werden.
Erforderliche Secrets
- NPM_REGISTRY_URL — Vollständige URL Ihrer npm-/Yarn-Registry - REGISTRY_TOKEN — Auth-Token für die Registry (nur Berry)
Yarn Classic (v1):
initialize: - name: Install Yarn Classic run: npm install -g yarnmaintenance: - name: Configure Yarn for private registry run: | yarn config set registry "$NPM_REGISTRY_URL" # Für Packages mit Scope: # yarn config set @myorg:registry "https://npm.pkg.github.com"
Yarn Berry (v2+):
maintenance: - name: Configure Yarn Berry for private registry run: | yarn config set npmRegistryServer "$NPM_REGISTRY_URL" yarn config set npmAuthToken "$REGISTRY_TOKEN" # Für Packages mit Scope: # yarn config set npmScopes.myorg.npmRegistryServer "https://npm.pkg.github.com" # yarn config set npmScopes.myorg.npmAuthToken "$GITHUB_PACKAGES_TOKEN"
Installieren Sie das JDK und konfigurieren Sie Maven so, dass die Auflösung aller Abhängigkeiten über Ihre private Registry erfolgt (z. B. Artifactory, Nexus).
JDK 17 ist auf Devins Basis-Image vorinstalliert. Überspringen Sie den Installationsschritt, wenn das Standard-OpenJDK 17 ausreicht. Sie benötigen nur die Maven-Installation und die Konfiguration der Registry.
Erforderliche Secrets
MAVEN_REGISTRY_URL — URL Ihrer Maven-Registry (z. B. https://artifactory.example.com/artifactory/maven-virtual) - REGISTRY_USER — Registry-Nutzername - REGISTRY_PASS — Registry-Passwort oder
API-Token
Installieren Sie Go und konfigurieren Sie es so, dass es Module über einen privaten Modul-Proxy bezieht (z. B. Athens, Artifactory oder einen GOPROXY-Endpunkt).
Erforderliche Secrets
GO_PROXY_URL — URL Ihres Go-Modul-Proxys (z. B. https://athens.corp.internal) - GIT_TOKEN — Personal Access Token für private Git-Repos, die Go-Module bereitstellen
initialize: - name: Install Go run: | GO_VERSION=1.23.5 ARCH=$(dpkg --print-architecture) curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz" \ | sudo tar -xz -C /usr/local echo 'export PATH="/usr/local/go/bin:$HOME/go/bin:$PATH"' \ | sudo tee /etc/profile.d/golang.sh > /dev/null - name: Configure Go for private modules run: | cat << 'GOENV' | sudo tee /etc/profile.d/go-private.sh > /dev/null export GOPROXY="$GO_PROXY_URL,direct" export GONOSUMCHECK="corp.internal/*,github.com/myorg/*" export GOPRIVATE="corp.internal/*,github.com/myorg/*" GOENVmaintenance: - name: Authenticate Go private modules run: | git config --global url."https://$GIT_TOKEN@github.com/myorg/".insteadOf "https://github.com/myorg/"
Konfigurieren Sie Cargo so, dass es Crates aus einer privaten Registry bezieht.
Rust (über rustup) und Cargo sind im Basis-Image von Devin vorinstalliert. Überspringen Sie den Installationsschritt, wenn die stabile Standard-Toolchain ausreicht. Sie benötigen nur die Konfiguration der Registry.
Erforderliche Secrets
CARGO_REGISTRY_INDEX — URL des Index einer privaten Registry (z. B. sparse+https://cargo.corp.internal/api/v1/crates/) - CARGO_REGISTRY_TOKEN — Auth-Token für die private Registry
Wenn Sie nur eine private Registry hinzufügen möchten, ohne crates.io zu ersetzen, entfernen Sie die Abschnitte [source.crates-io] und [source.private] und verwenden Sie cargo install --registry private oder [dependencies] my-crate = { version = "1.0", registry = "private" } in Cargo.toml.
Ruby / Bundler
Installieren Sie Ruby und konfigurieren Sie Bundler zum Beziehen von Gems von einem privaten Gem-Server.
Erforderliche Secrets
GEM_SERVER_URL — URL Ihres privaten Gem-Servers (z. B. https://artifactory.example.com/artifactory/api/gems/gems-virtual) - REGISTRY_USER — Registry-Nutzername - REGISTRY_PASS — Registry-
Passwort oder API-Token
initialize: - name: Install Ruby run: | sudo apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq ruby-fullmaintenance: - name: Configure Bundler for private gem server run: | bundle config set mirror.https://rubygems.org "$GEM_SERVER_URL" bundle config set "$GEM_SERVER_URL" "$REGISTRY_USER:$REGISTRY_PASS"
AWS-CodeArtifact-Tokens laufen nach 12 Stunden ab. Verwenden Sie maintenance, um das Token zu Beginn jeder Sitzung zu aktualisieren. Dieses Beispiel konfiguriert npm, pip und Maven für die Verwendung mit CodeArtifact.
awscli ist im Basis-Image von Devin vorinstalliert. Sie benötigen nur die Token-Aktualisierung und die Registry-Konfiguration.
Erforderliche Secrets
AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY — IAM-Anmeldedaten mit den Berechtigungen codeartifact:GetAuthorizationToken und sts:GetServiceBearerToken - CA_DOMAIN — Name Ihrer CodeArtifact-Domain
Domainname - CA_DOMAIN_OWNER — AWS-Konto-ID, dem die Domain gehört - CA_REGION — AWS-Region (z. B. us-east-1) - CA_NPM_REPO, CA_PYPI_REPO, CA_MAVEN_REPO — Reponamen für jedes Ökosystem
Infrastruktur auf Maschinenebene, die für alle Orgs und Repos gilt. Legen Sie diese in Settings > Devin’s base environment (unternehmensweit) oder Settings > Umgebungskonfiguration > Org-wide setup (org-weit) fest.
Ihre Organisation verwendet eine private Zertifizierungsstelle für interne Dienste. Devin benötigt das Stammzertifikat, um interne Registries und Tools über HTTPS zu erreichen.
Erforderliche Secrets
- CORP_ROOT_CA_B64 — Base64-kodiertes PEM-Zertifikat von der CA Ihres Unternehmens. erzeugen mit: cat corp-root-ca.crt | base64 -w0
initialize: - name: Install corporate CA certificates run: | echo "$CORP_ROOT_CA_B64" | base64 -d \ | sudo tee /usr/local/share/ca-certificates/corp-root-ca.crt > /dev/null echo "$CORP_INTERMEDIATE_CA_B64" | base64 -d \ | sudo tee /usr/local/share/ca-certificates/corp-intermediate-ca.crt > /dev/null sudo update-ca-certificates # Kombiniertes Bundle für Tools erstellen, die eine einzelne CA-Datei benötigen cat /usr/local/share/ca-certificates/corp-*.crt \ | sudo tee /usr/local/share/ca-certificates/corp-bundle.crt > /dev/null echo 'export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-bundle.crt' \ | sudo tee /etc/profile.d/node-ca.sh > /dev/null
HTTP/HTTPS-Proxy
Leiten Sie den gesamten Netzwerkverkehr über einen Unternehmensproxy.
Erforderliche Secrets
CORP_HTTP_PROXY — HTTP-Proxy-URL (z. B. http://proxy.corp.example.com:8080) - CORP_HTTPS_PROXY — HTTPS-Proxy-URL - CORP_NO_PROXY — kommagetrennte Liste der Hosts, die den Proxy umgehen sollen (z. B.
localhost,127.0.0.1,.corp.example.com)
Wenn Ihr Unternehmens-Proxy eine Authentifizierung per Nutzername/Passwort erfordert.
Erforderliche Secrets
PROXY_USER — Proxy-Nutzername - PROXY_PASS — Proxy-Passwort - PROXY_HOST — Proxy-Hostname und -Port (z. B. proxy.corp.example.com:8080) - CORP_NO_PROXY — Hosts, für die der Proxy umgangen werden soll
Kombinierte Einrichtung für Umgebungen, die sowohl eine Unternehmens-CA als auch einen Proxy benötigen. Das ist in Unternehmensumgebungen üblich, in denen interne Dienste private Zertifikate verwenden und der gesamte Datenverkehr über einen Proxy geleitet werden muss.
Erforderliche Secrets
CORP_ROOT_CA_B64 — Base64-kodiertes Unternehmens-CA-Zertifikat - CORP_HTTP_PROXY, CORP_HTTPS_PROXY — Proxy-URLs - CORP_NO_PROXY — Hosts, die den Proxy umgehen
Ihre privaten Registries, Git-Server oder anderen internen Dienste sind nur über ein VPN erreichbar. Dieses Modul muss vor anderen Modulen ausgeführt werden, die Netzwerkzugriff auf interne Ressourcen benötigen.
GIT_USER_NAME — Name des Git-Autors (z. B. Devin AI)
GIT_USER_EMAIL — E-Mail-Adresse des Git-Autors. Muss mit einer UID im GPG-Schlüssel übereinstimmen, sonst verifiziert GitHub die Signatur nicht.
Laden Sie außerdem den zugehörigen öffentlichen Schlüssel in das GitHub-Konto hoch, dessen Anmeldedaten Devin zum Pushen verwendet (unter GitHub Settings > SSH and GPG keys). GitHub kennzeichnet Commits nur dann als Verified, wenn der öffentliche Signaturschlüssel für das Konto registriert ist, das den Commit erstellt hat.
Installieren Sie Systempakete, die im Standard-Image von Devin nicht enthalten sind (z. B. native Bibliotheken für die Bildverarbeitung oder PDF-Generierung).
Legen Sie persistente Umgebungsvariablen fest, die in jeder Sitzung verfügbar sein sollen.Es wird empfohlen, Zeilen im Format KEY=VALUE in die Datei $ENVRC zu schreiben. In $ENVRC geschriebene Variablen werden automatisch für alle nachfolgenden Schritte und die Devin-Sitzung exportiert (ähnlich wie bei $GITHUB_ENV in GitHub Actions’).
Beide Ansätze funktionieren. $ENVRC ist jedoch einfacher und wird in den meisten Fällen empfohlen.
Region und Zeitzone
Standard-Basis-Images können fehlerhafte Locale-Einstellungen aufweisen. Konfigurieren Sie Locale und Zeitzone, um Warnungen durch Build-Tools, Java, Python und Git zu vermeiden.
direnv ist in Devins Shell bereits eingebunden, sodass .envrc-Variablen automatisch geladen werden. Ein manuelles Sourcing ist nicht nötig.
Für vertrauliche Umgebungsvariablen (API-Schlüssel, Tokens, Datenbankpasswörter) sollten Sie statt .envrc-Dateien Repo-Secrets verwenden. Repo-Secrets werden sicher gespeichert und beim Start der Sitzung eingebunden. Sie erscheinen niemals in Ihrem Blueprint oder Snapshot.
Node-Version pro Repository wechseln
Verwenden Sie das vorinstallierte nvm, um Node.js-Versionen pro Repository über .nvmrc zu wechseln.
nvm use liest die .nvmrc aus dem Stammverzeichnis des Repo. Stellen Sie sicher, dass Ihr Repository eine solche Datei enthält (z. B. mit 20 als Inhalt).
Authentifizierung im Browser (Playwright)
Devin stellt während Sitzungen einen Chrome-Browser mit einem CDP-Endpunkt unter localhost:29229 bereit. Verwenden Sie Playwright-Skripte, um browserbasierte Anmeldungen zu automatisieren.
Der Browser ist nur während Sitzungen verfügbar, nicht in Snapshot-Builds. Installieren Sie Playwright in initialize und legen Sie die Anmeldeskripte in Ihrem Repo ab.
initialize: | pip install playwright playwright install chromiummaintenance: | npm installknowledge: - name: browser-auth contents: | This project requires browser authentication. Run the login script before interacting with the app: python scripts/login.py Devin's Chrome browser is accessible via CDP at: http://localhost:29229
Beispielskript für die Anmeldung (scripts/login.py):
from playwright.sync_api import sync_playwrightimport oswith sync_playwright() as p: browser = p.chromium.connect_over_cdp("http://localhost:29229") context = browser.contexts[0] page = context.pages[0] if context.pages else context.new_page() page.goto("https://internal-tool.example.com/login") page.fill("#username", os.environ["TOOL_USERNAME"]) page.fill("#password", os.environ["TOOL_PASSWORD"]) page.click('button[type="submit"]') page.wait_for_url("**/dashboard")
Speichern Sie Zugangsdaten als Secrets, nicht im Quellcode. Für eine dauerhafte Authentifizierung committen Sie Login-Skripte in .agents/skills/, damit Devin sich automatisch erneut authentifizieren kann.
Benutzerdefinierte System-Tools und PATH
Installieren Sie Systempakete, benutzerdefinierte Binärdateien und konfigurieren Sie den PATH in initialize.
Devin unterstützt das direkte Ausführen von Node.js-basierten GitHub Actions in Blueprints. Das ist nützlich, um bestimmte Tool-Versionen über dieselben Actions zu installieren, die auch in Ihrer CI verwendet werden.
Actions wie setup-node und setup-python ändern PATH und Umgebungsvariablen. Von einer Action installierte Binärdateien sind in allen nachfolgenden Schritten und in maintenance verfügbar. Nur
Node.js-basierte GitHub Actions werden unterstützt. Composite- und Docker-basierte Actions werden nicht unterstützt.
Für die grundlegende Einrichtung von Tools benötigen Sie keine GitHub Actions. Direkte Shell-Befehle (nvm install 20, curl ... | sh, apt-get install) funktionieren genauso gut und sind oft einfacher. GitHub Actions sind besonders nützlich, wenn Sie Ihr CI-Setup exakt nachbilden möchten oder den Komfort von Actions wie setup-java nutzen wollen, die mehrere Distributionen unterstützen.
Diese Beispiele zeigen, wie Konfigurationen auf Enterprise- und Org-Ebene zusammenwirken. In der Praxis würden Sie diese auf verschiedene Geltungsbereiche aufteilen. Sie sind hier der Übersicht halber zusammen dargestellt.
Kompletter Enterprise-Stack (Artifactory)
Eine vollständige Unternehmensumgebung: Unternehmens-CA-Zertifikat, Proxy, Java (Maven), Python (pip/uv), Node.js (npm) und Docker – alles auf eine einzige Artifactory-Instanz ausgerichtet.
In diesem Beispiel verweisen alle Registries auf dieselbe Artifactory-Instanz, verwenden jedoch unterschiedliche URL-Pfade. Jedes Paket-Ökosystem verwendet ein eigenes Endpunktformat. Maven-, PyPI-, npm- und Docker-URLs unterscheiden sich selbst bei derselben Registry.
Mehrsprachigkeit mit verschiedenen Registries
Wenn verschiedene Sprachen unterschiedliche private Registries verwenden (z. B. Maven über Nexus, npm über GitHub Packages, Python über Artifactory).
Erforderliche Secrets
NEXUS_MAVEN_URL — URL des Nexus-Maven-Repositorys - NEXUS_USER — Nexus-Nutzername - NEXUS_PASS — Nexus-Passwort - GITHUB_PACKAGES_TOKEN — GitHub Personal Access Token mit dem Geltungsbereich read:packages -
ARTIFACTORY_USER — Artifactory-Nutzername - ARTIFACTORY_TOKEN — Artifactory-API-Token - GIT_TOKEN — Personal Access Token für private Go-Module
In einer vollständig air-gapped Umgebung kann Devin keine öffentlichen URLs erreichen. Alle Tools, Laufzeitumgebungen und Pakete müssen aus internen Mirrorn stammen.
In Air-Gap-Umgebungen müssen alle Tools, die Devin benötigt (Laufzeitumgebungen, CLI-Tools usw.), auf Ihren internen Mirrors verfügbar sein. Öffentliche Registries und Downloadseiten sind nicht erreichbar.
VPN + Zertifikate + Proxy + Sprachen
Ein umfassendes Enterprise-Setup, das VPN-Konnektivität mit Zertifikaten, Proxy und Mehrsprachigkeitsunterstützung kombiniert. Dies ist die empfohlene Vorgehensreihenfolge.
Die Reihenfolge ist bei initialize-Schritten wichtig. Zuerst muss das VPN eingerichtet werden (damit interne Hosts erreichbar sind), dann DNS (damit Namen aufgelöst werden können), dann Zertifikate (damit HTTPS funktioniert), dann der Proxy (damit der Datenverkehr korrekt weitergeleitet wird) und schließlich Laufzeitumgebungen für Programmiersprachen (die möglicherweise aus internen Mirrors herunterladen).
Teste Befehle zuerst in einer Sitzung. Führe Befehle manuell in einer Devin-Sitzung aus, bevor du sie deinem Blueprint hinzufügst. Das geht schneller, als auf einen vollständigen Build-Zyklus zu warten.
Verwende initialize für Tools, die nur einmal installiert werden, und maintenance für Abhängigkeiten. Alles, was mehrere Minuten für die Installation braucht (Compiler, große Binärdateien, globale Tools), gehört in initialize. Schnelle Befehle für Abhängigkeiten (npm install, uv sync) gehören in maintenance.
Halte maintenance-Befehle schnell. Sie sollten nach Möglichkeit in unter 2 Minuten laufen. Diese Befehle werden zu Beginn jeder Sitzung ausgeführt.
Verwende $ENVRC für Umgebungsvariablen. Schreibe nicht in .bashrc oder .profile. $ENVRC ist der unterstützte Mechanismus, um Variablen schritt- und sitzungsübergreifend zu setzen.
Gib deinen Schritten Namen. Die erweiterte Form mit name-Feldern macht Fehler in Build-Logs deutlich leichter auffindbar.
Verwende Subshells für Monorepos.(cd packages/foo && npm install) läuft in einer Subshell, sodass nachfolgende Schritte nicht von der Verzeichnisänderung betroffen sind.
Verwende npm install, nicht npm ci.npm ci löscht node_modules und installiert in jeder Sitzung alles von Grund auf neu, was für maintenance zu langsam ist.
Verwende Repo-Secrets für sensible Werte. Konfiguriere sie unter Settings > Secrets im Geltungsbereich des Repos, statt sie fest in Blueprints zu hinterlegen.