diff --git a/README.md b/README.md index eacdd0b..61d2172 100644 --- a/README.md +++ b/README.md @@ -69,12 +69,15 @@ pnpm dev ## 构建与部署 -本地构建: +构建并推送镜像: ```bash -docker build -t swr.cn-north-4.myhuaweicloud.com/virtheart/arcticnewone:latest . +./build-and-push.sh ``` +脚本从环境变量读取 SWR 凭据(`SWR_REGISTRY`、`SWR_NAMESPACE`、`SWR_USERNAME`、`SWR_PASSWORD`), +多架构(`linux/amd64,linux/arm64`)构建并推送到华为云 SWR。 + 本地启动(使用 SWR 镜像,与生产一致): ```bash diff --git a/build-and-push.sh b/build-and-push.sh new file mode 100755 index 0000000..fca5af4 --- /dev/null +++ b/build-and-push.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# ========================================================= +# Arcticnewone 镜像构建与推送脚本(本地 / 部署服务器手动执行) +# +# 遵循团队部署规范: +# - 镜像推送到华为云 SWR,tag 固定为 latest +# - 多架构构建推送:linux/amd64,linux/arm64 +# - 登录凭据一律从环境变量读取,绝不写入仓库 +# +# 使用前先设置环境变量(示例): +# export SWR_REGISTRY="swr.cn-north-4.myhuaweicloud.com" +# export SWR_NAMESPACE="virtheart" +# export SWR_USERNAME="" +# export SWR_PASSWORD="" +# 然后执行: +# ./build-and-push.sh +# ========================================================= +set -euo pipefail + +# 必填环境变量校验(缺失即报错退出) +: "${SWR_REGISTRY:?请先设置环境变量 SWR_REGISTRY(例如 swr.cn-north-4.myhuaweicloud.com)}" +: "${SWR_NAMESPACE:?请先设置环境变量 SWR_NAMESPACE(例如 virtheart)}" +: "${SWR_USERNAME:?请先设置环境变量 SWR_USERNAME(SWR 登录用户名)}" +: "${SWR_PASSWORD:?请先设置环境变量 SWR_PASSWORD(SWR 登录密码)}" + +IMAGE_NAME="arcticnewone" +IMAGE_TAG="latest" +FULL_IMAGE="${SWR_REGISTRY}/${SWR_NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG}" +PLATFORMS="linux/amd64,linux/arm64" +BUILDER_NAME="multiarch-builder" + +# 前置检查:docker 与 buildx +if ! command -v docker >/dev/null 2>&1; then + echo "错误: 未找到 docker 命令,请先安装 Docker" >&2 + exit 1 +fi +if ! docker buildx version >/dev/null 2>&1; then + echo "错误: 未找到 docker buildx,请启用 Buildx(Docker 20.10+ 默认内置)" >&2 + exit 1 +fi + +# 1. 登录 SWR(凭据来自环境变量,不写入仓库) +echo ">>> [1/4] 登录 SWR: ${SWR_REGISTRY}" +echo "${SWR_PASSWORD}" | docker login "${SWR_REGISTRY}" -u "${SWR_USERNAME}" --password-stdin + +# 2. 确保支持多架构的 builder 存在 +echo ">>> [2/4] 准备多架构 builder: ${BUILDER_NAME}" +if ! docker buildx inspect "${BUILDER_NAME}" >/dev/null 2>&1; then + docker buildx create --name "${BUILDER_NAME}" --use +else + docker buildx use "${BUILDER_NAME}" +fi + +# 3. 多架构构建并推送 +echo ">>> [3/4] 构建并推送: ${FULL_IMAGE} (${PLATFORMS})" +docker buildx build \ + --platform "${PLATFORMS}" \ + --push \ + -t "${FULL_IMAGE}" \ + . + +# 4. 输出推送结果 +echo ">>> [4/4] 推送完成,镜像摘要如下:" +docker buildx imagetools inspect "${FULL_IMAGE}" diff --git a/deploy/README.md b/deploy/README.md index df00ee4..5cb7e6b 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -13,10 +13,26 @@ `namespace.yaml` 负责创建 `arcticnewone` 命名空间;deployment/service/ingress 三个 YAML 的 `metadata` 均已指定 `namespace: arcticnewone`。 +## 镜像构建与推送 + +镜像由项目根目录的 `build-and-push.sh` 构建并推送到华为云 SWR(多架构 `linux/amd64,linux/arm64`,tag 统一为 `latest`): + +```bash +# 1. 设置环境变量(凭据绝不写入仓库) +export SWR_REGISTRY="swr.cn-north-4.myhuaweicloud.com" +export SWR_NAMESPACE="virtheart" +export SWR_USERNAME="<用户名>" +export SWR_PASSWORD="<密码>" + +# 2. 执行构建与推送 +./build-and-push.sh +``` + +推送完成后镜像地址:`swr.cn-north-4.myhuaweicloud.com/virtheart/arcticnewone:latest`。 + ## 部署前置条件 -1. 镜像已构建并推送到华为云 SWR: - `swr.cn-north-4.myhuaweicloud.com/virtheart/arcticnewone:latest`(多架构 `linux/amd64,linux/arm64`,tag 统一为 `latest`) +1. 镜像已构建并推送到华为云 SWR(通过项目根目录 `./build-and-push.sh` 执行,见上方「镜像构建与推送」) 2. 集群已安装 Traefik Ingress 与 cert-manager(ClusterIssuer 名称为 `lets-encrypt`) 3. 域名 `personal.virtheart.com` 的 DNS 已解析到集群入口 4. 创建私有镜像拉取 Secret(凭据从环境变量读取,绝不写入仓库;命名空间由 `namespace.yaml` 创建):