Skip to Content

概述

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

脚本会:

  1. 读取所有大写变量
  2. 显示待设置的秘钥(带遮罩)
  3. 请求确认
  4. 批量推送到 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=Harbor12345

2. 数据库和应用配置

# 生产数据库 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-1

4. 多环境配置

为不同环境维护不同的配置文件:

# 开发环境 ./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 gh

Linux

# Ubuntu/Debian sudo apt install gh # Fedora/RHEL sudo dnf install gh # 其他发行版参考: # https://github.com/cli/cli/blob/trunk/docs/install_linux.md

2. 认证 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.sh

5. 审计日志

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

相关文档