diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 4a707cb..b4f4970 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -200,9 +200,30 @@ server { --- -## 五、把镜像推到 Gitea 注册表 +## 五、把代码与镜像推到 Gitea -Gitea 自带容器注册表(`registry/2.0`)。目标是 `git.iwali.top/wangchuanli/workbuddy-portal`。 +Gitea 自带容器注册表(`registry/2.0`)。代码仓库与镜像的目标都是 `git.iwali.top/wangchuanli/workbuddy-portal`。 + +### 5.0 一条命令推代码 + 推镜像 + +准备好 Gitea **Access Token**(「设置 → 应用 → 生成令牌」,勾选 `repo` + `write:package`)后: + +```bash +export GITEA_TOKEN=<你的令牌> +tools/push-all.sh # 推 main 分支 + 镜像 latest +tools/push-all.sh 1.1.0 # 同时打一个版本 tag 并推送 +``` + +脚本做的事: + +1. `git push origin main` —— 用 `http.extraHeader` 传 Basic 认证,Token **只在环境变量里**, + 不会写进 `.git/config`、URL 或 reflog;同时用 `-c credential.helper=` 屏蔽凭据助手 + (否则在非交互 / 无桌面会话里 Git Credential Manager 会挂住等弹窗)。 +2. `docker compose build` —— 镜像名本身就是注册表地址。 +3. `docker login` + `docker push`(`--password-stdin`,Token 不进命令行历史)。 + +> 不用脚本、手工推也行:`git push origin main` 弹出凭据窗口时, +> 用户名填 `wangchuanli`,**密码处填 Access Token**(不是网页登录密码)。 ### 5.1 准备:本机允许 HTTP 注册表 diff --git a/tools/push-all.sh b/tools/push-all.sh new file mode 100755 index 0000000..46a25f1 --- /dev/null +++ b/tools/push-all.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# ============================================================================= +# 用 Gitea Access Token 一次性完成:推代码 + 推镜像 +# +# export GITEA_TOKEN=<在 Gitea「设置 → 应用 → 生成令牌」创建,勾 repo + write:package> +# tools/push-all.sh # 推 main + 镜像 latest +# tools/push-all.sh 1.1.0 # 额外打一个版本 tag 并推送 +# +# 设计要点: +# * Token **只从环境变量读**,绝不写进 .git/config、URL 或任何文件。 +# * 用 `-c credential.helper=` 屏蔽已配置的凭据助手(GCM), +# 否则在非交互会话里 GCM 会挂住等弹窗。 +# * 用 `http.extraHeader` 传 Basic 认证,比把 token 拼进 URL 更安全 +# (不会落到 reflog / 进程列表里)。 +# ============================================================================= +set -eu + +HOST="${GITEA_HOST:-git.iwali.top}" +USER="${GITEA_USER:-wangchuanli}" +REPO="${GITEA_REPO:-workbuddy-portal}" +BRANCH="${GITEA_BRANCH:-main}" +TAG="${1:-}" +IMAGE="$HOST/$USER/$REPO" + +: "${GITEA_TOKEN:?请先 export GITEA_TOKEN=}" + +cd "$(dirname "$0")/.." + +# ---------- 1. 推代码 ---------- +echo "==> 推送代码到 http://$HOST/$USER/$REPO.git ($BRANCH)" +AUTH="$(printf '%s:%s' "$USER" "$GITEA_TOKEN" | base64 | tr -d '\n')" +git -c credential.helper= \ + -c http.extraHeader="Authorization: Basic $AUTH" \ + push -u origin "$BRANCH" + +# ---------- 2. 构建镜像 ---------- +echo "==> 构建镜像 $IMAGE:latest" +docker compose build + +# ---------- 3. 登录并推镜像 ---------- +echo "==> 登录 $HOST" +printf '%s' "$GITEA_TOKEN" | docker login "$HOST" -u "$USER" --password-stdin + +echo "==> 推送 $IMAGE:latest" +docker push "$IMAGE:latest" + +if [ -n "$TAG" ]; then + echo "==> 打版本标签并推送 $IMAGE:$TAG" + docker tag "$IMAGE:latest" "$IMAGE:$TAG" + docker push "$IMAGE:$TAG" +fi + +echo +echo "完成。其他机器拉取:" +echo " docker pull $IMAGE:${TAG:-latest}"