update variable name

This commit is contained in:
Kevin
2026-05-09 17:15:11 +08:00
parent 175784292d
commit 8e344b4246
4 changed files with 29 additions and 32 deletions

View File

@@ -4,7 +4,7 @@
- **工作流文件** [docker-build-deploy.yml](docker-build-deploy.yml) - **工作流文件** [docker-build-deploy.yml](docker-build-deploy.yml)
- **测试 job**:在构建镜像前于 `api/` 下执行 `uv sync --dev``pytest` - **测试 job**:在构建镜像前于 `api/` 下执行 `uv sync --dev``pytest`
- **Secrets**:预发 `STAGING_*`、生产 `PROD_*`、镜像 `ALIYUN_CR_*` — 详见 [SETUP.md](SETUP.md)。 - **Secrets**:预发无前缀 `SSH_*` / `DEPLOY_PATH`、生产 `PROD_*`、镜像 `ALIYUN_CR_*` — 详见 [SETUP.md](SETUP.md)。
- **分支 / Tag**`main` → Staging 服务器;语义化 tag `v*.*.*` → Production 服务器;路径过滤为 `api/**` 与本 workflow。 - **分支 / Tag**`main` → Staging 服务器;语义化 tag `v*.*.*` → Production 服务器;路径过滤为 `api/**` 与本 workflow。
- **手动补跑**`workflow_dispatch` 仅支持 `main` / `master`Staging`vMAJOR.MINOR.PATCH` tagProduction。其它 ref 会在测试与构建前失败。 - **手动补跑**`workflow_dispatch` 仅支持 `main` / `master`Staging`vMAJOR.MINOR.PATCH` tagProduction。其它 ref 会在测试与构建前失败。

View File

