This commit is contained in:
曾志威
2026-09-24 10:21:12 +08:00
parent a0c54ac934
commit b1db1dedd1
3 changed files with 46 additions and 0 deletions
+15
View File
@@ -1,6 +1,14 @@
kind: pipeline
name: default
environment:
http_proxy: http://192.168.9.1:7893
https_proxy: http://192.168.9.1:7893
no_proxy: localhost,127.0.0.1,::1
HTTP_PROXY: http://192.168.9.1:7893
HTTPS_PROXY: http://192.168.9.1:7893
NO_PROXY: localhost,127.0.0.1,::1
clone:
disable: true
@@ -37,6 +45,13 @@ steps:
settings:
context: ./
dockerfile: ./Dockerfile
build_args_from_env:
- http_proxy
- https_proxy
- no_proxy
- HTTP_PROXY
- HTTPS_PROXY
- NO_PROXY
username:
from_secret: docker_username
password:
+12
View File
@@ -1,5 +1,17 @@
# 变更原因与设计记录
## Drone 外网统一走指定代理(2026-09-24)
原因:用户要求外网统一使用 `192.168.9.1:7893`,前一版仅为 clone 注入可选代理 Secret,未覆盖后续构建和发布。现将 HTTP/HTTPS 代理移至流水线全局环境,固定为 `http://192.168.9.1:7893`,大小写变量一致,直连名单仅保留 localhost/IPv4/IPv6 回环地址。Docker 插件继承代理环境,并使用 `build_args_from_env` 传入六个预定义代理构建参数,使软件源、Git、npm、Go 模块、基础镜像和推送请求使用代理;不向最终镜像写入代理 ENV。此为 HTTP/HTTPS 工具代理配置,不等同于网络层封锁直连。保留 SHA-256 自动识别、精确提交检出、TLS 校验及镜像发布凭据。无运行时数据迁移;旧代理 Secret 不再使用,更换 CI 网络需修改代理地址。宿主机 Docker daemon 拉取步骤镜像仍需额外配置,已提供 systemd 示例但未修改或重启宿主机。
实际验证:YAML 解析、所有步骤有效代理环境、六项 Docker 构建参数及原克隆命令/registry 配置保持不变检查通过,`git diff --check` 通过。本机使用 curl 显式指定该代理且清空绕过列表,访问 Alpine 3.22 main/x86_64 的 APKINDEX 返回 CONNECT 200 和 HTTP 200;这是本机到真实代理的验证,不代表远端 runner、嵌套构建网络或镜像发布已验证。未执行完整 Drone/Docker 构建。
## Drone 克隆步骤可选代理(2026-09-24)
原因:克隆步骤现场安装 Git 时可能受到 Alpine 软件源网络访问限制。为 clone 容器增加来自 Drone Secret 的 `http_proxy`、`https_proxy`、`no_proxy`,同时映射对应大写环境变量,使 `apk` 和 Git 能使用同一组可选代理设置;不在命令中展开或打印代理地址,不在仓库写入凭据。只影响克隆步骤的出站连接,不改变对象格式协商、精确提交检出、TLS 校验或 Docker 发布配置;无运行时配置和数据迁移。未配置时流水线不指定代理。runner 拉镜像、Dockerfile 下载及推送不在此配置范围内。
实际验证:YAML 解析、六个环境变量的 Secret 映射及原有克隆命令/Docker 发布配置不变检查、`git diff --check` 通过。未连接真实代理、未运行 Alpine 容器或 Drone runner,不将静态检查视为网络代理验证。
## Drone 自动识别 SHA-256 仓库与精确检出(2026-09-23)
原因:默认克隆方式及前一版协议 v0 兼容配置不满足自动识别 SHA-256 仓库的要求。保留 `clone.disable: true` 和 Docker 发布步骤,改用 Alpine 3.22 安装 Git/CA,通过 `git clone --no-checkout` 协商 SHA-1/SHA-256 格式,不预先初始化仓库。克隆后补取构建引用及缺失的指定提交,detached checkout 并严格核对 `DRONE_COMMIT_SHA`,支持分支继续前进时重建旧提交以及非普通分支引用。日志显示 Git 版本、对象格式与最终提交;认证文件仅写入克隆容器 HOME,保持 TLS 校验。仅影响 CI 克隆,新增 Alpine 软件源访问依赖,无运行时或数据迁移;此前强制协议 v0 的兼容方案由此替代。
+19
View File
@@ -10,6 +10,25 @@
私有仓库继续使用 Drone 注入的 `DRONE_NETRC_*` 凭据,关闭 shell 跟踪并以受限权限写入克隆容器的 `$HOME/.netrc`,不写入共享源码目录,也不关闭 TLS 校验。该步骤需要能访问 Alpine 软件源及仓库。若仍失败,提供新 clone 步骤完整日志并检查 Gitea/反向代理日志;不要提供令牌或 `.netrc` 内容。
### 外网请求统一使用代理
流水线所有步骤统一注入小写/大写 `http_proxy`、`https_proxy`,地址为 `http://192.168.9.1:7893`;`no_proxy` / `NO_PROXY` 仅包含 `localhost,127.0.0.1,::1`。不再读取代理 Secret,也不将 Gitea 域名加入直连名单。镜像发布的 `docker_username` / `docker_password` Secret 仍然需要配置。
覆盖 clone 中的 Alpine 软件源下载、Git HTTPS 克隆,以及 Docker 插件内部 daemon 的基础镜像拉取和镜像推送。Docker 步骤通过 `build_args_from_env` 传递六个代理变量,覆盖 Dockerfile 的 `npm ci`、`go mod download` / Go 编译依赖下载、`apk add`。使用 Docker 预定义代理构建参数,不在 Dockerfile 添加代理 `ENV`,不会把该代理配置为最终应用容器的运行环境。该配置是工具层 HTTP/HTTPS 代理,不是禁止任意程序直连的网络防火墙规则。
代理必须接受 HTTP CONNECT,并允许 runner 宿主机、流水线容器及 Docker 构建容器访问;代理不可用时这些请求会失败,不配置失败后直连回退。保持 TLS 校验和 SHA-256/构建提交校验。若代理后续增加认证,凭据应改存 Drone Secret,不能写进仓库。
**还需配置 runner 使用的宿主机 Docker daemon**:它在流水线环境生效前拉取 `alpine:3.22`、`plugins/docker`,仅修改 `.drone.yml` 无法代理这些镜像拉取。Linux systemd 部署可将下列内容合并到 `/etc/systemd/system/docker.service.d/http-proxy.conf`,保留原有配置;若 daemon.json 已设置代理,需同步核对,daemon 的显式配置优先于环境变量。
```ini
[Service]
Environment="HTTP_PROXY=http://192.168.9.1:7893"
Environment="HTTPS_PROXY=http://192.168.9.1:7893"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
```
在维护窗口执行 `sudo systemctl daemon-reload` 和 `sudo systemctl restart docker` 后生效;Docker 重启可能影响运行中的服务。本次仓库修改不会远程修改或重启宿主机。若 runner 连接的是远端 Docker daemon,应在实际执行镜像拉取的机器上配置。
## 此前的 Linux 归档发布方案
Drone 的 push、pull_request、tag 流水线先执行 Go 测试、`go vet` 和前端构建,再编译 Linux amd64 无 CGO 单文件程序。打包前运行 `scripts/verify-package.mjs`,在隔离临时目录检查版本信息、内嵌网页、健康检查与登录。所有事件均生成 `bin/releases/serviceport-<VERSION>-linux-amd64.tar.gz`,日志打印归档路径和 SHA256;push 和 tag 可上传 Gitea Generic Packages,仅 tag 可选上传 IPFS。不发布 Windows 程序或容器镜像。