Revert "feat(deployment): add QEMU setup for cross-platform builds and improve Docker Buildx configuration"

This reverts commit 5a7f39726b.
This commit is contained in:
yuxuanhui
2026-09-25 00:54:12 +08:00
parent 5a7f39726b
commit a3cb6dbacf
4 changed files with 6 additions and 34 deletions
+3 -26
View File
@@ -16,12 +16,6 @@ jobs:
uses: https://github.com/actions/checkout@v4
with:
persist-credentials: false
- name: Set up QEMU for cross-platform builds
uses: https://github.com/docker/setup-qemu-action@v3
with:
platforms: amd64,arm64
# Gitea does not use the GitHub Actions cache backend.
cache-image: false
- name: Build and push to Gitea Packages
shell: bash
env:
@@ -37,31 +31,14 @@ jobs:
: "${REGISTRY_PASSWORD:?Set REGISTRY_PASSWORD}"
registry="${IMAGE_PREFIX%%/*}"
auth_dir=$(mktemp -d)
builder_name=""
cleanup() {
local rc=$?
if [[ -n "$builder_name" ]]; then
docker buildx rm "$builder_name" >/dev/null || true
fi
rm -rf -- "$auth_dir"
exit "$rc"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
trap 'rm -rf -- "$auth_dir"' EXIT
export DOCKER_CONFIG="$auth_dir"
export BUILDX_CONFIG="$auth_dir/buildx"
printf '%s' "$REGISTRY_PASSWORD" | docker login "$registry" --username "$REGISTRY_USERNAME" --password-stdin
unset REGISTRY_PASSWORD
# Create after selecting the isolated config; do not change the runner's default builder.
builder_name=$(docker buildx create --driver docker-container)
docker info --format 'Build host: {{.OSType}}/{{.Architecture}}'
echo "Target platform: ${BUILD_PLATFORM:-linux/amd64}"
docker buildx inspect "$builder_name" --bootstrap
docker buildx build --builder "$builder_name" --pull --load --platform "${BUILD_PLATFORM:-linux/amd64}" \
docker build --pull --load --platform "${BUILD_PLATFORM:-linux/amd64}" \
--label "org.opencontainers.image.revision=$DEPLOY_TAG" \
-f Dockerfile.backend -t "$IMAGE_PREFIX-backend:$DEPLOY_TAG" .
docker buildx build --builder "$builder_name" --pull --load --platform "${BUILD_PLATFORM:-linux/amd64}" \
docker build --pull --load --platform "${BUILD_PLATFORM:-linux/amd64}" \
--label "org.opencontainers.image.revision=$DEPLOY_TAG" \
-f Dockerfile.frontend -t "$IMAGE_PREFIX-web:$DEPLOY_TAG" .
docker push "$IMAGE_PREFIX-backend:$DEPLOY_TAG"
@@ -20,7 +20,6 @@ Status: ready-for-agent
- 2026-09-24:已开始实施,真实服务器连接参数由用户在 Gitea 配置。
- 2026-09-24:本地实现完成。生产 Compose 改为纯镜像引用;工作流构建推送后通过 SSH 传递部署文件和环境,B 拉取、预检、加锁、迁移并等待健康状态。说明已同步。
- 2026-09-24:按用户确认适配 B 应用/C 数据库分离,移除外部数据库网络及 `DATABASE_NETWORK` 的传递、必填校验;说明和测试同步更新。未设置该变量时,Compose 5.3.1 默认/jobs profile 校验通过,backend/migrate/web 均使用默认网络,远程数据库 URL 保持一致;8 个必填配置拒绝、Bash/工作流检查和 8 项模拟部署测试通过。未连接真实 B/C,实际容器到 C 的连通性仍需部署验收。
- 2026-09-24:用户提供首个 RUN 的 `/bin/sh: exec format error` 并确认 Runner 为 aarch64、B 为 x86_64。补充 QEMU 初始化(关闭 GitHub 缓存)与独立 docker-container Buildx 构建器;在设置临时 Docker/Buildx 配置后创建并显式选择该构建器,退出时清理。工作流缺少 QEMU 的配置断言先失败,修复后通过;Bash、默认 amd64 构建目标、登录/创建/初始化/前后端构建/推送失败分支及清理退出码模拟检查通过。本机 ARM64 Docker Engine 29.6.2 / Buildx 0.35.0 使用独立构建器、相同 Python 基础镜像 digest 与 uv 0.7.20 成功执行 amd64 shell/Python/uv,导出架构确认为 linux/amd64,临时镜像及构建器已清理。未在远程 Runner 执行 QEMU 注册,未完整重建应用依赖或推送部署。
## 初次镜像部署验证结果(数据库拆分前)
-2
View File
@@ -8,8 +8,6 @@
SSH 采用用户指定的 Gitea Secrets:`PROD_SSH_KEY`、`PROD_HOST`、`PROD_USER`,补充主机公钥校验 `PROD_KNOWN_HOSTS` 与可选端口 `PROD_PORT`。镜像前缀、B 部署目录和构建平台可配置。应用环境经 SSH stdin 传递,不生成应用凭据文件;SSH 和 Docker 认证临时目录结束时清理。
Runner 为 ARM64、B 为 x86_64,目标仍为 `linux/amd64`。工作流先初始化 QEMU,再在临时 Docker/Buildx 配置下创建独立构建器,显式用于两个镜像,结束时清理;QEMU 步骤要求构建机 Docker 允许特权容器注册 binfmt。
任务与验证见 [两机镜像部署](issues/01-remote-deployment.md)。本任务只修改本地文件及进行隔离验证,不推送镜像或操作真实 B。
## 历史方案
+3 -5
View File
@@ -77,9 +77,7 @@ postgresql+asyncpg://wq_user:YOUR_PASSWORD@10.0.0.30:5432/wq_alpha
继续使用 `ubuntu-latest` 标签,该标签对应的**实际执行环境**需要 Git、Bash、Node.js 20(checkout v4)、Docker CLI/Buildx、OpenSSH 客户端、tar、base64,并能连接构建机的 Docker daemon。容器模式 Runner 也需要具备这些工具和 Docker 连接能力。
Runner 需要访问 checkout/QEMU action、基础镜像仓库、依赖源、A 的镜像仓库和 B 的 SSH 端口。`BUILD_PLATFORM` 必须匹配 B:当前 Runner 为 `aarch64`、B 为 `x86_64`,仍应配置 `linux/amd64`(或使用默认值)。
工作流先通过 `docker/setup-qemu-action` 注册 amd64/arm64 模拟支持,再创建独立的 `docker-container` Buildx 构建器。QEMU 初始化需要构建机的 Docker daemon 允许运行特权容器并注册 binfmt;此操作作用于构建机。日志会显示构建机架构、目标平台和构建器支持的平台。Gitea 中禁用该 action 的 GitHub 缓存功能。前后端均显式使用同一个构建器,成功或失败后清理构建器及临时认证目录,不切换 Runner 原有默认构建器。跨架构模拟通常比同架构构建慢。
Runner 需要访问 checkout action、基础镜像仓库、依赖源、A 的镜像仓库和 B 的 SSH 端口。`BUILD_PLATFORM` 必须匹配 B;若与构建机架构不同,需事先在构建机配置对应的跨架构构建能力。
### B:运行环境
@@ -103,7 +101,7 @@ sudo install -d -m 700 -o deploy -g deploy /opt/wq-alpha
`main` push 或手动运行工作流会依次执行:
1. checkout 当前提交,初始化 QEMU 和独立 Buildx 构建器,按 B 的目标平台构建 backend/web,分别推送到 A 的 Gitea Packages。两个镜像均推送成功才执行 SSH 部署。
1. checkout 当前提交,在 Runner 构建 backend/web,分别推送到 A 的 Gitea Packages。两个镜像均推送成功才执行 SSH 部署。
2. `scripts/deploy-remote.sh` 严格验证 B 主机公钥,通过同一 SSH 连接传入应用环境变量、生产 Compose 和部署脚本。
3. B 为每次尝试创建 `DEPLOY_PATH/releases/<提交 SHA>.<随机后缀>/`,只保存 `compose.production.yaml` 和 `scripts/deploy-production.sh`,无需更新项目源码。
4. B 登录 A 的仓库并拉取两个镜像。随后获得 Docker 部署锁,运行新 backend 镜像校验配置和数据库连接。
@@ -147,7 +145,7 @@ docker logs --tail=100 wq-alpha-production-web-1
不要公开含业务信息的日志,普通维护不要使用 `down -v`。发布目录可在确认无需回退后人工清理,不影响 named volumes;数据库备份和恢复在数据库管理端进行。
配置依据:[Gitea Container Registry](https://docs.gitea.com/usage/packages/container/)、[Docker 跨平台构建](https://docs.docker.com/build/building/multi-platform/)、[QEMU action](https://github.com/docker/setup-qemu-action/tree/v3)、[Docker 登录](https://docs.docker.com/reference/cli/docker/login/)、[Compose pull](https://docs.docker.com/reference/cli/docker/compose/pull/)、[Compose run](https://docs.docker.com/reference/cli/docker/compose/run/)、[Compose up](https://docs.docker.com/reference/cli/docker/compose/up/)。
配置依据:[Gitea Container Registry](https://docs.gitea.com/usage/packages/container/)、[Docker 登录](https://docs.docker.com/reference/cli/docker/login/)、[Compose pull](https://docs.docker.com/reference/cli/docker/compose/pull/)、[Compose run](https://docs.docker.com/reference/cli/docker/compose/run/)、[Compose up](https://docs.docker.com/reference/cli/docker/compose/up/)。
## 5. 1Panel 夜间全量目录同步