本文目录导读:

设计一键部署脚本时,环境变量的设计直接决定了脚本的灵活性、安全性和可移植性,以下是需要重点考虑的环境变量分类及具体建议:
核心必选环境变量
部署目标信息
# 目标服务器(SSH连接) DEPLOY_HOST=192.168.1.100 DEPLOY_USER=deployer DEPLOY_PORT=22 # 或本地路径 DEPLOY_LOCAL_PATH=/var/www/app
应用基本信息
APP_NAME=my-web-app APP_VERSION=1.2.0 BUILD_ENV=production # production/staging/testing
凭据与安全
# SSH密钥 SSH_PRIVATE_KEY_PATH=~/.ssh/id_rsa # 或密码(不推荐,优先密钥) DEPLOY_PASSWORD= # API密钥(重要) AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= DOCKER_REGISTRY_PASSWORD=
构建与打包配置
源码与构建
# Git仓库 GIT_REPO_URL=https://github.com/user/repo.git GIT_BRANCH=main GIT_TAG=v1.2.0 # 优先于分支 # 构建命令 BUILD_COMMAND="npm run build" BUILD_OUTPUT_DIR=dist/ # 要上传的目录 BUILD_ARTIFACTS=*.jar # 或特定文件模式
Docker 相关
DOCKER_IMAGE_NAME=myapp DOCKER_IMAGE_TAG=latest DOCKERFILE_PATH=./Dockerfile DOCKER_COMPOSE_FILE=docker-compose.prod.yml DOCKER_REGISTRY=docker.io/user
运行时环境
应用配置
# 数据库 DB_HOST=localhost DB_PORT=3306 DB_NAME=myapp DB_USER=app_user DB_PASSWORD=secret # 缓存 REDIS_HOST=localhost REDIS_PORT=6379 # 消息队列 RABBITMQ_HOST= KAFKA_BOOTSTRAP_SERVERS=
服务发现与网络
# Kubernetes KUBE_NAMESPACE=production KUBE_CONTEXT=prod-cluster KUBE_DEPLOYMENT=myapp-deployment # 反向代理 NGINX_SITES_AVAILABLE=/etc/nginx/sites-available/ DOMAIN_NAME=example.com SSL_CERT_PATH=/etc/ssl/certs/
通知与监控
告警渠道
# Slack SLACK_WEBHOOK_URL=https://hooks.slack.com/services/XXX SLACK_CHANNEL=#deployments # 邮件 ADMIN_EMAIL=admin@example.com SMTP_SERVER=smtp.example.com
监控集成
# Datadog DD_API_KEY= DD_APP_KEY= DD_SITE=datadoghq.com # Sentry SENTRY_DSN= SENTRY_ORG= SENTRY_PROJECT=
回滚与故障恢复
备份相关
BACKUP_DIR=/opt/backups ROLLBACK_VERSION=v1.1.0 # 指定回滚到哪个版本 KEEP_RELEASES=5 # 保留最近几个版本
最佳实践建议
变量命名规范
- 全部大写,用下划线分隔:
DEPLOY_HOST - 有意义的命名:
DB_MASTER_HOST而非DBHOST - 避免默认值冲突:使用 提供安全默认值
安全管理
# ✅ 推荐:从文件读取敏感信息 DB_PASSWORD=$(cat /run/secrets/db_password) # ❌ 避免:直接在环境变量明文书写 export DB_PASSWORD="mysecret" # 不安全
分层设计建议
# 必须 (硬依赖)
DEPLOY_HOST
BUILD_ENV
APP_NAME
# 可选 (有默认值)
DEPLOY_PORT=${DEPLOY_PORT:-22}
KEEP_RELEASES=${KEEP_RELEASES:-5}
# 条件 (特定场景需要)
# Docker部署需要
DOCKER_REGISTRY_PASSWORD
# K8s部署需要
KUBE_NAMESPACE
示例 .env 文件模板
# .env.example (不含真实密码) APP_NAME=myapp BUILD_ENV=production DEPLOY_HOST=192.168.1.100 DEPLOY_USER=deployer # 敏感变量由CI/CD注入 # DB_PASSWORD 通过 vault secrets 注入 # SSH_KEY 通过环境变量传入
脚本中处理示例
#!/bin/bash
set -euo pipefail
# 1. 验证必需变量
required_vars=(
"DEPLOY_HOST"
"BUILD_ENV"
"APP_NAME"
)
for var in "${required_vars[@]}"; do
if [[ -z "${!var:-}" ]]; then
echo "错误: 环境变量 $var 未设置"
exit 1
fi
done
# 2. 设置默认值
DEPLOY_PORT=${DEPLOY_PORT:-22}
KEEP_RELEASES=${KEEP_RELEASES:-5}
# 3. 敏感变量从文件读取(如果存在)
if [[ -f /run/secrets/db_password ]]; then
DB_PASSWORD=$(cat /run/secrets/db_password)
fi
# 4. 部署逻辑
echo "开始部署 $APP_NAME 到 $DEPLOY_HOST..."
不同场景典型变量组合
| 部署类型 | 必需变量 | 可选变量 |
|---|---|---|
| 裸机/Nginx | DEPLOY_HOST, BUILD_OUTPUT_DIR |
NGINX_SITES_AVAILABLE |
| Docker | DOCKER_IMAGE_NAME, DOCKERFILE_PATH |
DOCKER_COMPOSE_FILE |
| K8s | KUBE_NAMESPACE, KUBE_CONTEXT |
KUBE_DEPLOYMENT |
| 函数计算 | FUNCTION_NAME, RUNTIME |
HANDLER, TIMEOUT |
通过合理设计环境变量,可以让你的一键部署脚本同时兼顾灵活性、安全性和可维护性,适用于多环境(开发/测试/生产)和多架构(容器/虚拟机/物理机)部署。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播