Ejemplos para copiar y pegar para configurar el entorno de Devin en las capas de Enterprise, organización y repositorio
Esta página ofrece ejemplos autocontenidos de environment.yaml para situaciones habituales. Cada ejemplo abarca un aspecto concreto — combínalos para crear tu configuración completa.Para ver una introducción a la sintaxis y los conceptos de environment.yaml, consulta Configuración del entorno. Para conocer los detalles de la sintaxis, consulta la Referencia de YAML.
Secrets: Los ejemplos hacen referencia a secretos mediante $SECRET_NAME. Configúralos en Settings → Secrets antes de usar un ejemplo. Cada ejemplo incluye una sección desplegable de “secreto requerido” en la que se indica exactamente qué secretos debes configurar y qué valores deben tener. Nunca incluyas credenciales directamente en tu environment.yaml.
Las configuraciones más usadas, en un solo lugar. Para ver la lista completa, consulta las secciones siguientes.
Proyecto Node.js
initialize: | npm install -g pnpmmaintenance: | pnpm installknowledge: - name: lint contents: | Ejecuta `pnpm lint` para comprobar si hay errores. - name: test contents: | Ejecuta `pnpm test` para ejecutar la suite completa.
Proyecto Python
initialize: - name: Instalar uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: - name: Sincronizar dependencias run: uv syncknowledge: - name: lint contents: | Ejecuta `uv run ruff check .` para comprobar el linting. - name: test contents: | Ejecuta `uv run pytest` para ejecutar la suite completa.
Full-stack (Node + Python)
initialize: - name: Instalar pnpm run: npm install -g pnpm - name: Instalar uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: - name: Dependencias del frontend run: (cd frontend && pnpm install) - name: Dependencias del backend run: (cd backend && uv sync)knowledge: - name: structure contents: | - `frontend/` — aplicación React (pnpm) - `backend/` — API de Python (uv) - name: test contents: | Frontend: cd frontend && pnpm test Backend: cd backend && uv run pytest
Monorepo con workspaces
initialize: | npm install -g pnpmmaintenance: | pnpm installknowledge: - name: structure contents: | Monorepo gestionado con workspaces de pnpm. - `packages/web` — frontend en Next.js - `packages/api` — backend en Express.js - `packages/shared` — utilidades compartidas - name: test contents: | Ejecuta `pnpm test` desde la raíz para todos los paquetes. Ejecuta `pnpm --filter web test` para un paquete específico.
Las configuraciones del entorno se aplican en capas. Cada capa se basa en la anterior:
1
De toda la cuenta (Enterprise)
Certificados, proxy, DNS, VPN, firma de commits, configuración regional, límites de recursos, identidad de git, réplicas de APT.
Se aplica a todas las organizaciones y todos los repositorios.
2
De toda la organización
entorno de ejecución de lenguajes, configuración del registro del gestor de paquetes, registro de contenedores, herramientas compartidas.
Se aplica a todos los repositorios dentro de la organización.
3
Específico del repositorio
Comandos de compilación, instalación de dependencias, comandos de prueba/lint, notas específicas del proyecto para Devin.
Se aplica a un único repositorio.
La configuración de toda la cuenta se ejecuta primero, luego la de toda la organización y después la específica del repositorio. Configura cada ejemplo en el ámbito adecuado en Settings.
Estos ejemplos configuran infraestructura a nivel de máquina que se aplica en todas las organizaciones y repositorios. Configúralos en Enterprise Settings (para toda la cuenta) o en Settings > Environment > Organization-wide setup (para toda la organización).
Tu organización usa una autoridad de certificación privada para servicios internos. Devin necesita el certificado raíz para conectarse a registros y herramientas internas mediante HTTPS.
Secretos requeridos
CORP_ROOT_CA_B64 — Certificado PEM codificado en base64 de tu CA corporativa. Genéralo 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 # Permitir que Node.js confíe en la CA corporativa 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
Algunas organizaciones tienen distintas CA para diferentes servicios internos (p. ej., una para el registro de artefactos y otra para un servidor Git interno).
Secrets obligatorios
CA_CERT_REGISTRY_B64 — Certificado PEM codificado en Base64 para la CA del registro de artefactos
CA_CERT_GIT_B64 — Certificado PEM codificado en Base64 para la CA del servidor Git
initialize: - name: Install corporate CA certificates run: | # Decodificar e instalar cada certificado 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: combinar certificados en un único paquete 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
Tus registros privados, servidores Git u otros servicios internos solo son accesibles por VPN. Esto debe ejecutarse antes que otros módulos que necesiten acceso de red a recursos internos.
Secretos necesarios
OpenVPN:
VPN_CONFIG_B64 — Archivo de configuración de OpenVPN codificado en Base64 (.ovpn). Genéralo con: cat corp.ovpn | base64 -w0
VPN_AUTH_USER(opcional) — Nombre de usuario de la VPN, si tu VPN requiere autenticación con nombre de usuario y contraseña
VPN_AUTH_PASS(opcional) — Contraseña de la VPN
WireGuard:
WG_CONFIG_B64 — Archivo de configuración de WireGuard codificado en Base64. Genéralo con: cat wg0.conf | base64 -w0
OpenVPN
WireGuard
initialize: - name: Instalar y configurar OpenVPN run: | sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openvpn # Escribir la configuración de la VPN sudo mkdir -p /etc/openvpn/client echo "$VPN_CONFIG_B64" | base64 -d \ | sudo tee /etc/openvpn/client/corp.conf > /dev/null # Si la VPN requiere autenticación con nombre de usuario y contraseña 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 # Iniciar el túnel VPN sudo systemctl daemon-reload sudo systemctl enable --now openvpn-client@corp # Esperar a que el túnel se establezca for i in $(seq 1 30); do if ip link show tun0 >/dev/null 2>&1; then break; fi sleep 1 done
Tu proyecto necesita paquetes del sistema que no están en la imagen predeterminada de Devin (p. ej., bibliotecas nativas para el procesamiento de imágenes o la generación de PDF).
Configura variables de entorno persistentes que deben estar disponibles en cada sesión.El método recomendado es escribir líneas KEY=VALUE en el archivo $ENVRC. Las variables escritas en $ENVRC se exportan automáticamente para todos los pasos posteriores y para la sesión de Devin (de forma similar a $GITHUB_ENV de GitHub Actions).
Las imágenes base predeterminadas pueden venir con una configuración regional incorrecta. Es necesario configurar la configuración regional y la zona horaria para evitar advertencias de las herramientas de compilación, Java, Python y 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 # Generar y establecer la configuración regional 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 # Establecer la zona horaria sudo timedatectl set-timezone UTC 2>/dev/null || \ sudo ln -sfn /usr/share/zoneinfo/UTC /etc/localtime
Las compilaciones de Java, Gradle y Node.js con frecuencia alcanzan el límite predeterminado de 1024 archivos abiertos. Auméntalo para evitar fallos de compilación.
initialize: - name: Raise resource limits run: | cat << 'LIMITS' | sudo tee /etc/security/limits.d/99-devin.conf > /dev/null * soft nofile 65536 * hard nofile 65536 * soft nproc 65536 * hard nproc 65536 LIMITS # También establecer el máximo del kernel echo "fs.file-max = 65536" | sudo tee /etc/sysctl.d/99-devin-filemax.conf > /dev/null sudo sysctl -p /etc/sysctl.d/99-devin-filemax.conf 2>/dev/null || true
En entornos sin conexión o restringidos, reemplaza los orígenes APT predeterminados de Ubuntu por una réplica interna.
Secrets obligatorios
APT_MIRROR_URL — URL de tu réplica APT interna (p. ej., https://artifactory.example.com/artifactory/ubuntu-remote)
initialize: - name: Replace APT sources with internal mirror run: | # Hacer copia de seguridad de las fuentes originales sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # Reemplazar todos los espejos de Ubuntu con tu réplica interna sudo sed -i "s|http://archive.ubuntu.com/ubuntu|$APT_MIRROR_URL|g" /etc/apt/sources.list sudo sed -i "s|http://security.ubuntu.com/ubuntu|$APT_MIRROR_URL|g" /etc/apt/sources.list # Deshabilitar fuentes de terceros que no serán accesibles # sudo mv /etc/apt/sources.list.d/*.list /etc/apt/sources.list.d/disabled/ 2>/dev/null || true sudo apt-get update -qq
Estos ejemplos instalan entornos de ejecución de lenguajes y configuran gestores de paquetes para usar registros privados. Configúralos en Settings > Environment > Organization-wide setup.
Si tu registro privado usa una CA corporativa, asegúrate primero de que el certificado de CA esté instalado a nivel de Enterprise. La configuración a nivel de organización que aparece a continuación asume que la confianza HTTPS ya está establecida.
La configuración de credenciales corresponde a maintenance, no a initialize. Los pasos que escriben secretos (contraseñas del registro, tokens de autenticación) en archivos de configuración deben usar maintenance para que las credenciales se vuelvan a cargar en cada sesión. El archivo de secretos se elimina antes de guardar la imagen de la máquina, por lo que los archivos de configuración escritos durante initialize no tendrán credenciales válidas cuando comiencen las sesiones.
Instala el JDK y configura Maven para que toda la resolución de dependencias pase por tu repositorio privado (p. ej., Artifactory, Nexus).
JDK 17 viene preinstalado en la imagen base de Devin. Omite el paso de instalación que aparece a continuación si el OpenJDK 17 predeterminado es suficiente; solo necesitas instalar Maven y configurar el repositorio.
Secretos requeridos
MAVEN_REGISTRY_URL — URL de tu repositorio Maven (p. ej., https://artifactory.example.com/artifactory/maven-virtual)
REGISTRY_USER — Nombre de usuario del repositorio
REGISTRY_PASS — Contraseña del repositorio o token de API
Node.js + npm con un registro privado para paquetes con ámbito
Configura npm para resolver paquetes con ámbito (p. ej., @myorg/*) desde un registro privado como GitHub Packages, mientras que los paquetes públicos siguen obteniéndose del registro predeterminado de npm.
Secretos requeridos
GITHUB_PACKAGES_TOKEN — token de acceso personal o token de GitHub App con ámbito 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
Reemplaza @myorg por tu ámbito de npm. URLs habituales de registros privados:
Node.js + npm con una réplica completa de un registro privado
Haz que todos los paquetes de npm pasen por tu registro privado (no solo los paquetes con ámbito).
Secrets requeridos
NPM_REGISTRY_URL — URL completa de tu registro de npm (p. ej., https://artifactory.example.com/artifactory/api/npm/npm-virtual)
NPM_REGISTRY_HOST — Solo el nombre de host, sin protocolo (p. ej., artifactory.example.com)
REGISTRY_TOKEN — token de autenticación de npm para el registro
maintenance: - name: Configurar npm para usar el registro privado run: | npm config set registry $NPM_REGISTRY_URL npm config set //${NPM_REGISTRY_HOST}/:_authToken $REGISTRY_TOKEN npm config set strict-ssl true
Instala Rust y configura Cargo para resolver crates desde un registro privado.
Rust (a través de rustup) y Cargo están preinstalados en la imagen base de Devin. Omite el paso de instalación si la toolchain estable predeterminada es suficiente: solo necesitas la configuración del registro.
Secretos requeridos
CARGO_REGISTRY_INDEX — URL del índice del registro privado (p. ej., sparse+https://cargo.corp.internal/api/v1/crates/)
CARGO_REGISTRY_TOKEN — token de autenticación para el registro privado
Si solo necesitas agregar un registro privado sin reemplazar crates.io, elimina las secciones [source.crates-io] y [source.private] y usa cargo install --registry private o [dependencies] my-crate = { version = "1.0", registry = "private" } en Cargo.toml.
Los tokens de AWS CodeArtifact vencen después de 12 horas. Usa maintenance para actualizar el token al inicio de cada sesión. Este ejemplo configura npm, pip y Maven para usar CodeArtifact.
awscli viene preinstalado en la imagen base de Devin. Solo necesitas actualizar el token y configurar el registro.
Secretos obligatorios
AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY — credenciales de IAM con los permisos codeartifact:GetAuthorizationToken y sts:GetServiceBearerToken
CA_DOMAIN — El nombre de tu dominio de CodeArtifact
CA_DOMAIN_OWNER — ID de la cuenta de AWS propietaria del dominio
CA_REGION — Región de AWS (p. ej., us-east-1)
CA_NPM_REPO, CA_PYPI_REPO, CA_MAVEN_REPO — Nombres de repositorio para cada ecosistema
Estos ejemplos configuran pasos de compilación por repositorio, gestión de dependencias y entradas de Knowledge. Configúralos en Settings > Environment > [your repo].
Un proyecto típico de Node.js con comandos de lint, pruebas y compilación.
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 proyecto de Python que usa uv para gestionar dependencias.
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 proyecto de Java que usa Maven para gestionar dependencias.
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 de Java en el que distintos servicios requieren diferentes versiones de JDK. Instala ambos JDK durante la configuración y luego usa entradas de Knowledge para indicarle a Devin qué JAVA_HOME debe usar para cada servicio.
Si el proyecto ya tiene pre-commit como dependencia de desarrollo (p. ej., en pyproject.toml), omite el paso initialize y, en su lugar, usa uv run pre-commit install --install-hooks o pipx run pre-commit install --install-hooks en maintenance.
Documenta la arquitectura, las convenciones y los flujos de trabajo de tu proyecto en entradas de 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/
Estos ejemplos muestran cómo se combinan las configuraciones de Enterprise y de la organización. En la práctica, se separarían por ámbitos; aquí se muestran juntas como referencia.
Un entorno empresarial completo: certificado de CA corporativa, proxy, Java (Maven), Python (pip/uv), Node.js (npm) y Docker, todo configurado para apuntar a una única instancia de Artifactory.
Secrets requeridos
Red y confianza (a nivel de cuenta):
CORP_ROOT_CA_B64 — Certificado de CA corporativa codificado en Base64
CORP_HTTP_PROXY — URL del proxy HTTP
CORP_HTTPS_PROXY — URL del proxy HTTPS
CORP_NO_PROXY — Hosts que omiten el proxy
Credenciales del registro (a nivel de organización):
ARTIFACTORY_USER — Nombre de usuario de Artifactory
ARTIFACTORY_TOKEN — Token de API o contraseña de Artifactory
ARTIFACTORY_MAVEN_URL — URL del repositorio de Maven (p. ej., https://artifactory.example.com/artifactory/maven-virtual)
ARTIFACTORY_PYPI_URL — URL del repositorio de PyPI (p. ej., https://user:token@artifactory.example.com/artifactory/api/pypi/pypi-virtual/simple)
ARTIFACTORY_NPM_URL — URL del repositorio de npm (p. ej., https://artifactory.example.com/artifactory/api/npm/npm-virtual)
ARTIFACTORY_DOCKER_URL — URL del registro de Docker (p. ej., artifactory.example.com)
Normalmente, esto se dividiría en tres ámbitos:
A nivel de cuenta (initialize): Certificado y proxy
A nivel de organización (initialize): Instalación de entornos de ejecución de lenguajes
A nivel de organización (maintenance): Credenciales del registro (se actualizan en cada sesión)
Aquí se muestran combinados como referencia:
initialize: # ── Para toda la cuenta: red y confianza ────────────────────────────────────── - name: Instalar certificado CA corporativo 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: Configurar proxy a nivel de 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 # ── Para toda la organización: entornos de ejecución de lenguajes ────────────────────────────────────────── - name: Instalar 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: Instalar uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: # ── Para toda la cuenta: proxy de git (se actualiza en cada sesión) ─────────────────── - name: Configurar proxy de git run: | git config --global http.proxy "$CORP_HTTP_PROXY" git config --global https.proxy "$CORP_HTTPS_PROXY" # ── Para toda la organización: credenciales de registro (se actualizan en cada sesión) ────────────── - name: Configurar 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: Configurar 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: Configurar 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: Configurar Docker → Artifactory run: | echo "$ARTIFACTORY_TOKEN" | docker login "$ARTIFACTORY_DOCKER_URL" \ --username "$ARTIFACTORY_USER" \ --password-stdin
En este ejemplo, todos los registros apuntan a la misma instancia de Artifactory, pero usan rutas de URL distintas. Cada ecosistema de paquetes tiene su propio formato de endpoint: las URL de Maven, PyPI, npm y Docker son diferentes incluso para el mismo registro.
Entorno air-gapped con repositorios espejo privados
En un entorno totalmente air-gapped, Devin no puede acceder a ninguna URL pública. Todas las herramientas, los entornos de ejecución y los paquetes deben provenir de repositorios espejo internos.
Secrets obligatorios
Certificados:
CORP_ROOT_CA_B64 — Certificado de la CA corporativa codificado en Base64
Acceso al repositorio espejo:
APT_MIRROR_URL — URL del repositorio espejo APT interno de Ubuntu
MIRROR_USER — Nombre de usuario para la autenticación del repositorio espejo
MIRROR_PASS — Contraseña para la autenticación del repositorio espejo
JDK_TARBALL_URL — URL para descargar el tarball de JDK desde el repositorio espejo interno
NODE_TARBALL_URL — URL para descargar el tarball de Node.js desde el repositorio espejo interno
Registros de paquetes:
INTERNAL_MAVEN_URL — URL del registro interno de Maven
INTERNAL_NPM_URL — URL del registro interno de npm
INTERNAL_PYPI_URL — URL del registro interno de PyPI
En entornos aislados de Internet, todas las herramientas que Devin necesita (entornos de ejecución de lenguajes, herramientas de línea de comandos, etc.) deben estar disponibles en sus mirrors internos. No se podrá acceder a repositorios públicos ni a sitios de descarga.
Una configuración empresarial integral que combina conectividad VPN con certificados, proxy y compatibilidad con varios idiomas. Este es el orden de operaciones recomendado.
Secretos requeridos
VPN:
VPN_CONFIG_B64 — Archivo de configuración de OpenVPN codificado en Base64
Red y confianza:
CORP_ROOT_CA_B64 — Certificado de CA corporativa codificado en Base64
CORP_HTTP_PROXY — URL del proxy HTTP
CORP_HTTPS_PROXY — URL del proxy HTTPS
CORP_NO_PROXY — Hosts que omiten el proxy
Credenciales del registro:
MAVEN_REGISTRY_URL — URL del registro de Maven
NPM_REGISTRY_URL — URL del registro de npm
PYPI_REGISTRY_HOST — Nombre de host del registro de PyPI
REGISTRY_USER — Nombre de usuario del registro (para Maven y pip)
REGISTRY_PASS — Contraseña del registro (para Maven y pip)
REGISTRY_TOKEN — Token de autenticación de npm
initialize: # 1. VPN — debe ir primero para que los recursos internos sean accesibles - 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 — resolver nombres de host internos - 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. Certificados — confiar en las CAs internas - 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 — enrutar el tráfico a través del proxy corporativo - 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. Entornos de ejecución - 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
El orden de los pasos de initialize importa. La VPN debe ir primero (para que se pueda acceder a los hosts internos), luego DNS (para que los nombres se resuelvan), después los certificados (para que HTTPS funcione), luego el proxy (para que el tráfico se enrute correctamente) y, por último, los entornos de ejecución (que pueden descargar desde réplicas internas).
Prueba primero los comandos en una sesión — ejecuta los comandos manualmente en una sesión de Devin antes de agregarlos a tu configuración. Es más rápido que esperar un ciclo completo de compilación.
Usa initialize para herramientas que se instalan una sola vez y maintenance para las dependencias — todo lo que tarde minutos en instalarse (compiladores, binarios grandes, herramientas globales) debe ir en initialize. Los comandos rápidos de dependencias (npm install, uv sync) van en maintenance.
Mantén rápidos los comandos de maintenance — intenta que tarden menos de 2 minutos. Se ejecutan al inicio de cada sesión.
Usa $ENVRC para las variables de entorno — no escribas en .bashrc ni en .profile. $ENVRC es el mecanismo admitido para establecer variables entre pasos y sesiones.
Pon nombre a tus pasos — la forma expandida con campos name hace que los fallos en los registros de compilación sean mucho más fáciles de identificar.
Usa subshells para monorepos — (cd packages/foo && npm install) se ejecuta en una subshell para que los pasos posteriores no se vean afectados por el cambio de directorio.