Esempi da copiare e incollare per configurare l’ambiente di Devin a livello enterprise, org e repo
Questa pagina fornisce esempi autonomi di environment.yaml per scenari comuni. Ogni esempio copre un singolo aspetto — combinali per creare la configurazione completa.Per un’introduzione alla sintassi e ai concetti di environment.yaml, consulta Configurazione dell’ambiente. Per i dettagli sulla sintassi, consulta il Riferimento YAML.
Segreti: Gli esempi fanno riferimento ai segreti tramite $SECRET_NAME. Configurali in Settings → Secrets prima di usare un esempio. Ogni esempio include una sezione comprimibile “Segreti richiesti” che elenca esattamente quali segreti configurare e quali valori devono avere. Non inserire mai credenziali direttamente nel tuo environment.yaml.
Le configurazioni dell’ambiente vengono applicate a livelli. Ogni livello si basa sul precedente:
1
A livello di account (Enterprise)
Certificati, proxy, DNS, VPN, firma dei commit, impostazioni locali, limiti delle risorse, identità git, mirror APT.
Si applica a tutte le org e a tutti i repo.
2
A livello di org
Runtime dei linguaggi, configurazione del registry del package manager, container registry, strumenti condivisi.
Si applica a tutti i repo all’interno dell’org.
3
Specifico per repo
Comandi di build, installazione delle dipendenze, comandi di test/lint, note specifiche del progetto per Devin.
Si applica a una singola repo.
L’esecuzione a livello di account avviene per prima, poi quella a livello di org e infine quella specifica per repo. Configura ciascun esempio nell’ambito appropriato in Settings.
Questi esempi configurano un’infrastruttura a livello di macchina che si applica a tutte le org e repo. Impostali in Enterprise Settings (a livello di account) oppure in Settings > Environment > Organization-wide setup (a livello di org).
La tua organizzazione utilizza un’autorità di certificazione privata per i servizi interni. Devin ha bisogno del certificato radice per raggiungere registry e strumenti interni tramite HTTPS.
Segreti richiesti
CORP_ROOT_CA_B64 — Certificato PEM codificato in base64 della tua CA aziendale. Genera con: 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
Imposta CORP_NO_PROXY su un elenco di host, separati da virgole, che devono ignorare il proxy, ad esempio localhost,127.0.0.1,.corp.internal,10.0.0.0/8.
I registry privati, i server Git o altri servizi interni sono raggiungibili solo tramite VPN. Questo modulo deve essere eseguito prima degli altri moduli che richiedono accesso di rete alle risorse interne.
Secrets richiesti
OpenVPN:
VPN_CONFIG_B64 — File di configurazione OpenVPN (.ovpn) codificato in Base64. Genera con: cat corp.ovpn | base64 -w0
VPN_AUTH_USER(opzionale) — Nome utente VPN, se la VPN richiede l’autenticazione con nome utente/password
VPN_AUTH_PASS(opzionale) — Password VPN
WireGuard:
WG_CONFIG_B64 — File di configurazione WireGuard codificato in Base64. Genera con: cat wg0.conf | base64 -w0
OpenVPN
WireGuard
initialize: - name: Installa e configura OpenVPN run: | sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openvpn # Scrivi la configurazione VPN sudo mkdir -p /etc/openvpn/client echo "$VPN_CONFIG_B64" | base64 -d \ | sudo tee /etc/openvpn/client/corp.conf > /dev/null # Se la VPN richiede autenticazione con nome utente/password 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 # Avvia il tunnel VPN sudo systemctl daemon-reload sudo systemctl enable --now openvpn-client@corp # Attendi che il tunnel sia attivo for i in $(seq 1 30); do if ip link show tun0 >/dev/null 2>&1; then break; fi sleep 1 done
Il progetto richiede pacchetti a livello di sistema non inclusi nell’immagine Devin predefinita (ad es., librerie native per l’elaborazione delle immagini o la generazione di PDF).
Imposta variabili d’ambiente persistenti da rendere disponibili in ogni sessione.L’approccio consigliato consiste nello scrivere righe KEY=VALUE nel file $ENVRC. Le variabili scritte in $ENVRC vengono esportate automaticamente per tutti i passaggi successivi e per la sessione di Devin (in modo analogo a $GITHUB_ENV di GitHub Actions).
Le immagini di base predefinite possono avere configurazioni del locale non corrette. Configura il locale e il fuso orario per evitare avvisi dagli strumenti di build, da Java, Python e Git.
initialize: - name: Configure locale and timezone run: | sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq locales # Genera e imposta il locale sudo sed -i 's/^# *en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen sudo locale-gen sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 cat << 'LOCALE' | sudo tee /etc/profile.d/locale.sh > /dev/null export LANG="en_US.UTF-8" export LC_ALL="en_US.UTF-8" LOCALE # Imposta il fuso orario sudo timedatectl set-timezone UTC 2>/dev/null || \ sudo ln -sfn /usr/share/zoneinfo/UTC /etc/localtime
Questi esempi installano i runtime dei linguaggi e configurano i package manager per usare registry privati. Impostali in Settings > Environment > Organization-wide setup.
Se il tuo registry privato usa una CA aziendale, assicurati prima che il certificato della CA sia installato a livello enterprise. La configurazione a livello di org riportata di seguito presuppone che l’attendibilità HTTPS sia già stata stabilita.
La configurazione delle credenziali va in maintenance, non in initialize. I passaggi che scrivono segreti (password del registry, token di autenticazione) nei file di configurazione devono usare maintenance, così le credenziali vengono caricate nuovamente a ogni sessione. Il file dei segreti viene rimosso prima che l’immagine della macchina venga salvata, quindi i file di configurazione scritti durante initialize non avranno credenziali valide quando le sessioni iniziano.
Installa il JDK e configura Maven in modo che tutta la risoluzione delle dipendenze passi attraverso il tuo registry privato (ad esempio, Artifactory, Nexus).
JDK 17 è preinstallato nell’immagine di base di Devin. Salta il passaggio di installazione seguente se l’OpenJDK 17 predefinito è sufficiente: ti servono solo l’installazione di Maven e la configurazione del registry.
Secrets richiesti
MAVEN_REGISTRY_URL — URL del tuo registry Maven (ad esempio, https://artifactory.example.com/artifactory/maven-virtual)
Configura npm in modo che recuperi i pacchetti con ambito (ad esempio @myorg/*) da un registry privato come GitHub Packages, mentre i pacchetti pubblici continuano a provenire dal registry npm predefinito.
Secret richiesti
GITHUB_PACKAGES_TOKEN — Token di accesso personale o token GitHub App con ambito 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
Sostituisci @myorg con il tuo ambito npm. URL comuni per i registry privati:
Configura Yarn (Classic v1 o Berry v2+) per recuperare i pacchetti da un registry privato.
Yarn Classic (v1) è preinstallato nell’immagine di base di Devin. Salta il passaggio di installazione se ti serve solo v1.
Secrets necessari
NPM_REGISTRY_URL — URL completo del tuo registry npm/Yarn
REGISTRY_TOKEN — token di autenticazione per il registry (solo Berry)
Yarn Classic (v1)
Yarn Berry (v2+)
initialize: - name: Install Yarn Classic run: npm install -g yarnmaintenance: - name: Configure Yarn for private registry run: | yarn config set registry "$NPM_REGISTRY_URL" # Per i pacchetti con ambito: # yarn config set @myorg:registry "https://npm.pkg.github.com"
maintenance: - name: Configure Yarn Berry for private registry run: | yarn config set npmRegistryServer "$NPM_REGISTRY_URL" yarn config set npmAuthToken "$REGISTRY_TOKEN" # Per i pacchetti con ambito: # yarn config set npmScopes.myorg.npmRegistryServer "https://npm.pkg.github.com" # yarn config set npmScopes.myorg.npmAuthToken "$GITHUB_PACKAGES_TOKEN"
Installa Rust e configura Cargo per recuperare i crate da un registry privato.
Rust (tramite rustup) e Cargo sono preinstallati nell’immagine di base di Devin. Salta il passaggio di installazione se il toolchain stable predefinito è sufficiente — ti serve solo la configurazione del registry.
Secrets richiesti
CARGO_REGISTRY_INDEX — URL dell’indice del registry privato (ad es., sparse+https://cargo.corp.internal/api/v1/crates/)
CARGO_REGISTRY_TOKEN — token di autenticazione per il registry privato
Se devi solo aggiungere un registry privato senza sostituire crates.io, rimuovi le sezioni [source.crates-io] e [source.private] e usa cargo install --registry private oppure [dependencies] my-crate = { version = "1.0", registry = "private" } in Cargo.toml.
I token AWS CodeArtifact scadono dopo 12 ore. Usa maintenance per rinnovare il token all’inizio di ogni sessione. Questo esempio configura npm, pip e Maven per usare CodeArtifact.
awscli è preinstallato nell’immagine di base di Devin. Sono necessari solo il rinnovo del token e la configurazione del registry.
Secrets richiesti
AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY — credenziali IAM con le autorizzazioni codeartifact:GetAuthorizationToken e sts:GetServiceBearerToken
CA_DOMAIN — Nome del dominio CodeArtifact
CA_DOMAIN_OWNER — ID dell’account AWS proprietario del dominio
CA_REGION — Regione AWS (ad es. us-east-1)
CA_NPM_REPO, CA_PYPI_REPO, CA_MAVEN_REPO — Nomi dei repository per ciascun ecosistema
Questi esempi configurano i passaggi di build per repo, la gestione delle dipendenze e le voci di Knowledge. Impostali in Settings > Environment > [your repo].
Un tipico progetto Node.js con comandi per lint, test e build.
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.
Un progetto Python che usa uv per la gestione delle dipendenze.
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.
Un progetto Java che utilizza Maven per la gestione delle dipendenze.
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.
Un monorepo Java in cui servizi diversi richiedono versioni diverse del JDK. Installa entrambi i JDK durante la configurazione, quindi usa le voci di Knowledge per indicare a Devin quale JAVA_HOME usare per ciascun servizio.
Se il progetto include già pre-commit tra le dipendenze di sviluppo (ad esempio in pyproject.toml), salta il passaggio initialize e usa invece uv run pre-commit install --install-hooks o pipx run pre-commit install --install-hooks in maintenance.
Documenta l’architettura, le convenzioni e i flussi di lavoro del tuo progetto nelle voci knowledge.
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/
Questi esempi mostrano come le configurazioni enterprise e quelle a livello di org si combinano. In pratica, le suddivideresti tra diversi ambiti: qui sono mostrate insieme a scopo di riferimento.
Un ambiente enterprise completo: certificato CA aziendale, proxy, Java (Maven), Python (pip/uv), Node.js (npm) e Docker, tutti configurati per usare una singola istanza di Artifactory.
Secrets richiesti
Rete e attendibilità (a livello di account):
CORP_ROOT_CA_B64 — Certificato CA aziendale codificato in Base64
CORP_HTTP_PROXY — URL del proxy HTTP
CORP_HTTPS_PROXY — URL del proxy HTTPS
CORP_NO_PROXY — Host che bypassano il proxy
Credenziali del registry (a livello di org):
ARTIFACTORY_USER — Nome utente Artifactory
ARTIFACTORY_TOKEN — Token API o password di Artifactory
ARTIFACTORY_MAVEN_URL — URL del repository Maven (ad es., https://artifactory.example.com/artifactory/maven-virtual)
ARTIFACTORY_PYPI_URL — URL del repository PyPI (ad es., https://user:token@artifactory.example.com/artifactory/api/pypi/pypi-virtual/simple)
ARTIFACTORY_NPM_URL — URL del repository npm (ad es., https://artifactory.example.com/artifactory/api/npm/npm-virtual)
ARTIFACTORY_DOCKER_URL — URL del registry Docker (ad es., artifactory.example.com)
In genere, questo verrebbe suddiviso in tre ambiti:
A livello di account (initialize): Certificato e proxy
A livello di org (initialize): Installazione dei runtime dei linguaggi
A livello di org (maintenance): Credenziali del registry (aggiornate a ogni sessione)
Qui sono mostrati insieme come riferimento:
initialize: # ── A livello di account: rete e trust ────────────────────────────────────── - name: Installa il certificato CA aziendale 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 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 - name: Configura il proxy di sistema run: | cat << 'PROXY' | sudo tee /etc/profile.d/proxy.sh > /dev/null export http_proxy="$CORP_HTTP_PROXY" export https_proxy="$CORP_HTTPS_PROXY" export no_proxy="$CORP_NO_PROXY" export HTTP_PROXY="$CORP_HTTP_PROXY" export HTTPS_PROXY="$CORP_HTTPS_PROXY" export NO_PROXY="$CORP_NO_PROXY" PROXY source /etc/profile.d/proxy.sh # ── A livello di organizzazione: runtime dei linguaggi ────────────────────────────────────────── - name: Installa JDK 17 + Maven run: | sudo apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openjdk-17-jdk-headless echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' \ | sudo tee /etc/profile.d/java.sh > /dev/null MAVEN_VERSION=3.9.9 curl -fsSL "https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ | sudo tar -xz -C /opt sudo ln -sf /opt/apache-maven-${MAVEN_VERSION}/bin/mvn /usr/local/bin/mvn - name: Installa uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: # ── A livello di account: proxy git (aggiornato a ogni sessione) ─────────────────── - name: Configura il proxy git run: | git config --global http.proxy "$CORP_HTTP_PROXY" git config --global https.proxy "$CORP_HTTPS_PROXY" # ── A livello di organizzazione: credenziali del registro (aggiornate a ogni sessione) ────────────── - name: Configura Maven → Artifactory run: | mkdir -p ~/.m2 cat > ~/.m2/settings.xml << EOF <settings> <mirrors> <mirror> <id>artifactory</id> <mirrorOf>*</mirrorOf> <url>$ARTIFACTORY_MAVEN_URL</url> </mirror> </mirrors> <servers> <server> <id>artifactory</id> <username>$ARTIFACTORY_USER</username> <password>$ARTIFACTORY_TOKEN</password> </server> </servers> </settings> EOF - name: Configura pip/uv → Artifactory PyPI run: | mkdir -p ~/.config/pip cat > ~/.config/pip/pip.conf << EOF [global] index-url = $ARTIFACTORY_PYPI_URL trusted-host = $(echo "$ARTIFACTORY_PYPI_URL" | sed 's|https\?://||;s|/.*||') EOF echo "export UV_INDEX_URL=$ARTIFACTORY_PYPI_URL" \ | sudo tee /etc/profile.d/uv-registry.sh > /dev/null - name: Configura npm → Artifactory run: | npm config set registry "$ARTIFACTORY_NPM_URL" REGISTRY_HOST=$(echo "$ARTIFACTORY_NPM_URL" | sed 's|https\?://||;s|/.*||') npm config set "//${REGISTRY_HOST}/:_authToken" "$ARTIFACTORY_TOKEN" - name: Configura Docker → Artifactory run: | echo "$ARTIFACTORY_TOKEN" | docker login "$ARTIFACTORY_DOCKER_URL" \ --username "$ARTIFACTORY_USER" \ --password-stdin
In questo esempio, tutti i registri puntano alla stessa istanza di Artifactory, ma usano percorsi URL diversi. Ogni ecosistema di pacchetti ha un proprio formato di endpoint: gli URL di Maven, PyPI, npm e Docker sono tutti diversi anche per lo stesso registro.
In un ambiente completamente air-gapped, Devin non può accedere ad alcun URL pubblico. Tutti gli strumenti, i runtime e i pacchetti devono provenire da mirror interni.
Secret richiesti
Certificati:
CORP_ROOT_CA_B64 — Certificato della CA corporate codificato in Base64
Accesso ai mirror:
APT_MIRROR_URL — URL del mirror APT interno di Ubuntu
MIRROR_USER — Nome utente per l’autenticazione al mirror
MIRROR_PASS — Password per l’autenticazione al mirror
JDK_TARBALL_URL — URL per scaricare il tarball del JDK dal mirror interno
NODE_TARBALL_URL — URL per scaricare il tarball di Node.js dal mirror interno
Registry dei pacchetti:
INTERNAL_MAVEN_URL — URL del registry Maven interno
Negli ambienti air-gapped, tutti gli strumenti di cui Devin ha bisogno (runtime dei linguaggi, strumenti CLI, ecc.) devono essere disponibili sui mirror interni. I registry pubblici e i siti di download non sono raggiungibili.
Una configurazione aziendale completa che combina la connettività VPN con certificati, proxy e supporto multilingue. Questo è l’ordine operativo consigliato.
Segreti richiesti
VPN:
VPN_CONFIG_B64 — File di configurazione OpenVPN codificato in Base64
Rete e attendibilità:
CORP_ROOT_CA_B64 — Certificato della CA aziendale codificato in Base64
CORP_HTTP_PROXY — URL del proxy HTTP
CORP_HTTPS_PROXY — URL del proxy HTTPS
CORP_NO_PROXY — Host da escludere dal proxy
Credenziali del registry:
MAVEN_REGISTRY_URL — URL del registry Maven
NPM_REGISTRY_URL — URL del registry npm
PYPI_REGISTRY_HOST — hostname del registry PyPI
REGISTRY_USER — Nome utente del registry (per Maven e pip)
REGISTRY_PASS — Password del registry (per Maven e pip)
REGISTRY_TOKEN — Token di autenticazione npm
initialize: # 1. VPN — deve essere il primo in modo che le risorse interne siano raggiungibili - name: Establish VPN connection run: | sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openvpn sudo mkdir -p /etc/openvpn/client echo "$VPN_CONFIG_B64" | base64 -d \ | sudo tee /etc/openvpn/client/corp.conf > /dev/null sudo systemctl daemon-reload sudo systemctl enable --now openvpn-client@corp for i in $(seq 1 30); do if ip link show tun0 >/dev/null 2>&1; then break; fi sleep 1 done # 2. DNS — risolve i nomi host interni - name: Configure DNS run: | sudo mkdir -p /etc/systemd/resolved.conf.d cat << 'DNS' | sudo tee /etc/systemd/resolved.conf.d/corp.conf > /dev/null [Resolve] DNS=10.0.0.53 Domains=corp.internal DNS sudo systemctl restart systemd-resolved || true # 3. Certificati — considera attendibili le CA interne - name: Install 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 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 # 4. Proxy — instrada il traffico attraverso il proxy aziendale - name: Configure proxy run: | cat << 'PROXY' | sudo tee /etc/profile.d/proxy.sh > /dev/null export http_proxy="$CORP_HTTP_PROXY" export https_proxy="$CORP_HTTPS_PROXY" export no_proxy="$CORP_NO_PROXY" export HTTP_PROXY="$CORP_HTTP_PROXY" export HTTPS_PROXY="$CORP_HTTPS_PROXY" export NO_PROXY="$CORP_NO_PROXY" PROXY source /etc/profile.d/proxy.sh # 5. Language runtimes - name: Install JDK 17 run: | sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openjdk-17-jdk-headless echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' \ | sudo tee /etc/profile.d/java.sh > /dev/null - name: Install Node.js tooling run: npm install -g pnpm - name: Install uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: - name: Configure git proxy run: | git config --global http.proxy "$CORP_HTTP_PROXY" git config --global https.proxy "$CORP_HTTPS_PROXY" - name: Configure Maven run: | mkdir -p ~/.m2 cat > ~/.m2/settings.xml << EOF <settings> <mirrors> <mirror> <id>corp</id> <mirrorOf>*</mirrorOf> <url>$MAVEN_REGISTRY_URL</url> </mirror> </mirrors> <servers> <server> <id>corp</id> <username>$REGISTRY_USER</username> <password>$REGISTRY_PASS</password> </server> </servers> </settings> EOF - name: Configure npm run: | npm config set registry "$NPM_REGISTRY_URL" NPM_HOST=$(echo "$NPM_REGISTRY_URL" | sed 's|https\?://||;s|/.*||') npm config set "//${NPM_HOST}/:_authToken" "$REGISTRY_TOKEN" - name: Configure pip/uv run: | mkdir -p ~/.config/pip cat > ~/.config/pip/pip.conf << EOF [global] index-url = https://$REGISTRY_USER:$REGISTRY_PASS@${PYPI_REGISTRY_HOST}/simple EOF echo "export UV_INDEX_URL=https://$REGISTRY_USER:$REGISTRY_PASS@${PYPI_REGISTRY_HOST}/simple" \ | sudo tee /etc/profile.d/uv-registry.sh > /dev/null
L’ordine dei passaggi di initialize è importante. La VPN deve venire per prima (così gli host interni sono raggiungibili), poi il DNS (così i nomi vengono risolti), poi i certificati (così HTTPS funziona), poi il proxy (così il traffico viene instradato correttamente) e infine i runtime dei linguaggi (che potrebbero scaricare da mirror interni).
Testa prima i comandi in una sessione — esegui i comandi manualmente in una sessione di Devin prima di aggiungerli alla configurazione. È più rapido che attendere un ciclo di build completo.
Usa initialize per gli strumenti da installare una sola volta, maintenance per le dipendenze — tutto ciò che richiede minuti per l’installazione (compilatori, binari di grandi dimensioni, strumenti globali) va in initialize. I comandi rapidi per le dipendenze (npm install, uv sync) vanno in maintenance.
Mantieni rapidi i comandi maintenance — cerca di restare sotto i 2 minuti. Vengono eseguiti all’inizio di ogni sessione.
Usa $ENVRC per le variabili d’ambiente — non scrivere in .bashrc o .profile. $ENVRC è il meccanismo supportato per impostare variabili tra passaggi e sessioni.
Dai un nome ai tuoi passaggi — la forma estesa con i campi name rende molto più semplice individuare gli errori nei log di build.
Usa le subshell per i monorepo — (cd packages/foo && npm install) viene eseguito in una subshell, così i passaggi successivi non risentono del cambio di directory.
Per maggiori dettagli sulla sintassi e sull’esecuzione, consulta il Riferimento YAML. Per la risoluzione dei problemi relativi agli errori di build, consulta Risoluzione dei problemi e FAQ.