exec 环境绑定,例如 env={"REGISTRY_TOKEN": "secret:repo:owner/repo:REGISTRY_TOKEN"}。参见 Secrets。切勿在蓝图中硬编码凭据。快速开始
Node.js 项目
Node.js 项目
Python 项目
Python 项目
全栈(Node + Python)
全栈(Node + Python)
仓库蓝图
Python
- uv(推荐)
- pip + venv
Node.js
- npm
- pnpm
maintenance 中使用 npm install (不要用 npm ci) 。前者会执行增量更新,而 npm ci 会在每次运行该命令时删除 node_modules,并从头重新安装。Go
Java
- Gradle
- Maven
Ruby on Rails
Rust
Monorepo
- 多语言
- 多个 JDK 版本
私有包注册表
Node.js 注册表
- npm(作用域)
- npm(完整镜像)
- pnpm
- Yarn
@myorg/*) ,同时公开软件包仍从默认的 npm registry 获取。必需的 secrets
必需的 secrets
GITHUB_PACKAGES_TOKEN— 具有read:packages作用域的 Personal access token 或 GitHub App 令牌
Python 软件包注册表
- pip / uv
- Poetry
必需的 secrets
必需的 secrets
PYPI_REGISTRY_URL— 你的 PyPI 索引完整 URL,如有需要请包含凭据 (例如https://user:token@nexus.example.com/repository/pypi-proxy/simple)
maintenance 添加相同的 source ... && 命令。URL 凭据中的特殊字符需进行百分号编码。JVM 软件包注册表
- Maven
- Gradle
必需的 secrets
必需的 secrets
MAVEN_REGISTRY_URL— 你的 Maven registry URL (例如https://artifactory.example.com/artifactory/maven-virtual)REGISTRY_USER— registry 用户名REGISTRY_PASS— registry 密码或 API 令牌
其他软件包注册表
Go 模块代理
Go 模块代理
必需的 secrets
必需的 secrets
GO_PROXY_URL— 你的 Go module 代理的 URL (例如https://athens.corp.internal)
maintenance 中,那里可以访问到 go.mod。请勿在组织级设置 (org-wide setup) 中运行该命令,因为它会在仓库克隆之前执行。.NET / NuGet
.NET / NuGet
必需的 secrets
必需的 secrets
NUGET_SOURCE_URL— 你的 NuGet 源的 URLNuGetPackageSourceCredentials_private— 采用 NuGet 环境变量格式的源凭据:Username=any;Password=<PAT>(使用你的源所要求的用户名)
Docker
Docker
必需的 secrets
必需的 secrets
DOCKER_MIRROR_URL(可选) — 你的 Docker Hub 镜像源 URL (例如https://mirror.corp.internal)DOCKER_REGISTRY_URL— 你的私有容器注册表 URL (例如registry.corp.internal:5000)DOCKER_REGISTRY_USER— 注册表用户名DOCKER_REGISTRY_PASS— 注册表密码或 API 令牌
Rust / Cargo
Rust / Cargo
必需的 secrets
必需的 secrets
CARGO_REGISTRY_INDEX— private registry 索引的 URL (例如sparse+https://cargo.corp.internal/api/v1/crates/)CARGO_REGISTRIES_PRIVATE_TOKEN— 名为private的 registry 的身份验证令牌
cargo:token 提供商会从环境中读取指定 registry 的令牌;请勿在构建步骤中运行 cargo login。Ruby / Bundler
Ruby / Bundler
必需的 secrets
必需的 secrets
GEM_SERVER_URL— 你的私有 gem 服务器的 URL (例如https://artifactory.example.com/artifactory/api/gems/gems-virtual)BUNDLE_ARTIFACTORY__EXAMPLE__COM— 用于artifactory.example.com的username:password;请将变量名改为与你的 gem 服务器相匹配
GEM_SERVER_URL。对于 Bundler 的凭据变量,请将 hostname 转为大写并加上 BUNDLE_ 前缀,同时把每个点替换为 __,每个连字符替换为 ___。PHP / Composer
PHP / Composer
必需的 secrets
必需的 secrets
COMPOSER_REGISTRY_URL— 你的私有 Composer registry 的 URL (例如https://repo.packagist.com/<org>)COMPOSER_AUTH— 该 registry 主机的 JSON 凭据,例如{"http-basic":{"repo.packagist.com":{"username":"<user>","password":"<token>"}}}
COMPOSER_REGISTRY_URL。AWS CodeArtifact 令牌刷新
AWS CodeArtifact 令牌刷新
awscli。你只需完成令牌刷新和 registry 配置。必需的 secrets
必需的 secrets
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY— 具备codeartifact:GetAuthorizationToken和sts:GetServiceBearerToken权限的 IAM 凭据CA_DOMAIN— 你的 CodeArtifact 域名CA_DOMAIN_OWNER— 拥有该域的 AWS 账户 IDCA_REGION— AWS 区域 (例如us-east-1)CA_NPM_REPO、CA_PYPI_REPO、CA_MAVEN_REPO— 各生态对应的代码仓库名称
source ... && 命令添加为后续的构建步骤。获取到的令牌仅存在于该 shell 的环境中;请勿通过 aws codeartifact login、使用已展开令牌的 npm config set 或包含凭据的 pip.conf 将其持久化。企业基础架构
网络与连接
企业级 CA 证书
企业级 CA 证书
必需的 secrets
必需的 secrets
CORP_ROOT_CA_B64— 来自你的企业 CA 的 Base64 编码 PEM 证书。可使用以下命令生成:cat corp-root-ca.crt | base64 -w0
openssl x509 只会写出解析后的证书,因此即便其中不慎包含了私钥,也不会被复制到信任存储中。请参照下一个示例,分别提供每个 CA 证书。多个 CA 证书
多个 CA 证书
必需的 secrets
必需的 secrets
CORP_ROOT_CA_B64— Base64 编码的主 CA 证书CORP_INTERMEDIATE_CA_B64— Base64 编码的中间 CA 证书
HTTP/HTTPS 代理
HTTP/HTTPS 代理
必需的 secrets
必需的 secrets
CORP_HTTP_PROXY— HTTP 代理 URL (例如:http://proxy.corp.example.com:8080)CORP_HTTPS_PROXY— HTTPS 代理 URLCORP_NO_PROXY— 以逗号分隔的绕过代理的主机列表 (例如:localhost,127.0.0.1,.corp.example.com)
身份验证代理
身份验证代理
必需的 secrets
必需的 secrets
PROXY_USER— 代理用户名PROXY_PASS— 代理密码PROXY_HOST— 代理主机名和端口 (例如proxy.corp.example.com:8080)CORP_NO_PROXY— 不经代理的主机
CA 证书 + 代理(组合)
CA 证书 + 代理(组合)
必需的 secrets
必需的 secrets
CORP_ROOT_CA_B64— Base64 编码的 corporate CA certificateCORP_HTTP_PROXY,CORP_HTTPS_PROXY— 代理 URLCORP_NO_PROXY— 不走代理的主机
VPN 连接
VPN 连接
必需的 secrets
必需的 secrets
VPN_CONFIG_B64— 经过 Base64 编码的 OpenVPN 配置文件 (.ovpn) 。生成方式:cat corp.ovpn | base64 -w0VPN_AUTH_USER(可选) — VPN 用户名 (如果你的 VPN 需要用户名/密码认证)VPN_AUTH_PASS(可选) — VPN 密码
WG_CONFIG_B64— 经过 Base64 编码的 WireGuard 配置文件。生成方式:cat wg0.conf | base64 -w0
curl 命令替换为需要通过该隧道完成的工作。配置中必须以 inline 方式包含所需的证书和密钥,并使用 dev tun0;请勿启用常驻的 VPN 服务。WG_CONFIG_B64 可用的情况下显式运行此块,并将 curl 命令替换为你的操作:maintenance 并不会使其变为临时性的。不要对处于 active 状态的 tunnel 或 private VPN 配置制作 snapshot。自定义 DNS 解析
自定义 DNS 解析
身份与安全
GPG 提交签名
GPG 提交签名
必需的 secrets
必需的 secrets
GPG_PRIVATE_KEY_B64— Base64 编码的 GPG 私钥。生成方式:gpg --export-secret-keys <key-id> | base64 -w0GPG_SIGNING_KEY— 签名密钥的完整指纹GIT_USER_NAME— Git 作者名称 (例如Devin AI)GIT_USER_EMAIL— Git 作者邮箱。必须与 GPG 密钥上的某个 UID 匹配,否则 GitHub 不会验证签名。
Git 身份与 SSH 密钥
Git 身份与 SSH 密钥
必需的 secrets
必需的 secrets
GIT_USER_NAME— Git 作者名称GIT_USER_EMAIL— Git 作者邮箱SSH_PRIVATE_KEY_B64— Base64 编码的 SSH 私钥。生成方式:cat ~/.ssh/id_ed25519 | base64 -w0SSH_KNOWN_HOSTS_B64— Base64 编码的 known hosts 条目,需与服务器管理员公布的主机密钥指纹核对验证
系统配置
系统软件包
系统软件包
自定义环境变量
自定义环境变量
$ENVRC。推荐的做法是将 KEY=VALUE 逐行写入 $ENVRC 文件。写入 $ENVRC 的变量会自动导出到后续所有步骤以及 Devin 会话中 (类似于 GitHub Actions 的 $GITHUB_ENV) 。区域设置和时区
区域设置和时区
资源限制(ulimits)
资源限制(ulimits)
替换 APT 镜像源
替换 APT 镜像源
必需的 secrets
必需的 secrets
APT_MIRROR_URL— 你的内部 APT 镜像源的 URL (例如:https://artifactory.example.com/artifactory/ubuntu-remote)
高级用法
使用 direnv 管理环境变量
使用 direnv 管理环境变量
initialize 创建 .envrc 文件后,Direnv 会自动加载它们。.envrc 变量会自动加载。无需手动执行 source。按仓库切换 Node 版本
按仓库切换 Node 版本
.nvmrc 为每个仓库切换 Node.js 版本。nvm use 会从仓库根目录读取 .nvmrc。请确保你的仓库中包含该文件 (例如内容为 20) 。浏览器身份验证(Playwright)
浏览器身份验证(Playwright)
localhost:29229。使用 Playwright 脚本可自动完成基于浏览器的登录。scripts/login.py) :自定义系统工具与 PATH
自定义系统工具与 PATH
initialize 中安装系统软件包、自定义二进制文件,并配置 PATH。使用 GitHub Actions 设置工具
使用 GitHub Actions 设置工具
initialize 部分中直接运行 GitHub Actions。这对于通过 CI 所使用的同一套 actions 安装特定版本的工具非常有用。setup-node 和 setup-python 这类 action 会修改 PATH 和环境变量。某个 action 安装的二进制文件在后续所有步骤以及 maintenance 中都可用。支持 Node.js 和复合型 action;Docker action 仅在 Linux 构建中受支持。uses 步骤无法在 maintenance 中运行。参见 GitHub Actions 限制。多个应用的本地 HTTPS 反向代理
多个应用的本地 HTTPS 反向代理
app.example.com、api.example.com 和 admin.example.com。在 initialize 中安装一个反向代理,并将每个主机名路由到不同的本地上游端口。Caddy 可在一个工具中同时处理路由和本地 TLS。Caddyfile 会将每个主机名映射到一个上游,而 tls internal 会通过 Caddy 内置的 CA 为每个主机名自动签发受信任的证书。caddy trust 会将该 CA 根证书安装到系统信任存储中,再将同一个根证书添加到 NSS 数据库后,浏览器也会信任它。通过蓝图编辑器中的 文件附件 部分上传你的 Caddyfile;之后即可通过 $FILE_CADDYFILE 使用它。/etc/hosts 循环会让 app.example.com 在会话内解析到 127.0.0.1。你在 Caddyfile 中写入的每个 hostname,都要在其中添加一条记录。全栈示例
企业全栈(Artifactory)
企业全栈(Artifactory)
必需的 secrets
必需的 secrets
CORP_ROOT_CA_B64— 经过 Base64 编码的企业 CA 证书CORP_HTTP_PROXY— HTTP 代理 URLCORP_HTTPS_PROXY— HTTPS 代理 URLCORP_NO_PROXY— 不走代理的主机
ARTIFACTORY_USER— Artifactory 用户名ARTIFACTORY_TOKEN— Artifactory API 令牌或密码ARTIFACTORY_MAVEN_URL— Maven 仓库 URL (例如,https://artifactory.example.com/artifactory/maven-virtual)ARTIFACTORY_PYPI_URL— PyPI 仓库 URL (例如,https://user:token@artifactory.example.com/artifactory/api/pypi/pypi-virtual/simple)ARTIFACTORY_NPM_URL— npm 仓库 URL (例如,https://artifactory.example.com/artifactory/api/npm/npm-virtual)ARTIFACTORY_DOCKER_URL— Docker 注册表 URL (例如,artifactory.example.com)
- 账户级 (
initialize): 证书与代理 - 组织级 (
initialize): 语言运行时安装 - 组织级 (
maintenance): 包含字面引用的注册表配置 - 会话命令: 显式提供 secrets、加载环境配置,并为单次 Docker 操作登录
多语言与不同制品库
多语言与不同制品库
必需的 secrets
必需的 secrets
NEXUS_MAVEN_URL— Nexus Maven 仓库 URLNEXUS_USER— Nexus 用户名NEXUS_PASS— Nexus 密码GITHUB_PACKAGES_TOKEN— 具有read:packages作用域的 GitHub 个人访问令牌ARTIFACTORY_USER— Artifactory 用户名ARTIFACTORY_TOKEN— Artifactory API 令牌
使用私有镜像源的气隙环境
使用私有镜像源的气隙环境
必需的 secrets
必需的 secrets
CORP_ROOT_CA_B64— Base64 编码的企业 CA 证书
APT_MIRROR_URL— 内部 Ubuntu APT 镜像 URLMIRROR_USER— 用于镜像身份验证的用户名MIRROR_PASS— 用于镜像身份验证的密码JDK_TARBALL_URL— 从内部镜像下载 JDK tarball 的 URLNODE_TARBALL_URL— 从内部镜像下载 Node.js tarball 的 URL
INTERNAL_MAVEN_URL— 内部 Maven 注册表 URLINTERNAL_NPM_URL— 内部 npm 注册表 URLINTERNAL_PYPI_URL— 内部 PyPI 注册表 URL
VPN + 证书 + 代理 + 编程语言
VPN + 证书 + 代理 + 编程语言
必需的 secrets
必需的 secrets
VPN_CONFIG_B64— Base64 编码的 OpenVPN 配置文件
CORP_ROOT_CA_B64— Base64 编码的企业 CA 证书CORP_HTTP_PROXY— HTTP 代理 URLCORP_HTTPS_PROXY— HTTPS 代理 URLCORP_NO_PROXY— 无需通过代理的主机
MAVEN_REGISTRY_URL— Maven 注册表 URLNPM_REGISTRY_URL— npm 注册表 URLPYPI_REGISTRY_HOST— PyPI 注册表主机名REGISTRY_USER— 注册表用户名 (用于 Maven 和 pip)REGISTRY_PASS— 注册表密码 (用于 Maven 和 pip)REGISTRY_TOKEN— npm 身份验证令牌
VPN_CONFIG_B64 必须包含内联的证书/密钥,使用 dev tun0,并且无需交互式身份验证即可连接。运行时下载在同一个隧道生命周期内完成,并显式加载代理环境。会话操作请重复 网络与连通性 中的 VPN 设置/清理块;蓝图不会在会话开始时重新连接 VPN。编写优质蓝图的技巧
- 先在会话中测试命令。 在将命令添加到蓝图之前,先在 Devin 会话中手动运行一遍。这样比等待完整构建周期更快。
- 一次性安装的工具用
initialize,依赖项用maintenance。 任何安装需要几分钟的内容 (编译器、大型二进制文件、全局工具) 都应放在initialize中。较快的依赖命令 (npm install、uv sync) 则应放在maintenance中。 - 让
maintenance命令保持快速。 尽量控制在 2 分钟以内。这些命令会在构建期间运行,并在会话开始时提供给 Agent。 - 非敏感的环境变量请使用
$ENVRC。 不要将凭据或派生令牌写入$ENVRC、.bashrc或.profile。请在需要它的命令中显式 source 依赖 secrets 的 shell 设置。 - 给步骤命名。 使用带有
name字段的展开形式后,构建日志中的失败会更容易定位。 - monorepo 请使用 subshell。
(cd packages/foo && npm install)会在 subshell 中运行,因此后续步骤不会受目录变更影响。 - 使用
npm install,不要使用npm ci。npm ci会删除node_modules并从头重新安装,这对maintenance来说太慢。 - 敏感信息请使用 代码仓库 secrets。 请在仓库蓝图编辑器的 Secrets 选项卡中进行配置,而不要将其硬编码到蓝图中。

