Exemplos prontos para copiar e colar para configurar o ambiente do Devin nas camadas enterprise, org e repositório
Esta página fornece exemplos autônomos de environment.yaml para cenários comuns. Cada exemplo cobre uma necessidade — combine-os para montar sua configuração completa.Para uma introdução à sintaxe e aos conceitos de environment.yaml, consulte Configuração de ambiente. Para detalhes da sintaxe, consulte a Referência de YAML.
Secrets: Os exemplos referenciam secrets por meio de $SECRET_NAME. Configure-os em Configurações → Secrets antes de usar um exemplo. Cada exemplo inclui uma seção recolhível “segredo necessário” listando exatamente quais secrets configurar e quais valores eles devem ter. Nunca inclua credenciais diretamente no seu environment.yaml.
As configurações mais usadas em um só lugar. Para ver a lista completa, consulte as seções abaixo.
Projeto Node.js
initialize: | npm install -g pnpmmaintenance: | pnpm installknowledge: - name: lint contents: | Execute `pnpm lint` para verificar se há erros. - name: test contents: | Execute `pnpm test` para rodar a suíte completa.
Projeto Python
initialize: - name: Instalar uv run: curl -LsSf https://astral.sh/uv/install.sh | shmaintenance: - name: Sincronizar dependências run: uv syncknowledge: - name: lint contents: | Execute `uv run ruff check .` para rodar o lint. - name: test contents: | Execute `uv run pytest` para rodar a suíte 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: Dependências do frontend run: (cd frontend && pnpm install) - name: Dependências do backend run: (cd backend && uv sync)knowledge: - name: structure contents: | - `frontend/` — app React (pnpm) - `backend/` — API Python (uv) - name: test contents: | Frontend: cd frontend && pnpm test Backend: cd backend && uv run pytest
Monorepo com workspaces
initialize: | npm install -g pnpmmaintenance: | pnpm installknowledge: - name: structure contents: | Monorepo gerenciado com pnpm workspaces. - `packages/web` — frontend em Next.js - `packages/api` — backend em Express.js - `packages/shared` — utilitários compartilhados - name: test contents: | Execute `pnpm test` a partir da raiz para todos os packages. Execute `pnpm --filter web test` para um package específico.
As configurações de ambiente são aplicadas em camadas. Cada camada se baseia na anterior:
1
Nível da conta (Enterprise)
Certificados, proxy, DNS, VPN, assinatura de commit, localidade, limites de recursos, identidade do git, espelhos do APT.
Aplica-se a todas as org e todos os repositórios.
2
Nível da org
Runtimes de linguagem, configuração do registro do gerenciador de pacotes, registro de contêineres, ferramentas compartilhadas.
Aplica-se a todos os repositórios da org.
3
Específico do repositório
Comandos de build, instalação de dependências, comandos de teste/lint, notas específicas do projeto para o Devin.
Aplica-se a um único repositório.
O nível da conta é executado primeiro, depois o nível da org e, em seguida, o específico do repositório. Configure cada exemplo no escopo apropriado em Configurações.
Estes exemplos configuram a infraestrutura no nível da máquina, aplicável a todas as org e repositórios. Defina-os em Configurações do Enterprise (para nível da conta) ou Configurações > Ambiente > Configuração em nível da organização (para nível da organização).
Sua organização usa uma autoridade certificadora privada para serviços internos. O Devin precisa do certificado raiz para acessar registros e ferramentas internas por HTTPS.
Segredos necessários
CORP_ROOT_CA_B64 — Certificado PEM codificado em base64 da sua CA corporativa. Gere com: 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
Algumas organizações têm CAs separadas para diferentes serviços internos (por exemplo, uma para o registro de artefatos e outra para um servidor Git interno).
Segredos obrigatórios
CA_CERT_REGISTRY_B64 — Certificado PEM codificado em Base64 para a CA do registro de artefatos
CA_CERT_GIT_B64 — Certificado PEM codificado em Base64 para a CA do servidor Git
initialize: - name: Install corporate CA certificates run: | # Decode and install each certificate 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: combine certs into a single bundle 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
Defina CORP_NO_PROXY como uma lista de hosts separada por vírgulas que não devem passar pelo proxy, como localhost,127.0.0.1,.corp.internal,10.0.0.0/8.
Seus registries privados, servidores Git ou outros serviços internos só ficam acessíveis via VPN. Isso deve ser executado antes dos outros módulos que precisam de acesso de rede a recursos internos.
Segredos obrigatórios
OpenVPN:
VPN_CONFIG_B64 — Arquivo de configuração do OpenVPN codificado em Base64 (.ovpn). Gere com: cat corp.ovpn | base64 -w0
VPN_AUTH_USER(opcional) — Nome de usuário da VPN, se sua VPN exigir autenticação com nome de usuário e senha
VPN_AUTH_PASS(opcional) — Senha da VPN
WireGuard:
WG_CONFIG_B64 — Arquivo de configuração do WireGuard codificado em Base64. Gere com: cat wg0.conf | base64 -w0
OpenVPN
WireGuard
initialize: - name: Instalar e configurar o OpenVPN run: | sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openvpn # Grava a configuração da VPN sudo mkdir -p /etc/openvpn/client echo "$VPN_CONFIG_B64" | base64 -d \ | sudo tee /etc/openvpn/client/corp.conf > /dev/null # Se a VPN exigir autenticação com nome de usuário e senha 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 # Inicia o túnel VPN sudo systemctl daemon-reload sudo systemctl enable --now openvpn-client@corp # Aguarda o túnel subir for i in $(seq 1 30); do if ip link show tun0 >/dev/null 2>&1; then break; fi sleep 1 done
initialize: - name: Instalar e configurar o WireGuard run: | sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq wireguard-tools # Grava a configuração do WireGuard echo "$WG_CONFIG_B64" | base64 -d \ | sudo tee /etc/wireguard/wg0.conf > /dev/null sudo chmod 600 /etc/wireguard/wg0.conf # Inicia o túnel sudo systemctl enable --now wg-quick@wg0
Para mais detalhes sobre a configuração da VPN, consulte Configuração de VPN.
Seu projeto precisa de pacotes de sistema que não estão incluídos na imagem padrão do Devin (por exemplo, bibliotecas nativas para processamento de imagens ou geração de PDFs).
Defina variáveis de ambiente persistentes que devem estar disponíveis em cada sessão.A abordagem recomendada é adicionar linhas KEY=VALUE ao arquivo $ENVRC. As variáveis adicionadas ao $ENVRC são exportadas automaticamente para todas as etapas subsequentes e para a sessão do Devin (semelhante ao $GITHUB_ENV do GitHub Actions).
Imagens base padrão podem ter configurações de locale incorretas. Configure o locale e o fuso horário para evitar avisos de ferramentas de build, Java, Python e Git.
Estes exemplos instalam runtimes de linguagem e configuram gerenciadores de pacotes para usar registros privados. Defina-os em Configurações > Ambiente > Configuração em nível da organização.
Se o seu registro privado usar uma CA corporativa, certifique-se de que o certificado de CA esteja instalado primeiro no nível enterprise. A configuração no nível da organização abaixo pressupõe que a confiança em HTTPS já tenha sido estabelecida.
A configuração de credenciais deve ficar em maintenance, não em initialize. Etapas que gravam secrets (senhas de registro, tokens de autenticação) em arquivos de configuração devem usar maintenance para que as credenciais sejam recarregadas a cada sessão. O arquivo de secrets é removido antes que a imagem da máquina seja salva, portanto os arquivos de configuração gravados durante initialize não terão credenciais válidas quando as sessões forem iniciadas.
Instale o JDK e configure o Maven para espelhar toda a resolução de dependências por meio do seu repositório privado (por exemplo, Artifactory, Nexus).
O JDK 17 vem pré-instalado na imagem base do Devin. Pule a etapa de instalação abaixo se o OpenJDK 17 padrão for suficiente — você só precisa instalar o Maven e configurar o registro.
Segredos obrigatórios
MAVEN_REGISTRY_URL — URL do seu registro Maven (por exemplo, https://artifactory.example.com/artifactory/maven-virtual)
Node.js + npm com um registro privado para um escopo
Configure o npm para resolver pacotes com escopo (por exemplo, @myorg/*) a partir de um registro privado, como o GitHub Packages, enquanto os pacotes públicos continuam vindo do registro padrão do npm.
Segredos necessários
GITHUB_PACKAGES_TOKEN — token de acesso pessoal ou token do GitHub App com escopo 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
Substitua @myorg pelo seu escopo do npm. URLs comuns de registros privados:
Configure o Yarn (Classic v1 ou Berry v2+) para resolver pacotes de um registro privado.
Yarn Classic (v1) vem pré-instalado na imagem base do Devin. Pule a etapa de instalação se você só precisar da v1.
Segredos obrigatórios
NPM_REGISTRY_URL — URL completa do seu registro npm/Yarn
REGISTRY_TOKEN — Token de autenticação para o registro (apenas Berry)
Yarn Classic (v1)
Yarn Berry (v2+)
initialize: - name: Instalar Yarn Classic run: npm install -g yarnmaintenance: - name: Configurar Yarn para registro privado run: | yarn config set registry "$NPM_REGISTRY_URL" # Para pacotes com escopo: # yarn config set @myorg:registry "https://npm.pkg.github.com"
maintenance: - name: Configurar Yarn Berry para registro privado run: | yarn config set npmRegistryServer "$NPM_REGISTRY_URL" yarn config set npmAuthToken "$REGISTRY_TOKEN" # Para pacotes com escopo: # yarn config set npmScopes.myorg.npmRegistryServer "https://npm.pkg.github.com" # yarn config set npmScopes.myorg.npmAuthToken "$GITHUB_PACKAGES_TOKEN"
Instale o Rust e configure o Cargo para resolver crates de um registro privado.
Rust (via rustup) e Cargo vêm pré-instalados na imagem base do Devin. Pule a etapa de instalação se o toolchain estável padrão for suficiente — você só precisa da configuração do registro.
Segredos obrigatórios
CARGO_REGISTRY_INDEX — URL do índice do registro privado (por exemplo, sparse+https://cargo.corp.internal/api/v1/crates/)
CARGO_REGISTRY_TOKEN — token de autenticação para o registro privado
Se você só precisa adicionar um registro privado sem substituir o crates.io, remova as seções [source.crates-io] e [source.private] e use cargo install --registry private ou [dependencies] my-crate = { version = "1.0", registry = "private" } no Cargo.toml.
Os tokens do AWS CodeArtifact expiram após 12 horas. Use maintenance para renovar o token no início de cada sessão. Este exemplo configura npm, pip e Maven para usar o CodeArtifact.
awscli vem pré-instalado na imagem base do Devin. Você só precisa da renovação do token e da configuração do registro.
Segredos obrigatórios
AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY — credenciais do IAM com as permissões codeartifact:GetAuthorizationToken e sts:GetServiceBearerToken
CA_DOMAIN — nome do seu domínio do CodeArtifact
CA_DOMAIN_OWNER — ID da conta AWS proprietária do domínio
CA_REGION — região da AWS (por exemplo, us-east-1)
CA_NPM_REPO, CA_PYPI_REPO, CA_MAVEN_REPO — nomes dos repositórios de cada ecossistema
Estes exemplos configuram etapas de build por repositório, gerenciamento de dependências e entradas no Knowledge. Defina-os em Configurações > Ambiente > [seu repositório].
Um projeto típico em Node.js com comandos de lint, teste 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.
Um projeto em Python que usa o uv para gerenciamento de dependências.
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.
Um projeto Java que usa Maven para gerenciar dependências.
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.
Um monorepo Java em que serviços diferentes exigem versões diferentes do JDK. Instale ambos os JDKs durante a configuração e, em seguida, use entradas de Knowledge para informar ao Devin qual JAVA_HOME deve ser usado em cada serviço.
Se o projeto já tiver pre-commit como dependência de desenvolvimento (por exemplo, em pyproject.toml), pule a etapa initialize e use uv run pre-commit install --install-hooks ou pipx run pre-commit install --install-hooks na etapa maintenance.
Documente a arquitetura, as convenções e os fluxos de trabalho do seu projeto em entradas 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/
Estes exemplos mostram como as configurações do Enterprise e no nível da organização se combinam. Na prática, isso seria dividido entre escopos — aqui, eles são mostrados juntos como referência.
Um ambiente Enterprise completo: certificado de CA corporativo, proxy, Java (Maven), Python (pip/uv), Node.js (npm) e Docker — todos apontando para uma única instância do Artifactory.
Segredos obrigatórios
Rede e confiança (nível da conta):
CORP_ROOT_CA_B64 — Certificado de CA corporativo codificado em Base64
CORP_HTTP_PROXY — URL do proxy HTTP
CORP_HTTPS_PROXY — URL do proxy HTTPS
CORP_NO_PROXY — Hosts que devem ignorar o proxy
Credenciais de registro (nível da organização):
ARTIFACTORY_USER — Nome de usuário do Artifactory
ARTIFACTORY_TOKEN — token de API ou senha do Artifactory
ARTIFACTORY_MAVEN_URL — URL do repositório Maven (por exemplo, https://artifactory.example.com/artifactory/maven-virtual)
ARTIFACTORY_PYPI_URL — URL do repositório PyPI (por exemplo, https://user:token@artifactory.example.com/artifactory/api/pypi/pypi-virtual/simple)
ARTIFACTORY_NPM_URL — URL do repositório npm (por exemplo, https://artifactory.example.com/artifactory/api/npm/npm-virtual)
ARTIFACTORY_DOCKER_URL — URL do registro Docker (por exemplo, artifactory.example.com)
Normalmente, isso seria dividido em três escopos:
Nível da conta (initialize): Certificado e proxy
Nível da organização (initialize): Instalação de runtimes de linguagem
Nível da organização (maintenance): Credenciais de registro (atualizadas a cada sessão)
Mostrado aqui de forma combinada como referência:
initialize: # ── Em toda a conta: rede e confiança ──────────────────────────────────── - 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 em todo o 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 # ── Em toda a organização: runtimes de linguagem ───────────────────────── - 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: # ── Em toda a conta: proxy git (atualizado a cada sessão) ────────────── - name: Configurar proxy git run: | git config --global http.proxy "$CORP_HTTP_PROXY" git config --global https.proxy "$CORP_HTTPS_PROXY" # ── Em toda a organização: credenciais de registro (atualizadas a cada sessão) ── - 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
Neste exemplo, todos os registries apontam para a mesma instância do Artifactory, mas usam caminhos de URL diferentes. Cada ecossistema de pacotes tem seu próprio formato de endpoint — as URLs de Maven, PyPI, npm e Docker são diferentes entre si, mesmo no mesmo registry.
Em um ambiente totalmente air-gapped, o Devin não pode acessar nenhuma URL pública. Todas as ferramentas, runtimes e pacotes devem vir de espelhos internos.
Segredos obrigatórios
Certificados:
CORP_ROOT_CA_B64 — certificado de CA corporativa codificado em Base64
Acesso ao espelho:
APT_MIRROR_URL — URL do espelho APT interno do Ubuntu
MIRROR_USER — nome de usuário para autenticação no espelho
MIRROR_PASS — senha para autenticação no espelho
JDK_TARBALL_URL — URL para baixar o tarball do JDK do espelho interno
NODE_TARBALL_URL — URL para baixar o tarball do Node.js do espelho interno
Registros de pacotes:
INTERNAL_MAVEN_URL — URL do registro interno do Maven
INTERNAL_NPM_URL — URL do registro interno do npm
INTERNAL_PYPI_URL — URL do registro interno do PyPI
Em ambientes sem conexão com a internet, todas as ferramentas de que Devin precisa (runtimes de linguagem, ferramentas de CLI etc.) devem estar disponíveis nos seus espelhos internos. Registries públicos e sites de download são inacessíveis.
Uma configuração corporativa abrangente que combina conectividade VPN com certificados, proxy e suporte a vários idiomas. Esta é a ordem recomendada de operações.
Segredos necessários
VPN:
VPN_CONFIG_B64 — arquivo de configuração do OpenVPN codificado em Base64
Rede e confiança:
CORP_ROOT_CA_B64 — certificado de CA corporativa codificado em Base64
CORP_HTTP_PROXY — URL do proxy HTTP
CORP_HTTPS_PROXY — URL do proxy HTTPS
CORP_NO_PROXY — hosts que devem ignorar o proxy
Credenciais do registro:
MAVEN_REGISTRY_URL — URL do registro do Maven
NPM_REGISTRY_URL — URL do registro do npm
PYPI_REGISTRY_HOST — nome do host do registro do PyPI
REGISTRY_USER — nome de usuário do registro (para Maven e pip)
REGISTRY_PASS — senha do registro (para Maven e pip)
REGISTRY_TOKEN — token de autenticação do npm
initialize: # 1. VPN — deve vir primeiro para que os recursos internos sejam acessíveis - 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 nomes 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 nas 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 — rotear tráfego pelo 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. Runtime de linguagem - 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
A ordem das etapas de initialize importa. A VPN deve vir primeiro (para que os hosts internos fiquem acessíveis), depois o DNS (para que os nomes possam ser resolvidos), depois os certificados (para que o HTTPS funcione), depois o proxy (para que o tráfego seja roteado corretamente) e, por fim, os runtimes de linguagem (que podem baixar de espelhos internos).
Teste os comandos primeiro em uma sessão — execute os comandos manualmente em uma sessão do Devin antes de adicioná-los à sua configuração. Isso é mais rápido do que esperar um ciclo completo de build.
Use initialize para ferramentas instaladas uma única vez e maintenance para dependências — tudo o que leva minutos para instalar (compiladores, binários grandes, ferramentas globais) deve ficar em initialize. Comandos rápidos de dependência (npm install, uv sync) devem ir em maintenance.
Mantenha os comandos de maintenance rápidos — procure mantê-los abaixo de 2 minutos. Eles são executados no início de cada sessão.
Use $ENVRC para variáveis de ambiente — não escreva em .bashrc nem em .profile. $ENVRC é o mecanismo compatível para definir variáveis entre etapas e sessões.
Dê nomes às suas etapas — a forma expandida com campos name facilita muito identificar falhas nos logs de build.
Use subshells para monorepos — (cd packages/foo && npm install) é executado em uma subshell para que as etapas seguintes não sejam afetadas pela mudança de diretório.