@@ -6,12 +6,12 @@
| Secret | 说明 | | Secret | 说明 |
|--------|------| |--------|------|
| `STAGING_SSH_PRIVATE_KEY` | 预发机 SSH 私钥全文 | | `SSH_PRIVATE_KEY` | 预发Staging机 SSH 私钥全文 |
| `STAGING_SSH_HOST` | 预发机主机名或 IP | | `SSH_HOST` | 预发机主机名或 IP |
| `STAGING_SSH_USER` | SSH 用户名 | | `SSH_USER` | 预发 SSH 用户名 |
| `STAGING_SSH_PORT` | SSH 端口(默认 `22` | | `SSH_PORT` | 预发 SSH 端口(默认 `22` |
| `STAGING_DEPLOY_PATH` | 预发机上的部署目录 | | `DEPLOY_PATH` | 预发机上的部署目录 |
| `PROD_SSH_PRIVATE_KEY` | 生产机 SSH 私钥(可与预发不同) | | `PROD_SSH_PRIVATE_KEY` | 生产机 SSH 私钥 |
| `PROD_SSH_HOST` | 生产机主机 | | `PROD_SSH_HOST` | 生产机主机 |
| `PROD_SSH_USER` | 生产 SSH 用户 | | `PROD_SSH_USER` | 生产 SSH 用户 |
| `PROD_SSH_PORT` | 生产 SSH 端口 | | `PROD_SSH_PORT` | 生产 SSH 端口 |
@@ -19,10 +19,8 @@
| `ALIYUN_CR_USERNAME` | 阿里云 ACR 用户名 | | `ALIYUN_CR_USERNAME` | 阿里云 ACR 用户名 |
| `ALIYUN_CR_PASSWORD` | 阿里云 ACR 密码 | | `ALIYUN_CR_PASSWORD` | 阿里云 ACR 密码 |
> **Staging 服务器**`main` 分支发布使用 `STAGING_*`,用于部署到独立的预发服务器。<br> > **Staging**`main` 发布使用无前缀 `SSH_*` 与 `DEPLOY_PATH`。<br>
> **Production 服务器**:推送 `v*.*.*`(如 `v1.2.0`)时使用 `PROD_*`。 > **Production**`v*.*.*` tag 发布使用 `PROD_*`。
旧的无前缀 `SSH_HOST` / `SSH_USER` / `SSH_PRIVATE_KEY` / `SSH_PORT` / `DEPLOY_PATH` 指向生产机,当前 release workflow 不再读取它们;不要把这些值复制成 `STAGING_*`。Staging 需要填写另一台预发服务器自己的 `STAGING_*`
## 触发条件 ## 触发条件

View File

@@ -1,11 +1,10 @@
# API Dockermain → Staging 机(Repository secrets: STAGING_*Tag v*.*.* → Prod 机PROD_* # API Dockermain → Staging 机(无前缀 SSH_* / DEPLOY_PATHTag v*.*.* → Prod 机PROD_*
# 在 Repo → Settings → Secrets and variables → Actions 中配置,无需 GitHub Environments。 # 在 Repo → Settings → Secrets and variables → Actions 中配置,无需 GitHub Environments。
# 命名STAGING_SSH_HOST / STAGING_SSH_USER / STAGING_SSH_PRIVATE_KEY / STAGING_SSH_PORT / STAGING_DEPLOY_PATH # StagingSSH_HOST / SSH_USER / SSH_PRIVATE_KEY / SSH_PORT / DEPLOY_PATH
# PROD_SSH_HOST / PROD_SSH_USER / PROD_SSH_PRIVATE_KEY / PROD_SSH_PORT / PROD_DEPLOY_PATH # ProductionPROD_SSH_HOST / PROD_SSH_USER / PROD_SSH_PRIVATE_KEY / PROD_SSH_PORT / PROD_DEPLOY_PATH
# 阿里云镜像仍为仓库级ALIYUN_CR_USERNAME / ALIYUN_CR_PASSWORD # 阿里云镜像仍为仓库级ALIYUN_CR_USERNAME / ALIYUN_CR_PASSWORD
# #
# 注意:旧的无前缀 SSH_HOST / SSH_PRIVATE_KEY / DEPLOY_PATH 指向生产机;本 workflow 不再读取它们 # 勿把 PROD 私钥与 Staging 混用staging 只读 SSH_PRIVATE_KEYprod 只读 PROD_SSH_PRIVATE_KEY
# Staging 必须使用另一台服务器对应的 STAGING_*Production 使用 PROD_*。
# #
# 旧库 pg_dump 一次性迁入当前 schema见 workflow「Legacy DB migrate (one-shot)」(手动运行,非每次构建)。 # 旧库 pg_dump 一次性迁入当前 schema见 workflow「Legacy DB migrate (one-shot)」(手动运行,非每次构建)。
# #
@@ -184,14 +183,14 @@ jobs:
- name: Ensure staging SSH secret is set - name: Ensure staging SSH secret is set
if: needs.resolve-deploy-target.outputs.target != 'prod' if: needs.resolve-deploy-target.outputs.target != 'prod'
env: env:
STAGING_SSH_PRIVATE_KEY: ${{ secrets.STAGING_SSH_PRIVATE_KEY }} SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: | run: |
if [ -z "$STAGING_SSH_PRIVATE_KEY" ]; then if [ -z "$SSH_PRIVATE_KEY" ]; then
echo "::error::STAGING_SSH_PRIVATE_KEY 未配置或为空,无法部署 staging。请在 Repository secrets 中设置 STAGING_SSH_*。" echo "::error::SSH_PRIVATE_KEY 未配置或为空,无法部署 staging。请在 Repository secrets 中设置 SSH_HOST / SSH_USER / SSH_PRIVATE_KEY / SSH_PORT / DEPLOY_PATH。"
exit 1 exit 1
fi fi
# 勿用 `prod && PROD_KEY || STAGING_KEY`PROD 为空时会错误回退到 staging 密钥,导致连生产机报 Permission denied。 # 勿用 `prod && PROD_KEY || SSH_KEY`PROD 为空时会错误回退到 staging 密钥,导致连生产机报 Permission denied。
- name: Set up SSH (production) - name: Set up SSH (production)
if: needs.resolve-deploy-target.outputs.target == 'prod' if: needs.resolve-deploy-target.outputs.target == 'prod'
uses: webfactory/ssh-agent@v0.9.1 uses: webfactory/ssh-agent@v0.9.1
@@ -202,7 +201,7 @@ jobs:
if: needs.resolve-deploy-target.outputs.target != 'prod' if: needs.resolve-deploy-target.outputs.target != 'prod'
uses: webfactory/ssh-agent@v0.9.1 uses: webfactory/ssh-agent@v0.9.1
with: with:
ssh-private-key: ${{ secrets.STAGING_SSH_PRIVATE_KEY }} ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Export deploy connection env - name: Export deploy connection env
run: | run: |
@@ -215,10 +214,10 @@ jobs:
} >> "$GITHUB_ENV" } >> "$GITHUB_ENV"
else else
{ {
echo "SSH_HOST=${{ secrets.STAGING_SSH_HOST }}" echo "SSH_HOST=${{ secrets.SSH_HOST }}"
echo "SSH_USER=${{ secrets.STAGING_SSH_USER }}" echo "SSH_USER=${{ secrets.SSH_USER }}"
echo "SSH_PORT=${{ secrets.STAGING_SSH_PORT || '22' }}" echo "SSH_PORT=${{ secrets.SSH_PORT || '22' }}"
echo "COMPOSE_DIR=${{ secrets.STAGING_DEPLOY_PATH || '/opt/life-echo' }}" echo "COMPOSE_DIR=${{ secrets.DEPLOY_PATH || '/opt/life-echo' }}"
} >> "$GITHUB_ENV" } >> "$GITHUB_ENV"
fi fi

