概述
setup-secrets.sh 脚本用于批量设置 GitHub repository secrets。支持设置任意秘钥,包括:
- 数据库连接信息
- JWT/Session 密钥
- Docker Registry 认证
- 第三方 API Keys
- 任意自定义秘钥
快速开始
# 1. 复制配置模板
cp .env.secrets.example .env.secrets
# 2. 编辑配置文件(添加你的秘钥)
# 所有 UPPERCASE 变量都会被设置为 GitHub Secrets
# 3. 运行脚本
./scripts/setup-secrets.sh脚本会:
- 读取所有大写变量
- 显示待设置的秘钥(带遮罩)
- 请求确认
- 批量推送到 GitHub
配置文件格式
.env.secrets 示例:
# 数据库
DATABASE_URL=postgresql://user:pass@host:5432/db
# 应用秘钥
JWT_SECRET=your-jwt-secret-key
SESSION_SECRET=your-session-secret
# Docker Registry (用于 CI/CD)
DOCKER_REGISTRY=docker.io
DOCKER_USERNAME=your-username
DOCKER_PASSWORD=dckr_pat_xxx
# API Keys
STRIPE_SECRET_KEY=sk_test_xxx
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=xxx
# 任意其他秘钥
CUSTOM_SECRET=value注意: 只有 UPPERCASE 变量会被识别为秘钥
使用场景
1. Docker Registry 配置
CI/CD 需要推送镜像到 Docker Registry:
# GitHub Container Registry (默认,无需配置)
# 自动使用 ghcr.io + GITHUB_TOKEN
# Docker Hub
DOCKER_REGISTRY=docker.io
DOCKER_USERNAME=your-dockerhub-username
DOCKER_PASSWORD=dckr_pat_xxxxxxxxxxxx
# 阿里云 ACR
DOCKER_REGISTRY=registry.cn-hangzhou.aliyuncs.com
DOCKER_USERNAME=your-aliyun-account
DOCKER_PASSWORD=your-registry-password
# AWS ECR
DOCKER_REGISTRY=123456789012.dkr.ecr.us-east-1.amazonaws.com
DOCKER_USERNAME=AWS
DOCKER_PASSWORD=<ecr-password>
# Harbor
DOCKER_REGISTRY=harbor.example.com
DOCKER_USERNAME=admin
DOCKER_PASSWORD=Harbor123452. 数据库和应用配置
# 生产数据库
DATABASE_URL=postgresql://prod_user:secure_pass@db.example.com:5432/procure_prod
# 安全密钥(使用强随机字符串)
JWT_SECRET=$(openssl rand -base64 32)
SESSION_SECRET=$(openssl rand -base64 32)
ENCRYPTION_KEY=$(openssl rand -base64 32)3. 第三方服务
# Stripe
STRIPE_SECRET_KEY=sk_live_xxx
STRIPE_WEBHOOK_SECRET=whsec_xxx
# SendGrid
SENDGRID_API_KEY=SG.xxx
# OpenAI
OPENAI_API_KEY=sk-xxx
# AWS
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS_REGION=us-east-14. 多环境配置
为不同环境维护不同的配置文件:
# 开发环境
./scripts/setup-secrets.sh .env.dev
# 测试环境
./scripts/setup-secrets.sh .env.staging
# 生产环境
./scripts/setup-secrets.sh .env.prod环境变量模式
也可以直接使用环境变量:
# 临时导出
export DATABASE_URL=postgresql://...
export JWT_SECRET=xxx
./scripts/setup-secrets.sh
# 或一行命令
DATABASE_URL=xxx JWT_SECRET=yyy ./scripts/setup-secrets.sh前置要求
1. 安装 GitHub CLI
macOS
brew install ghLinux
# Ubuntu/Debian
sudo apt install gh
# Fedora/RHEL
sudo dnf install gh
# 其他发行版参考:
# https://github.com/cli/cli/blob/trunk/docs/install_linux.md2. 认证 GitHub CLI
gh auth login按提示完成认证(推荐使用浏览器登录)。
3. 仓库权限
需要对仓库有 管理员权限 才能设置 Secrets。
验证配置
检查 Secrets
在浏览器中访问:
https://github.com/{owner}/{repo}/settings/secrets/actions或使用 CLI:
gh secret list测试 CI
推送代码触发 workflow:
git push origin main在 Actions 标签页检查构建状态。如果出现认证错误,检查 secrets 是否正确设置。
安全最佳实践
重要: 永远不要将
.env.secrets提交到 Git!
1. 使用 .gitignore
.env.secrets 已添加到 .gitignore,确保不会被提交。
2. 使用 Token 而非密码
对于支持 Token 的服务,优先使用 Token:
- GitHub: Personal Access Token (PAT)
- Docker Hub: Access Token
- AWS: Access Key
- GitLab: Project/Group Access Token
3. 最小权限原则
Token 只授予必要的权限:
# GitHub PAT - 只需 write:packages
# Docker Hub Token - 只需 Read & Write
# AWS IAM - 只授予 ECR push 权限
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
]
}4. 定期轮换
定期更新秘钥并重新运行脚本:
# 每 90 天轮换一次
# 1. 生成新的 token/password
# 2. 更新 .env.secrets
# 3. 重新运行脚本
./scripts/setup-secrets.sh5. 审计日志
GitHub 会记录 Secrets 的修改历史:
Settings → Secrets → Actions → 点击 Secret → View audit log脚本工作原理
#!/usr/bin/env bash
# 1. 解析配置文件
while IFS='=' read -r key value; do
# 只处理 UPPERCASE 变量
if [[ "$key" =~ ^[A-Z_][A-Z0-9_]*$ ]]; then
SECRETS["$key"]="$value"
fi
done < .env.secrets
# 2. 显示待设置的秘钥(带遮罩)
for key in "${!SECRETS[@]}"; do
masked="${SECRETS[$key]:0:4}..."
echo " - $key: $masked"
done
# 3. 请求确认
read -p "Continue? [y/N] " confirm
# 4. 批量设置
for key in "${!SECRETS[@]}"; do
gh secret set "$key" --body "${SECRETS[$key]}"
done故障排除
GitHub CLI 未认证
错误: Not authenticated with GitHub CLI
解决:
gh auth login没有权限
错误: Failed to set secrets
原因: 需要仓库管理员权限
解决: 请仓库 owner 添加你为 admin,或由 owner 运行脚本
Token 过期
某些 Token 有有效期(如 AWS ECR 密码 12 小时)。
解决:
- 对于短期 token,在 CI workflow 中实时获取
- 使用长期凭证(如 AWS Access Key)在 workflow 中生成临时 token
示例(AWS ECR):
- name: Login to Amazon ECR
uses: aws-actions/amazon-ecr-login@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
region: us-east-1