本文目录导读:

设计一键部署脚本时,环境变量的设计直接决定了脚本的灵活性、安全性和可移植性,以下是需要重点考虑的环境变量分类及具体建议:
核心必选环境变量
部署目标信息
# 目标服务器(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 |
通过合理设计环境变量,可以让你的一键部署脚本同时兼顾灵活性、安全性和可维护性,适用于多环境(开发/测试/生产)和多架构(容器/虚拟机/物理机)部署。