@basenative /多普勒
管道,而不是价值观。BaseNative为每个项目提供相同的多普勒工作流程;多普勒掌握着真正的秘密。
之上的一个瘦的、无依赖的开发人员体验层 多普勒 CLI。让每个DuganLabs repo (basenative, duganlabs, greenput, pendingbusiness, ralph-station, t4bs, warren-sys, warrendugan)引导,验证,并运行多普勒完全相同的方式。
边界规则
BaseNative只提供管道。 它从不读取、存储或传输值。
这个包中的每个命令都输出为 doppler 为了真正的工作。CLI的存在是为了使跨项目的工作流保持一致,而不是充当自己的秘密存储库。
安装
# Per-project
pnpm add @basenative/doppler
# The doppler CLI is a system dependency, not an npm dep:
brew install dopplerhq/cli/doppler # macOS
curl -Ls --tlsv1.2 https://cli.doppler.com/install.sh | sh # Linux
scoop install doppler # Windows
doppler login # one time
一次性项目设置
bn-doppler init my-app
这将:
- 创建一个名为
my-app. - 创建配置
dev,prep,prod. - 将本地回购钉在
dev配置(doppler setup)。 - 放下启动器
doppler-required.json进入回购根目录。
编辑 doppler-required.json 要声明应用程序需要哪些秘密:
{
"secrets": [
{ "name": "DATABASE_URL", "required": true },
{ "name": "SESSION_SECRET", "required": true },
{ "name": "SENTRY_DSN", "required": false }
],
"configs": ["dev", "prep", "prod"]
}
然后通过仪表板或CLI设置值:
doppler secrets set DATABASE_URL
doppler secrets set SESSION_SECRET
本地开发工作流程
# Recommended in your repo's package.json scripts:
{
"dev": "doppler run -- pnpm exec bn-wrangler pages dev dist",
"build": "doppler run -- pnpm build"
}
# Or via the wrapper:
bn-doppler run -- pnpm dev
就是这样。否 .env 文件。不要意外泄露秘密。如果缺少一个秘密,应用程序会在启动时得到一个快速的,特定的错误 requireSecrets.
CI/CD接线(GitHub Actions)
# Once, locally:
bn-doppler ci-token --config prod
# (it asks for confirmation, then prints the token)
# Add it to the repo:
gh secret set DOPPLER_TOKEN --body "<paste>"
然后在 .github/workflows/deploy.yml (全文载于 templates/.github-actions-doppler-snippet.yml):
- uses: dopplerhq/cli-action@v3
- name: Verify Doppler secrets
env: { DOPPLER_TOKEN: ${{ secrets.DOPPLER_TOKEN }} }
run: pnpm exec bn-doppler verify --config prod
- name: Deploy
env: { DOPPLER_TOKEN: ${{ secrets.DOPPLER_TOKEN }} }
run: doppler run --config prod -- pnpm exec bn-wrangler deploy
bn-doppler verify
反复试验 doppler-required.json 对比实际的多普勒配置:
bn-doppler verify --config dev
# OK — all 3 required secret(s) are populated in config "dev".
如果缺少任何东西,它将退出非零状态,并准确地打印缺少的名称——作为部署前CI的第一步是完美的。
编程API
import {
dopplerRun,
requireSecrets,
injectIntoWrangler,
MissingSecretsError,
} from '@basenative/doppler';
import { loadRequired, findMissing } from '@basenative/doppler/required';
// Boot-time check (after `doppler run -- node ./server.js` injects env vars):
await requireSecrets(['DATABASE_URL', 'SESSION_SECRET']);
// Or pull straight from Doppler:
await requireSecrets(['DATABASE_URL'], {
source: 'doppler',
project: 'my-app',
config: 'prod',
});
// Split resolved values into vars vs secrets for Wrangler:
const { vars, secrets } = injectIntoWrangler({
env: process.env,
names: ['APP_NAME', 'API_TOKEN', 'SESSION_SECRET'],
});
// Or run a child process under doppler:
await dopplerRun(['pnpm', 'build'], { config: 'prod' });
为什么会出现这种模式
- 每个项目都有一个剧本。
doppler run -- pnpm dev同样的道理basenative,t4bs,greenput等。 - 否
.env漂移。 本地开发,预览和prod都从相同的规范多普勒配置中读取。 - CI审核。 一个
DOPPLER_TOKEN而不是17个单独的秘密。 - 引导时快速失败。
requireSecrets将凌晨3点的生产页面转换为上午9点的红色CI运行。 - BaseNative中没有值。 这个包裹是管道,所有真正的秘密都在多普勒,就这样。
链接
- 碱性单氧- https://github.com/DuganLabs/basenative
- 问题- - - - - - https://github.com/DuganLabs/basenative/issues
- 文档- https://github.com/DuganLabs/basenative#readme
许可证
apache - 2.0