fix(ci,build): 双路径双 Job 注入 OAuth 6 条 secrets 到构建期\n\n根因(Run #71 已确诊):\n - Preflight Job 的「执行 nuxt build」step 的 env 注入在当前 Gitea Actions 版本下没生效(整个日志中搜不到 [OAuth] 字样)\n - 构建镜像 Job 的 docker buildx build 完全没透传 OAuth 变量,镜像内 RUN npm run build 看不到 process.env.AGGREGATE_OAUTH_APP_ID\n - nuxt.config.ts runtimeConfig.public.oauth.aggregate = !!process.env.AGGREGATE_OAUTH_APP_ID 两个路径都拿不到值 → 一直 false\n - 前端登录页第三方登录分区一直渲染占位提示,不出微信按钮\n\n修复(两条独立链路,任一条成功按钮都会出现):\n ① 链路 A(preflight 产物):preflight Job 加「注入 OAuth secrets 到 GITHUB_ENV」Step(_append_env 双引号包住值写 $GITHUB_ENV),保证后续所有 step(含 nuxt build)的进程级 process.env 都有 6 个变量\n ② 链路 B(容器镜像):Dockerfile COPY . . 后新增 6 个 ARG(OAUTH_REDIRECT_URI / OAUTH_STATE_SECRET / AGGREGATE_OAUTH_APP_ID / APP_KEY / LOGIN_TYPE / ENDPOINT)并 ENV 导出,保证 RUN node scripts/memory-build.js(npm run build)能读到\n ③ deploy.yml build-image Job:新增「注入 OAuth secrets 到 GITHUB_ENV」Step(与 preflight 同样的 _append_env 逻辑),紧接着的「构建并推送镜像」Step 把这 6 条变量逐个非空判后拼进 BUILD_ARGS=(--build-arg ...),并打印每条是否已注入(不打印值)\n\n配合 Deploy Job 原本已实现的远端 /data/opt/byw-voicehub/.env upsert(SSH 运行期写入):\n - 运行期容器(docker-compose env_file: [.env])也有同一套 6 条变量 → server/utils/oauth-strategies.ts loadAggregateSettings 的 env fallback 能读到 auxx.cn 凭据,完成微信扫码登录/绑定全链路。\n\n诊断日志(新的 Run #72 中应出现):\n [OAuth-secrets] AGGREGATE_OAUTH_APP_ID=已注入 (len=4) (若配置过 Secrets)\n [OAuth build-args] AGGREGATE_OAUTH_APP_ID=已注入\n [OAuth] build-time AGGREGATE_OAUTH_APP_ID 已配置(前端第三方登录按钮会显示), LOGIN_TYPE=wx
This commit is contained in:
@@ -178,6 +178,35 @@ jobs:
|
|||||||
git clone --depth 1 -b "${BRANCH}" "${REPO_URL}" .
|
git clone --depth 1 -b "${BRANCH}" "${REPO_URL}" .
|
||||||
git rev-parse --short HEAD
|
git rev-parse --short HEAD
|
||||||
|
|
||||||
|
- name: 注入 OAuth secrets 到 GITHUB_ENV(所有后续 step 自动继承,避免 step.env 在某些 Gitea Actions 版本中不生效)
|
||||||
|
env:
|
||||||
|
OAUTH_REDIRECT_URI: ${{ secrets.OAUTH_REDIRECT_URI }}
|
||||||
|
OAUTH_STATE_SECRET: ${{ secrets.OAUTH_STATE_SECRET }}
|
||||||
|
AGGREGATE_OAUTH_APP_ID: ${{ secrets.AGGREGATE_OAUTH_APP_ID }}
|
||||||
|
AGGREGATE_OAUTH_APP_KEY: ${{ secrets.AGGREGATE_OAUTH_APP_KEY }}
|
||||||
|
AGGREGATE_OAUTH_LOGIN_TYPE: ${{ secrets.AGGREGATE_OAUTH_LOGIN_TYPE }}
|
||||||
|
AGGREGATE_OAUTH_ENDPOINT: ${{ secrets.AGGREGATE_OAUTH_ENDPOINT }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
OAUTH_ENV_FILE="$GITHUB_ENV"
|
||||||
|
# 所有变量只要非空就写入 GITHUB_ENV;写入时用双引号包住值,避免包含 ://[provider]/ 等特殊字符时被错误解析
|
||||||
|
_append_env() {
|
||||||
|
local K="$1" V="$2"
|
||||||
|
if [ -n "${V}" ]; then
|
||||||
|
printf '%s="%s"\n' "$K" "$V" >> "$OAUTH_ENV_FILE"
|
||||||
|
echo "[OAuth-secrets] $K=已注入 (len=${#V})"
|
||||||
|
else
|
||||||
|
echo "[OAuth-secrets] $K=未配置(Repository Secrets 中缺失或为空)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
_append_env OAUTH_REDIRECT_URI "${OAUTH_REDIRECT_URI:-}"
|
||||||
|
_append_env OAUTH_STATE_SECRET "${OAUTH_STATE_SECRET:-}"
|
||||||
|
_append_env AGGREGATE_OAUTH_APP_ID "${AGGREGATE_OAUTH_APP_ID:-}"
|
||||||
|
_append_env AGGREGATE_OAUTH_APP_KEY "${AGGREGATE_OAUTH_APP_KEY:-}"
|
||||||
|
_append_env AGGREGATE_OAUTH_LOGIN_TYPE "${AGGREGATE_OAUTH_LOGIN_TYPE:-}"
|
||||||
|
_append_env AGGREGATE_OAUTH_ENDPOINT "${AGGREGATE_OAUTH_ENDPOINT:-}"
|
||||||
|
echo "[OAuth-secrets] 写入完成;后续所有 step 都会自动把上述变量作为进程级 process.env.* 继承(包括 nuxt build)"
|
||||||
|
|
||||||
- name: 安装依赖(npm ci,含网络超时兜底:双 registry 切换 + 3 次重试 + fetch-retires 5 次 + 5 分钟 fetch-timeout)
|
- name: 安装依赖(npm ci,含网络超时兜底:双 registry 切换 + 3 次重试 + fetch-retires 5 次 + 5 分钟 fetch-timeout)
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@@ -355,6 +384,34 @@ jobs:
|
|||||||
docker version
|
docker version
|
||||||
docker buildx version || echo "buildx 未安装,将使用 docker build --push"
|
docker buildx version || echo "buildx 未安装,将使用 docker build --push"
|
||||||
|
|
||||||
|
- name: 注入 OAuth secrets 到 GITHUB_ENV(Docker build-arg 与运行期容器 .env 共用同一来源,构建期注入对应镜像 .output)
|
||||||
|
env:
|
||||||
|
OAUTH_REDIRECT_URI: ${{ secrets.OAUTH_REDIRECT_URI }}
|
||||||
|
OAUTH_STATE_SECRET: ${{ secrets.OAUTH_STATE_SECRET }}
|
||||||
|
AGGREGATE_OAUTH_APP_ID: ${{ secrets.AGGREGATE_OAUTH_APP_ID }}
|
||||||
|
AGGREGATE_OAUTH_APP_KEY: ${{ secrets.AGGREGATE_OAUTH_APP_KEY }}
|
||||||
|
AGGREGATE_OAUTH_LOGIN_TYPE: ${{ secrets.AGGREGATE_OAUTH_LOGIN_TYPE }}
|
||||||
|
AGGREGATE_OAUTH_ENDPOINT: ${{ secrets.AGGREGATE_OAUTH_ENDPOINT }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
OAUTH_ENV_FILE="$GITHUB_ENV"
|
||||||
|
_append_env() {
|
||||||
|
local K="$1" V="$2"
|
||||||
|
if [ -n "${V}" ]; then
|
||||||
|
printf '%s="%s"\n' "$K" "$V" >> "$OAUTH_ENV_FILE"
|
||||||
|
echo "[OAuth-secrets] $K=已注入 (len=${#V})"
|
||||||
|
else
|
||||||
|
echo "[OAuth-secrets] $K=未配置(Repository Secrets 中缺失或为空)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
_append_env OAUTH_REDIRECT_URI "${OAUTH_REDIRECT_URI:-}"
|
||||||
|
_append_env OAUTH_STATE_SECRET "${OAUTH_STATE_SECRET:-}"
|
||||||
|
_append_env AGGREGATE_OAUTH_APP_ID "${AGGREGATE_OAUTH_APP_ID:-}"
|
||||||
|
_append_env AGGREGATE_OAUTH_APP_KEY "${AGGREGATE_OAUTH_APP_KEY:-}"
|
||||||
|
_append_env AGGREGATE_OAUTH_LOGIN_TYPE "${AGGREGATE_OAUTH_LOGIN_TYPE:-}"
|
||||||
|
_append_env AGGREGATE_OAUTH_ENDPOINT "${AGGREGATE_OAUTH_ENDPOINT:-}"
|
||||||
|
echo "[OAuth-secrets] build-image 作业写入完成;docker build 可作为 build-arg 透传到 nuxt build"
|
||||||
|
|
||||||
- name: 计算镜像标签
|
- name: 计算镜像标签
|
||||||
id: meta
|
id: meta
|
||||||
run: |
|
run: |
|
||||||
@@ -483,6 +540,23 @@ jobs:
|
|||||||
--build-arg NODE_BUILDER_TAG="${NODE_BUILDER_TAG}"
|
--build-arg NODE_BUILDER_TAG="${NODE_BUILDER_TAG}"
|
||||||
--build-arg NODE_RUNTIME_TAG="${NODE_RUNTIME_TAG}"
|
--build-arg NODE_RUNTIME_TAG="${NODE_RUNTIME_TAG}"
|
||||||
)
|
)
|
||||||
|
# ========== 关键:OAuth 6 条 secrets 通过 --build-arg 透传到 Dockerfile 的 ARG ==========
|
||||||
|
# 这样镜像内部 RUN node scripts/memory-build.js(npm run build)时,
|
||||||
|
# process.env.AGGREGATE_OAUTH_APP_ID 就能读到,nuxt.config.ts public.oauth.aggregate = !!process.env.AGGREGATE_OAUTH_APP_ID
|
||||||
|
# 才会为 true → 前端渲染绿色微信按钮,不显示占位提示
|
||||||
|
if [ -n "${OAUTH_REDIRECT_URI:-}" ]; then BUILD_ARGS+=( --build-arg OAUTH_REDIRECT_URI="${OAUTH_REDIRECT_URI}" ); fi
|
||||||
|
if [ -n "${OAUTH_STATE_SECRET:-}" ]; then BUILD_ARGS+=( --build-arg OAUTH_STATE_SECRET="${OAUTH_STATE_SECRET}" ); fi
|
||||||
|
if [ -n "${AGGREGATE_OAUTH_APP_ID:-}" ]; then BUILD_ARGS+=( --build-arg AGGREGATE_OAUTH_APP_ID="${AGGREGATE_OAUTH_APP_ID}" ); fi
|
||||||
|
if [ -n "${AGGREGATE_OAUTH_APP_KEY:-}" ];then BUILD_ARGS+=( --build-arg AGGREGATE_OAUTH_APP_KEY="${AGGREGATE_OAUTH_APP_KEY}" ); fi
|
||||||
|
if [ -n "${AGGREGATE_OAUTH_LOGIN_TYPE:-}" ]; then BUILD_ARGS+=( --build-arg AGGREGATE_OAUTH_LOGIN_TYPE="${AGGREGATE_OAUTH_LOGIN_TYPE}" ); fi
|
||||||
|
if [ -n "${AGGREGATE_OAUTH_ENDPOINT:-}" ]; then BUILD_ARGS+=( --build-arg AGGREGATE_OAUTH_ENDPOINT="${AGGREGATE_OAUTH_ENDPOINT}" ); fi
|
||||||
|
# 日志打印(只打有无,不打 value)
|
||||||
|
echo "[OAuth build-args] OAUTH_REDIRECT_URI=$( [ -n "${OAUTH_REDIRECT_URI:-}" ] && echo 已注入 || echo 空 )"
|
||||||
|
echo "[OAuth build-args] OAUTH_STATE_SECRET=$( [ -n "${OAUTH_STATE_SECRET:-}" ] && echo 已注入 || echo 空 )"
|
||||||
|
echo "[OAuth build-args] AGGREGATE_OAUTH_APP_ID=$( [ -n "${AGGREGATE_OAUTH_APP_ID:-}" ] && echo 已注入 || echo 空 )"
|
||||||
|
echo "[OAuth build-args] AGGREGATE_OAUTH_APP_KEY=$( [ -n "${AGGREGATE_OAUTH_APP_KEY:-}" ] && echo 已注入 || echo 空 )"
|
||||||
|
echo "[OAuth build-args] AGGREGATE_OAUTH_LOGIN_TYPE=$( [ -n "${AGGREGATE_OAUTH_LOGIN_TYPE:-}" ] && echo 已注入 || echo 空 )"
|
||||||
|
echo "[OAuth build-args] AGGREGATE_OAUTH_ENDPOINT=$( [ -n "${AGGREGATE_OAUTH_ENDPOINT:-}" ] && echo 已注入 || echo 空 )"
|
||||||
# 说明:暂时关闭 registry 分层缓存(buildkitd 推 buildcache 也要认证,同样会触发 Gitea 1.27 OAuth2 空 token)
|
# 说明:暂时关闭 registry 分层缓存(buildkitd 推 buildcache 也要认证,同样会触发 Gitea 1.27 OAuth2 空 token)
|
||||||
# 改为本地 Docker daemon 缓存,已构建的层会自动复用,下次 build 速度几乎相同
|
# 改为本地 Docker daemon 缓存,已构建的层会自动复用,下次 build 速度几乎相同
|
||||||
BUILD_ARGS+=( --no-cache )
|
BUILD_ARGS+=( --no-cache )
|
||||||
|
|||||||
+17
@@ -37,6 +37,23 @@ RUN set -eux; \
|
|||||||
# 只有在 package.json 没变而源代码改变时,才会从这一步开始重新执行,跳过上面的耗时依赖安装
|
# 只有在 package.json 没变而源代码改变时,才会从这一步开始重新执行,跳过上面的耗时依赖安装
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
|
# ========== OAuth / 第三方登录构建期配置(process.env.AGGREGATE_OAUTH_APP_ID 控制 nuxt.config.ts public.oauth.aggregate 开关) ==========
|
||||||
|
# 说明:
|
||||||
|
# - 这些是 **构建期** 变量,只在 RUN npm run build 时用到(runtimeConfig.public 只会在 build 时固化到 .output/public 包)
|
||||||
|
# - 部署时运行期变量(同一套值)会通过 docker-compose.yml env_file: [.env] 注入到容器 process.env 供 server/utils/oauth-strategies.ts loadAggregateSettings 使用
|
||||||
|
ARG OAUTH_REDIRECT_URI=""
|
||||||
|
ARG OAUTH_STATE_SECRET=""
|
||||||
|
ARG AGGREGATE_OAUTH_APP_ID=""
|
||||||
|
ARG AGGREGATE_OAUTH_APP_KEY=""
|
||||||
|
ARG AGGREGATE_OAUTH_LOGIN_TYPE=""
|
||||||
|
ARG AGGREGATE_OAUTH_ENDPOINT=""
|
||||||
|
ENV OAUTH_REDIRECT_URI="${OAUTH_REDIRECT_URI}" \
|
||||||
|
OAUTH_STATE_SECRET="${OAUTH_STATE_SECRET}" \
|
||||||
|
AGGREGATE_OAUTH_APP_ID="${AGGREGATE_OAUTH_APP_ID}" \
|
||||||
|
AGGREGATE_OAUTH_APP_KEY="${AGGREGATE_OAUTH_APP_KEY}" \
|
||||||
|
AGGREGATE_OAUTH_LOGIN_TYPE="${AGGREGATE_OAUTH_LOGIN_TYPE}" \
|
||||||
|
AGGREGATE_OAUTH_ENDPOINT="${AGGREGATE_OAUTH_ENDPOINT}"
|
||||||
|
|
||||||
# 构建应用,使用内存优化脚本适应4GB总内存
|
# 构建应用,使用内存优化脚本适应4GB总内存
|
||||||
RUN chmod +x scripts/memory-build.js && \
|
RUN chmod +x scripts/memory-build.js && \
|
||||||
node scripts/memory-build.js
|
node scripts/memory-build.js
|
||||||
|
|||||||
Reference in New Issue
Block a user