ci: use China dependency mirrors and persist npm cache
continuous-integration/drone Build encountered an error

This commit is contained in:
曾志威
2026-10-14 10:06:34 +08:00
parent e1aec14bc1
commit 7e5ca6b497
7 changed files with 48 additions and 1 deletions
+9 -1
View File
@@ -4,8 +4,11 @@ name: default
steps:
- name: frontend-build
image: node:22.19.0-alpine
volumes:
- name: npm-cache
path: /root/.npm
commands:
- npm --prefix web ci --no-audit --no-fund
- npm --prefix web ci --prefer-offline --no-audit --no-fund
- npm --prefix web run build
- name: build-binaries
@@ -30,3 +33,8 @@ steps:
- node scripts/verify-package.mjs bin/build-cache/ci-release/linux-amd64/linkport
- node scripts/ci-release.mjs package
- node scripts/ci-release.mjs upload
volumes:
- name: npm-cache
host:
path: /var/cache/drone/linkport/npm
+24
View File
@@ -73,3 +73,27 @@ Validation on 2026-10-06: `powershell.exe -NoProfile -ExecutionPolicy Bypass -Fi
流水线不再声明 HTTP/HTTPS 代理或绕过名单。Drone 默认克隆、npm、Go 模块、系统包和 IPFS 上传均使用构建环境的直接网络连接。Runner 所在网络需能访问 Git 服务以及各依赖源;若 Runner 或 Docker daemon 自身注入代理环境,需在部署侧移除。
本次验证:检查流水线没有代理环境变量,并通过差异检查;未触发远端 Drone 构建,需推送后验证实际网络路径;无应用或数据库变更。
## 国内依赖源(2026-10-13)
前端在 `web/.npmrc` 使用 `https://registry.npmmirror.com/`;`replace-registry-host=always` 使 npm 安装时将锁文件中的 npm 官方 registry 地址替换为当前镜像,不重新生成锁文件。Windows 开发构建与 Drone 发布构建设置 `GOPROXY=https://goproxy.cn`,Go 模块和自动下载的工具链均走该镜像,不设置直连回退。Runner 仍需能直连 npm、Go 镜像及系统包、Git、IPFS 所需地址;仓库不注入 HTTP 代理。
本次只改变依赖下载来源,不修改依赖版本、应用配置或数据库。实际验证:`npm.cmd --prefix web config get registry` 返回 npmmirror,锁文件地址替换配置返回 `always`;15 项 CI 构建脚本测试通过,其中替身 Go 检查实际收到 `GOPROXY=https://goproxy.cn`;前端构建通过并恢复 `web/dist/.gitkeep`。未清空依赖缓存或访问远端镜像,因此国内镜像的实时可用性尚未验证。
## Docker 镜像拉取仍走代理
如果 Drone 拉取 `golang:1.27.1-alpine` 时出现 `proxyconnect tcp: dial tcp 192.168.9.1:7991: connect: connection refused`,代理来自执行拉取的 Docker daemon,而非流水线中的 npm 或 Go 设置。先在 **Docker 宿主机**检查:
```sh
docker info --format 'HTTP={{.HTTPProxy}} HTTPS={{.HTTPSProxy}} NO={{.NoProxy}}'
systemctl show docker --property=Environment
systemctl cat docker
```
再检查 `/etc/docker/daemon.json` 的 `proxies` 设置,以及 `/etc/systemd/system/docker.service.d/` 下的代理 drop-in。删除实际注入的旧代理配置后,在维护窗口执行 `sudo systemctl daemon-reload` 和 `sudo systemctl restart docker`;重启会中断该 daemon 上运行的容器。用 `docker info` 确认代理字段为空,再重新运行 Drone 构建。若 Runner 使用远端 Docker socket,应检查该 socket 对应的宿主机。仓库中的 `.drone.yml` 无法覆盖 daemon 拉取镜像时的网络设置;若直连 Docker Hub 不通,还需在宿主机配置可访问的镜像源。
## Drone npm 安装缓存(2026-10-13)
前端构建将宿主机 `/var/cache/drone/linkport/npm` 挂载到 Node 容器的 `/root/.npm`,并为 `npm ci` 启用 `--prefer-offline`。首次下载使用前端配置的 npmmirror;同一 Runner 宿主机后续构建优先使用 npm 内容缓存,缺少的包才联网下载。缓存目录由 Docker 挂载创建,宿主机需允许写入。用户已确认仓库启用 Trusted;宿主机目录挂载依赖此设置。
只持久化 npm 下载缓存,不共享 `node_modules`;每次仍由 `npm ci` 按锁文件全新安装并校验包内容。锁文件变化时可复用未变化的依赖包。切换 Runner 宿主机或清空缓存后需要重新下载,首次构建仍受镜像网络速度影响。此配置不影响应用数据、数据库迁移或依赖版本。
实际验证:使用项目已安装的 YAML 解析器读取 `.drone.yml`,检查缓存卷声明与前端挂载一致、安装启用缓存优先且后续步骤不挂载该目录;npm 配置读取确认 npmmirror 和 prefer-offline 生效,`git diff --check` 通过。本地没有 Docker CLI,未运行真实 Drone 或测量加速幅度。
+10
View File
@@ -1494,3 +1494,13 @@ Actual validation: the Windows PowerShell startup regression suite passed with c
原因:用户已不再使用代理。删除 Drone 流水线全局的六个大小写 HTTP/HTTPS 代理及绕过名单变量,默认克隆、依赖下载和 IPFS 上传均依赖构建环境直接联网。同步更新当前 CI 与 IPFS 网络说明;保留历史记录,不影响应用运行、数据格式或数据库迁移。Runner、Docker daemon 若另有代理配置,需在其部署环境单独清除。验证检查流水线代理字段和差异;未运行远端 Drone 构建。
补充清理:发布测试进程不再单独设置 no_proxy/NO_PROXY;上传错误提示不再建议检查代理,curl 参数测试只检查 TLS 和凭据。历史变更记录仍保留当时的配置事实。使用本地 HTTP fixture 运行 25 项发布专项测试,全部通过;未连接实际 IPFS。检查当前 CI 配置、脚本及操作文档无代理变量和旧地址,差异检查通过。
## npm 与 Go 国内镜像(2026-10-13)
原因:移除 HTTP 代理后,用户希望 npm 与 Go 下载直接使用中国源。为前端设置 npmmirror 和锁文件 registry 替换;Windows 开发构建及 Drone 发布构建固定使用 goproxy.cn,不回退直接访问公共模块源。范围限构建依赖获取,不改锁定版本、程序运行、数据格式或迁移。镜像不可用时构建会失败;系统包、Git 和 IPFS 仍需要各自网络可达。实际验证:npm 读取到 npmmirror 和 `replace-registry-host=always`;15 项 CI 脚本测试和前端构建通过。依赖由本地缓存提供,未验证远端镜像实时下载;详见 docs/build-output.md。
## Drone 宿主机 Docker 代理故障(2026-10-13)
用户报告 Docker daemon 拉取 Go 镜像时仍尝试连接旧代理 `192.168.9.1:7991`,连接被拒绝。仓库搜索确认当前 `.drone.yml`、构建脚本和部署文件没有该地址;本机没有 Docker CLI,无法检查或修改远端宿主机。`docs/build-output.md` 增加 Docker daemon 的 systemd、daemon.json 定位、清理及验证步骤。此变更仅为排障文档,不改变 CI 运行配置或应用数据;真实修复需要在执行镜像拉取的宿主机移除代理并复测。
## Drone npm ci 加速(2026-10-13)
原因:前端构建运行在临时容器,默认 npm 下载缓存随容器丢失。用户确认 Trusted 仓库允许宿主机挂载后,前端步骤挂载独立 npm 缓存目录,并使用 --prefer-offline 优先读取已缓存包。继续使用锁文件全新安装,保留生命周期脚本和内容校验,不缓存 node_modules 或改变依赖版本。首次构建、不同 Runner 宿主机或缓存清空后仍需下载。影响范围限 Drone 前端安装阶段,无应用或数据库迁移;验证结果见 docs/build-output.md。
+1
View File
@@ -2,6 +2,7 @@
set -eu
cd "$(dirname "$0")/.."
export GOTOOLCHAIN=go1.27.1
export GOPROXY=https://goproxy.cn
export CGO_ENABLED=0
build_jobs="${BUILD_JOBS:-1}"
build_parallelism="${GO_BUILD_PARALLELISM:-1}"
+1
View File
@@ -21,6 +21,7 @@ function findShell() {
const shell = findShell();
const fakeGo = `#!/usr/bin/env sh
set -eu
[ "$GOPROXY" = 'https://goproxy.cn' ] || exit 92
if [ "$*" = 'mod download' ]; then
printf 'download\\n' >> go-events.log
exit 0
+1
View File
@@ -14,6 +14,7 @@ function Write-BuildPhase([string]$Name) {
$buildInfo = Get-linkportBuildInfo -Version $Version
Set-Location -LiteralPath (Split-Path $PSScriptRoot -Parent)
$env:GOTOOLCHAIN = 'go1.27.1'
$env:GOPROXY = 'https://goproxy.cn'
$env:GO111MODULE = 'on'
. (Join-Path $PSScriptRoot 'go-toolchain.ps1')
$goExecutable = Get-LinkPortGoExecutable -ProjectRoot (Split-Path $PSScriptRoot -Parent)
+2
View File
@@ -0,0 +1,2 @@
registry=https://registry.npmmirror.com/
replace-registry-host=always