View File

@@ -3,12 +3,12 @@
# 目标库须已是 alembic upgrade head与线上一致占号用户清理逻辑依赖当前全部迁移后的表结构。 # 目标库须已是 alembic upgrade head与线上一致占号用户清理逻辑依赖当前全部迁移后的表结构。
# #
# 不会在 push / 部署时自动运行,仅手动 workflow_dispatch避免每次构建误迁库。 # 不会在 push / 部署时自动运行,仅手动 workflow_dispatch避免每次构建误迁库。
# 远端需已用 docker compose 部署(目录约定与 docker-build-deploy 一致:STAGING_DEPLOY_PATH / PROD_DEPLOY_PATH # 远端需已用 docker compose 部署(目录约定与 docker-build-deploy 一致DEPLOY_PATH / PROD_DEPLOY_PATH
# #
# 备份文件:提交在仓库 api/backups/<dump_filename>(默认 life_echo_20260313_182756.sql # 备份文件:提交在仓库 api/backups/<dump_filename>(默认 life_echo_20260313_182756.sql
# workflow 会先 scp 到远端再迁移。其他 *.sql 仍被 gitignore需按需增加 ! 例外行。 # workflow 会先 scp 到远端再迁移。其他 *.sql 仍被 gitignore需按需增加 ! 例外行。
# #
# Secrets与 Docker Build and Deploy 相同(STAGING_* / PROD_*)。 # Secrets与 Docker Build and Deploy 相同(staging无前缀 SSH_* / DEPLOY_PATHproductionPROD_*)。
name: Legacy DB migrate (one-shot) name: Legacy DB migrate (one-shot)
@@ -82,7 +82,7 @@ jobs:
if: github.event.inputs.environment != 'production' if: github.event.inputs.environment != 'production'
uses: webfactory/ssh-agent@v0.9.1 uses: webfactory/ssh-agent@v0.9.1
with: with:
ssh-private-key: ${{ secrets.STAGING_SSH_PRIVATE_KEY }} ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Export deploy connection env - name: Export deploy connection env
run: | run: |
@@ -95,10 +95,10 @@ jobs:
} >> "$GITHUB_ENV" } >> "$GITHUB_ENV"
else else
{ {
echo "SSH_HOST=${{ secrets.STAGING_SSH_HOST }}" echo "SSH_HOST=${{ secrets.SSH_HOST }}"
echo "SSH_USER=${{ secrets.STAGING_SSH_USER }}" echo "SSH_USER=${{ secrets.SSH_USER }}"
echo "SSH_PORT=${{ secrets.STAGING_SSH_PORT || '22' }}" echo "SSH_PORT=${{ secrets.SSH_PORT || '22' }}"
echo "COMPOSE_DIR=${{ secrets.STAGING_DEPLOY_PATH || '/opt/life-echo' }}" echo "COMPOSE_DIR=${{ secrets.DEPLOY_PATH || '/opt/life-echo' }}"
} >> "$GITHUB_ENV" } >> "$GITHUB_ENV"
fi fi