Beispiele zum Kopieren und Einfügen für die Konfiguration von Devins Umgebung über Enterprise-, Org- und Repo-Schichten hinweg
Diese Seite enthält in sich geschlossene Beispiele für environment.yaml für gängige Szenarien. Jedes Beispiel behandelt einen Aspekt — kombinieren Sie sie, um Ihre vollständige Konfiguration zu erstellen.Eine Einführung in die Syntax und die Konzepte von environment.yaml finden Sie unter Umgebungskonfiguration. Details zur Syntax finden Sie in der YAML-Referenz.
Secrets: In den Beispielen verweist $SECRET_NAME auf Secrets, die unter Settings → Secrets konfiguriert sind. Konfigurieren Sie diese, bevor Sie ein Beispiel verwenden. Jedes Beispiel enthält einen einklappbaren Abschnitt „Erforderliche Secrets“, der genau auflistet, welche Secrets eingerichtet werden müssen und welche Werte sie erwarten. Hinterlegen Sie Anmeldedaten niemals fest codiert in Ihrer environment.yaml.
Die am häufigsten verwendeten Konfigurationen auf einen Blick. Die vollständige Liste finden Sie in den folgenden Abschnitten.
Node.js-Projekt
initialize: | npm install -g pnpmmaintenance: | pnpm installknowledge: - name: lint contents: | Führen Sie `pnpm lint` aus, um Fehler zu prüfen. - name: test contents: | Führen Sie `pnpm test` für die gesamte Test-Suite aus.
Python-Projekt
initialize: - name: uv installieren run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: - name: Abhängigkeiten synchronisieren run: uv syncknowledge: - name: lint contents: | Führen Sie `uv run ruff check .` für das Linting aus. - name: test contents: | Führen Sie `uv run pytest` für die gesamte Test-Suite aus.
initialize: | npm install -g pnpmmaintenance: | pnpm installknowledge: - name: structure contents: | Monorepo, verwaltet mit pnpm-Workspaces. - `packages/web` — Next.js-Frontend - `packages/api` — Express.js-Backend - `packages/shared` — Gemeinsame Hilfsfunktionen - name: test contents: | Führen Sie `pnpm test` im Stammverzeichnis für alle Pakete aus. Führen Sie `pnpm --filter web test` für ein bestimmtes Paket aus.
Umgebungskonfigurationen werden in Schichten angewendet. Jede Schicht baut auf der vorherigen auf:
1
Kontoweit (Enterprise)
Zertifikate, Proxy, DNS, VPN, Commit-Signierung, Gebietsschema, Ressourcenlimits, Git-Identität, APT-Mirrors.
Gilt für alle Orgs und alle Repos.
2
Org-weit
Sprachlaufzeiten, Paketmanager-Registry-Konfiguration, Container-Registry, gemeinsame Tools.
Gilt für alle Repos innerhalb der Org.
3
Repo-spezifisch
Build-Befehle, Abhängigkeitsinstallation, Test-/Lint-Befehle, projektspezifische Hinweise für Devin.
Gilt für ein einzelnes Repo.
Kontoweite Konfigurationen werden zuerst angewendet, dann Org-weite und schließlich Repo-spezifische. Konfigurieren Sie jedes Beispiel im passenden Geltungsbereich unter Settings.
Verwenden Sie diese Tabelle, um das passende Beispiel für Ihre Anforderungen zu finden. Jedes Modul ist unabhängig — Sie können sie beliebig kombinieren.
Diese Beispiele konfigurieren Infrastruktur auf Maschinenebene, die für alle Orgs und Repos gilt. Legen Sie sie in Enterprise Settings (für kontoweite Konfigurationen) oder unter Settings > Environment > Organization-wide setup (für org-weite Konfigurationen) fest.
Ihre Organisation verwendet eine private Zertifizierungsstelle für interne Dienste. Devin benötigt das Stammzertifikat, um über HTTPS interne Registries und Tools zu erreichen.
Erforderliche Secrets
CORP_ROOT_CA_B64 — Base64-kodiertes PEM-Zertifikat von Ihrer Unternehmens-CA. Erzeugen Sie es mit: cat corp-root-ca.crt | base64 -w0
initialize: - name: Install corporate CA certificate run: | echo "$CORP_ROOT_CA_B64" | base64 -d \ | sudo tee /usr/local/share/ca-certificates/corp-root-ca.crt > /dev/null sudo update-ca-certificates # Let Node.js trust the corporate CA echo 'export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-root-ca.crt' \ | sudo tee /etc/profile.d/node-ca.sh > /dev/null
Einige Organisationen verwenden unterschiedliche CAs für verschiedene interne Dienste (z. B. eine für die Artefakt-Registry und eine andere für einen internen Git-Server).
Erforderliche Secrets
CA_CERT_REGISTRY_B64 — Base64-kodiertes PEM-Zertifikat für die Artefakt-Registry-CA
CA_CERT_GIT_B64 — Base64-kodiertes PEM-Zertifikat für die Git-Server-CA
initialize: - name: Install corporate CA certificates run: | # Jedes Zertifikat dekodieren und installieren echo "$CA_CERT_REGISTRY_B64" | base64 -d \ | sudo tee /usr/local/share/ca-certificates/registry-ca.crt > /dev/null echo "$CA_CERT_GIT_B64" | base64 -d \ | sudo tee /usr/local/share/ca-certificates/git-ca.crt > /dev/null sudo update-ca-certificates # Node.js: Zertifikate zu einem einzigen Bundle zusammenführen cat /usr/local/share/ca-certificates/registry-ca.crt \ /usr/local/share/ca-certificates/git-ca.crt \ > /tmp/corp-ca-bundle.crt echo "export NODE_EXTRA_CA_CERTS=/tmp/corp-ca-bundle.crt" \ | sudo tee /etc/profile.d/node-ca.sh > /dev/null
Ihre privaten Registries, Git-Server oder andere internen Dienste sind nur über VPN erreichbar. Dieses Modul muss vor anderen Modulen ausgeführt werden, die Netzwerkzugriff auf interne Ressourcen benötigen.
initialize: - name: Install and configure OpenVPN run: | sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openvpn # Schreibe die VPN-Konfiguration sudo mkdir -p /etc/openvpn/client echo "$VPN_CONFIG_B64" | base64 -d \ | sudo tee /etc/openvpn/client/corp.conf > /dev/null # Falls das VPN eine Authentifizierung per Nutzername/Passwort erfordert if [ -n "${VPN_AUTH_USER:-}" ] && [ -n "${VPN_AUTH_PASS:-}" ]; then printf '%s\n%s\n' "$VPN_AUTH_USER" "$VPN_AUTH_PASS" \ | sudo tee /etc/openvpn/client/auth.txt > /dev/null sudo chmod 600 /etc/openvpn/client/auth.txt echo "auth-user-pass /etc/openvpn/client/auth.txt" \ | sudo tee -a /etc/openvpn/client/corp.conf > /dev/null fi # Starte den VPN-Tunnel sudo systemctl daemon-reload sudo systemctl enable --now openvpn-client@corp # Warte, bis der Tunnel aufgebaut ist for i in $(seq 1 30); do if ip link show tun0 >/dev/null 2>&1; then break; fi sleep 1 done
Ihr Projekt benötigt Systempakete, die im standardmäßigen Devin-Image 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.Die empfohlene Vorgehensweise besteht darin, 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 GitHub Actions’ $GITHUB_ENV).
Standard-Basis-Images können fehlerhafte Locale-Einstellungen haben. Konfigurieren Sie Locale und Zeitzone, um Warnungen von Build-Tools, Java, Python und Git zu vermeiden.
Diese Beispiele installieren Laufzeitumgebungen für Programmiersprachen und konfigurieren Paketmanager für die Verwendung privater Registries. Legen Sie sie unter Settings > Environment > Organization-wide setup fest.
Wenn Ihre private Registry eine Unternehmens-CA verwendet, stellen Sie sicher, dass das CA-Zertifikat zuerst auf Enterprise-Ebene installiert wird. Die unten stehende Konfiguration auf Org-Ebene setzt voraus, dass HTTPS-Vertrauen bereits eingerichtet ist.
Die Konfiguration von Anmeldedaten gehört in maintenance, nicht in initialize. Schritte, die Secrets (Registry-Passwörter, Auth-Token) in Konfigurationsdateien schreiben, sollten maintenance verwenden, damit die Anmeldedaten in jeder Sitzung frisch geladen werden. Die Secrets-Datei wird entfernt, bevor das Maschinen-Image gespeichert wird, sodass Konfigurationsdateien, die während initialize geschrieben werden, beim Start von Sitzungen keine gültigen Anmeldedaten haben.
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 unten stehenden Installationsschritt, wenn das Standard-OpenJDK 17 ausreicht — Sie benötigen dann nur die Maven-Installation und die Registry-Konfiguration.
Erforderliche Secrets
MAVEN_REGISTRY_URL — URL Ihrer Maven-Registry (z. B. https://artifactory.example.com/artifactory/maven-virtual)
REGISTRY_USER — Benutzername für die Registry
REGISTRY_PASS — Passwort für die Registry oder API-Token
Node.js + npm mit einer privaten Registry für einen Geltungsbereich
Konfigurieren Sie npm so, dass Pakete in einem Geltungsbereich (z. B. @myorg/*) aus einer privaten Registry wie GitHub Packages bezogen werden, während öffentliche Pakete weiterhin aus der Standard-npm-Registry stammen.
Erforderliche Secrets
GITHUB_PACKAGES_TOKEN — Personal Access Token oder GitHub App-Token mit read:packages-Geltungsbereich
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-Geltungsbereich. Gängige URLs für private Registries:
Installieren Sie Go und konfigurieren Sie es so, dass Module über einen privaten Modul-Proxy bezogen werden (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 hosten
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/"
Installieren Sie Rust und 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 Registry-Konfiguration.
Erforderliche Secrets
CARGO_REGISTRY_INDEX — URL des Index der 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.
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-Zugangsdaten mit den Berechtigungen codeartifact:GetAuthorizationToken und sts:GetServiceBearerToken
CA_DOMAIN — Ihr CodeArtifact-Domainname
CA_DOMAIN_OWNER — AWS-Konto-ID des Kontos, dem die Domain gehört
CA_REGION — AWS-Region (z. B. us-east-1)
CA_NPM_REPO, CA_PYPI_REPO, CA_MAVEN_REPO — Repository-Namen für jedes Ökosystem
Diese Beispiele konfigurieren Build-Schritte pro Repo, die Abhängigkeitsverwaltung und Knowledge-Einträge. Legen Sie sie unter Settings > Environment > [your repo] fest.
Ein typisches Node.js-Projekt mit Lint-, Test- und Build-Befehlen.
initialize: | npm install -g pnpmmaintenance: | pnpm installknowledge: - name: lint contents: | Run `pnpm lint` to check for errors. Run `pnpm lint --fix` to auto-fix. - name: test contents: | Run `pnpm test` for the full test suite. Run `pnpm test -- --watch` during development. - name: build contents: | Run `pnpm build` to create a production build. Output goes to the `dist/` directory.
Ein Python-Projekt, das uv zur Abhängigkeitsverwaltung verwendet.
initialize: - name: Install uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: - name: Sync dependencies run: uv syncknowledge: - name: lint contents: | Run `uv run ruff check .` to lint. Run `uv run ruff format .` to format. - name: test contents: | Run `uv run pytest` for the full test suite. Run `uv run pytest -x` to stop on first failure.
Ein Java-Projekt, das Maven zur Abhängigkeitsverwaltung verwendet.
maintenance: - name: Resolve dependencies run: mvn dependency:resolve -U -qknowledge: - name: build contents: | Run `mvn clean package` to build. Run `mvn clean package -DskipTests` to build without tests. - name: test contents: | Run `mvn test` for unit tests. Run `mvn verify` for integration tests. - name: lint contents: | Run `mvn checkstyle:check` for style checks. Run `mvn spotbugs:check` for bug detection.
maintenance: - name: Download dependencies run: go mod downloadknowledge: - name: build contents: | Run `go build ./...` to build all packages. Run `go build -o bin/app ./cmd/app` to build the main binary. - name: test contents: | Run `go test ./...` for all tests. Run `go test -race ./...` to include race detection. Run `go test -v ./pkg/... -run TestSpecific` for a specific test. - name: lint contents: | Run `golangci-lint run` for linting (if installed). Run `go vet ./...` for basic static analysis.
maintenance: - name: Fetch dependencies run: cargo fetchknowledge: - name: build contents: | Run `cargo build` for a debug build. Run `cargo build --release` for a release build. - name: test contents: | Run `cargo test` for all tests. Run `cargo test -- --test-threads=1` for sequential execution. - name: lint contents: | Run `cargo clippy -- -D warnings` for lint checks. Run `cargo fmt --check` to verify formatting.
Ein Monorepo mit separaten Frontend- und Backend-Services, die unterschiedliche Paketmanager verwenden.
initialize: - name: Install pnpm run: npm install -g pnpm - name: Install uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: - name: Frontend-Abhängigkeiten installieren run: (cd packages/frontend && pnpm install) - name: Backend-Abhängigkeiten installieren run: (cd packages/backend && uv sync) - name: Gemeinsame Bibliothek bauen run: (cd packages/shared && pnpm install && pnpm build)knowledge: - name: structure contents: | Dies ist ein Monorepo mit drei Paketen: - `packages/frontend` — React-App (TypeScript, pnpm) - `packages/backend` — Python-API (FastAPI, uv) - `packages/shared` — Gemeinsame TypeScript-Hilfsprogramme (muss vor dem Frontend gebaut werden) - name: frontend contents: | Führe `cd packages/frontend && pnpm dev` aus, um den Entwicklungsserver 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.
Verwenden Sie Subshells (cd dir && command) anstelle von cd dir && command, damit das Arbeitsverzeichnis zwischen den Schritten jeweils zurückgesetzt wird.
Ein Java-Monorepo, in dem verschiedene Dienste unterschiedliche JDK-Versionen benötigen. Installiere beide JDKs bei der Einrichtung und verwende dann Knowledge-Einträge, um Devin mitzuteilen, welches JAVA_HOME für den jeweiligen Dienst verwendet werden soll.
Wenn das Projekt pre-commit bereits als Entwicklungsabhängigkeit enthält (z. B. in pyproject.toml), überspringe den Schritt initialize und verwende stattdessen in maintenanceuv run pre-commit install --install-hooks oder pipx run pre-commit install --install-hooks.
Dokumentieren Sie die Architektur, Konventionen und Workflows Ihres Projekts in knowledge-Einträgen.
knowledge: - name: architecture contents: | This is a microservices application: - `api-gateway/` — Express.js reverse proxy (port 3000) - `auth-service/` — JWT authentication service (port 3001) - `user-service/` — User CRUD service (port 3002) - `shared/` — Shared protobuf definitions and utilities Services communicate via gRPC. The API gateway is the only public-facing service. - name: conventions contents: | - All API responses use the `{ data, error, meta }` envelope format - Database migrations are in `migrations/` and run with `npm run migrate` - Environment-specific config is in `config/{env}.json` - Feature flags are managed via LaunchDarkly (SDK key in $LD_SDK_KEY) - name: testing contents: | Unit tests: `npm test` Integration tests: `npm run test:integration` (requires Docker for Postgres) E2E tests: `npm run test:e2e` (requires all services running) Coverage report: `npm run test:coverage` (must be > 80% for CI to pass) - name: deployment contents: | CI/CD runs on GitHub Actions. Merges to `main` auto-deploy to staging. Production deploys require a manual approval step in the Actions UI. Docker images are pushed to ECR: 123456789.dkr.ecr.us-east-1.amazonaws.com/
Diese Beispiele zeigen, wie Konfigurationen auf Enterprise- und Org-Ebene zusammenwirken. In der Praxis würden Sie diese auf verschiedene Geltungsbereiche aufteilen — hier werden sie der Referenz halber zusammen gezeigt.
Eine vollständige Enterprise-Umgebung: unternehmenseigenes CA-Zertifikat, Proxy, Java (Maven), Python (pip/uv), Node.js (npm) und Docker — alles auf eine einzige Artifactory-Instanz konfiguriert.
In diesem Beispiel verweisen alle Registries auf dieselbe Artifactory-Instanz, verwenden jedoch unterschiedliche URL-Pfade. Jedes Paket-Ökosystem hat sein eigenes Endpunktformat — Maven-, PyPI-, npm- und Docker-URLs unterscheiden sich selbst für dieselbe Registry.
In einer vollständig isolierten Air-Gap-Umgebung hat Devin keinen Zugriff auf öffentliche URLs. Alle Tools, Laufzeitumgebungen und Pakete müssen aus internen Spiegelservern stammen.
In Air-Gap-Umgebungen müssen alle Tools, die Devin benötigt (Laufzeitumgebungen für Programmiersprachen, CLI-Tools usw.), auf Ihren internen Mirror-Servern verfügbar sein. Öffentliche Registries und Downloadseiten sind nicht erreichbar.
Ein umfassendes Unternehmens-Setup, das VPN-Konnektivität mit Zertifikaten, Proxy und Unterstützung für mehrere Sprachen kombiniert. Dies ist die empfohlene Reihenfolge der Schritte.
Die Reihenfolge ist bei initialize-Schritten wichtig. Zuerst muss VPN eingerichtet werden (damit interne Hosts erreichbar sind), dann DNS (damit Namen bezogen werden), dann Zertifikate (damit HTTPS funktioniert), dann der Proxy (damit der Datenverkehr korrekt geroutet wird) und schließlich Sprachlaufzeitumgebungen (die möglicherweise von internen Spiegelservern herunterladen).
Testen Sie Befehle zuerst in einer Sitzung — führen Sie Befehle manuell in einer Devin-Sitzung aus, bevor Sie sie Ihrer Konfiguration hinzufügen. Das geht schneller, als auf einen vollständigen Build-Zyklus zu warten.
Verwenden Sie initialize für Tools, die nur einmal installiert werden, und maintenance für Abhängigkeiten — alles, was mehrere Minuten zur Installation braucht (Compiler, große Binärdateien, globale Tools), gehört in initialize. Schnelle Befehle zum Installieren von Abhängigkeiten (npm install, uv sync) gehören in maintenance.
Halten Sie maintenance-Befehle schnell — idealerweise dauern sie weniger als 2 Minuten. Sie werden zu Beginn jeder Sitzung ausgeführt.
Verwenden Sie $ENVRC für Umgebungsvariablen — schreiben Sie nicht in .bashrc oder .profile. $ENVRC ist der unterstützte Mechanismus, um Variablen über Schritte und Sitzungen hinweg festzulegen.
Geben Sie Ihren Schritten Namen — die Erweiterte Form mit name-Feldern erleichtert es deutlich, Fehler in Build-Logs zu erkennen.
Verwenden Sie Subshells für Monorepos — (cd packages/foo && npm install) wird in einer Subshell ausgeführt, sodass nachfolgende Schritte nicht von der Verzeichnisänderung beeinflusst werden.
Weitere Informationen zu Syntax und Ausführungsdetails finden Sie in der YAML-Referenz. Hilfe bei fehlgeschlagenen Builds finden Sie unter Fehlerbehebung & FAQ.