From 121a13e5ccddfda3d22fcde3cd4cc378963f6ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E5=BF=97=E5=A8=81?= Date: Wed, 23 Sep 2026 18:30:25 +0800 Subject: [PATCH] init --- .drone.yml | 32 ++++++++++++++++++++++++++++++++ README.md | 2 +- docs/change-rationale.md | 4 ++++ docs/ipfs.md | 12 +++++++++--- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/.drone.yml b/.drone.yml index 8f5df80..dd3c8f0 100644 --- a/.drone.yml +++ b/.drone.yml @@ -49,6 +49,38 @@ steps: - cp docs/build-output.md docs/testing.md "bin/releases/$release/docs/" - (cd "bin/releases/$release" && sha256sum serviceport > SHA256SUMS.txt) - (cd bin/releases && tar -czf "$release.tar.gz" "$release") + - (cd bin/releases && sha256sum "$release.tar.gz") + - echo "Package ready at bin/releases/$release.tar.gz (Drone workspace only until uploaded)" + + - name: publish-gitea + image: alpine:3.22 + environment: + GITEA_USER: + from_secret: gitea_user + GITEA_TOKEN: + from_secret: gitea_token + commands: + - apk add --no-cache curl + - | + if test -z "$GITEA_USER" || test -z "$GITEA_TOKEN"; then + echo 'Gitea package upload skipped: configure both gitea_user and gitea_token Drone secrets to retain the archive' + exit 0 + fi + version=$(cat VERSION) + if test -n "$DRONE_TAG"; then + test "$DRONE_TAG" = "v$version" || { echo 'Tag must match VERSION (v-prefixed)'; exit 1; } + package_version="$version" + else + package_version=$(git rev-parse --verify HEAD) + fi + archive="serviceport-$version-linux-amd64.tar.gz" + url="https://git.freeicu.top/api/packages/$DRONE_REPO_OWNER/generic/serviceport/$package_version/$archive" + curl --fail-with-body -sS --show-error -u "$GITEA_USER:$GITEA_TOKEN" -T "bin/releases/$archive" "$url" + printf 'Gitea package uploaded: %s\n' "$url" + when: + event: + - push + - tag - name: upload-ipfs image: alpine:3.22 diff --git a/README.md b/README.md index e536356..70debe8 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ ## 构建 -项目包含 `.drone.yml`,定义 Go 全量测试、`go vet`、前端生产构建、无 CGO Linux amd64 单文件编译、隔离启动与嵌入资源验证,以及 `bin/releases/serviceport--linux-amd64.tar.gz` 打包。推送、拉取请求和标签均打包;`v` 标签可在配置 `ipfs_api` / `ipfs_token` Secret 后上传 IPFS,详见 [Drone/IPFS 发布说明](docs/ipfs.md)。流水线不连接真实数据库,不读取 `data/`;真实服务矩阵仍使用 `scripts/test-matrix.ps1` 或 `scripts/test-matrix.sh`。 +项目包含 `.drone.yml`,定义 Go 全量测试、`go vet`、前端生产构建、无 CGO Linux amd64 单文件编译、隔离启动与嵌入资源验证,以及 `bin/releases/serviceport--linux-amd64.tar.gz` 打包。推送、拉取请求和标签均打包;配置 `gitea_user` / `gitea_token` Secret 后,推送和标签可发布到 Gitea 包仓库;`v` 标签仍可通过 `ipfs_api` / `ipfs_token` 上传 IPFS。未配置发布凭据时产物仅留在临时工作区,详见 [Drone 发布说明](docs/ipfs.md)。流水线不连接真实数据库,不读取 `data/`;真实服务矩阵仍使用 `scripts/test-matrix.ps1` 或 `scripts/test-matrix.sh`。 项目版本统一维护在根目录 `VERSION`。`serviceport.exe version` 或 `serviceport.exe --version --json` 可查看版本、Git 提交、构建时间与平台,管理界面顶部也可查看版本信息。构建/打包脚本自动注入元数据;直接 `go build` 仍使用 VERSION 的版本值,但提交和时间可能显示 `unknown`。 diff --git a/docs/change-rationale.md b/docs/change-rationale.md index 8d95d68..b22786f 100644 --- a/docs/change-rationale.md +++ b/docs/change-rationale.md @@ -1,5 +1,9 @@ # 变更原因与设计记录 +## Drone 产物可见性与 Gitea 包发布(2026-09-23) + +原因:Drone 原先只在临时工作区创建归档,构建成功后无法直接下载,容易误判为“打包没有反应”。现在 package 步骤打印路径及归档 SHA256,push/tag 在配置 `gitea_user` 与 `gitea_token` 时上传到 Gitea Generic Packages,并打印下载地址;未配置则明确跳过。PR 仍只验证打包,tag IPFS 上传维持原行为。push 用提交 SHA、tag 用 `VERSION` 作为包版本;重复发布相同版本文件可能失败。仅影响 CI 和发布方式,不改变运行时行为或数据,无迁移。若无构建记录仍需检查 Drone 仓库启用、Gitea webhook 和 runner。本地验证:YAML 解析及事件/步骤静态检查、`git diff --check`;未运行真实 Drone/Gitea 上传。 + ## Drone CI Linux 打包修复(2026-09-23) 原因:现有流水线仍引用旧 `agentdb` 模块和命令入口,不能编译本项目。改为固定 Go 1.25.0 和 Node 22.19.0,先测试并构建前端,再以受限编译并发生成内嵌页面的 `serviceport` Linux amd64 无 CGO 单文件程序,使用既有 `verify-package.mjs` 在隔离临时数据库与端口上验证后归档并生成 SHA256;可选标签 IPFS 上传保留且 API 路径不重复拼接。仅影响 CI 构建与发布,无运行时配置或数据迁移。本地 YAML 解析及 Go 1.25.0 Linux amd64 交叉编译通过;Windows 宿主无法运行 Linux 验证程序,未在真实 Drone runner/IPFS 节点发布,也未连接真实目标服务。 diff --git a/docs/ipfs.md b/docs/ipfs.md index 3a12846..30bb290 100644 --- a/docs/ipfs.md +++ b/docs/ipfs.md @@ -1,12 +1,18 @@ -# Drone CI 与 IPFS 发布 +# Drone CI 与发布包 -Drone 的 push、pull_request、tag 流水线先执行 Go 测试、`go vet` 和前端构建,再编译 Linux amd64 无 CGO 单文件程序。打包前运行 `scripts/verify-package.mjs`,在隔离临时目录检查版本信息、内嵌网页、健康检查与登录。所有事件均生成 `bin/releases/serviceport--linux-amd64.tar.gz`;仅 `v` 标签运行可选 IPFS 上传。不发布 Windows 程序或容器镜像。 +Drone 的 push、pull_request、tag 流水线先执行 Go 测试、`go vet` 和前端构建,再编译 Linux amd64 无 CGO 单文件程序。打包前运行 `scripts/verify-package.mjs`,在隔离临时目录检查版本信息、内嵌网页、健康检查与登录。所有事件均生成 `bin/releases/serviceport--linux-amd64.tar.gz`,日志打印归档路径和 SHA256;push 和 tag 可上传 Gitea Generic Packages,仅 tag 可选上传 IPFS。不发布 Windows 程序或容器镜像。 + +若 Drone 页面没有任何构建记录,先在 Drone 启用该 Gitea 仓库,确认 Gitea webhook 投递成功、Linux amd64 Docker runner 在线,再推送新提交或重新触发构建;修改 YAML 本身不能启动 Drone。流水线归档位于临时工作区,构建结束后不会自动出现在仓库附件中。 在 Drone 仓库设置以下 Secret: - `ipfs_api`:IPFS HTTP API 根地址,例如 `https://node.example` 或 `https://node.example/api/v0`。不要提交到仓库。 - `ipfs_token`:可选的 Bearer token;无认证节点可设置为空值。 +- `gitea_user`:有权向仓库所有者发布包的 Gitea 用户名。 +- `gitea_token`:该用户具有包写入权限的访问令牌。两项都配置后,push/tag 上传归档到 `https://git.freeicu.top/api/packages/<仓库所有者>/generic/serviceport/<包版本>/serviceport--linux-amd64.tar.gz`,日志打印下载地址;请勿在日志或仓库暴露令牌。 + +Gitea 包版本在 tag 时为 `VERSION`,在 push 时为完整提交 SHA,以免不同提交的同一版本归档互相覆盖;PR 不发布。缺少 Gitea 凭据时明确记录跳过,包仍只存在于临时工作区。上传 HTTP 失败则流水线失败。重复运行同一个 tag 或提交可能因 Gitea 拒绝同名文件而失败;需在包仓库删除原文件后重试。 上传步骤使用 `pin=true` 和 `wrap-with-directory=true`,日志输出根 CID。IPFS API 不可用或上传失败时,标签流水线失败;未配置 `ipfs_api` 时仅跳过上传,不影响测试和打包。标签必须与 `VERSION` 完全一致并带 `v` 前缀,例如 `VERSION=1.2.3` 对应 `v1.2.3`。 -发布包内容为 Linux amd64 无 CGO 二进制、`VERSION`、`README.md`、构建/测试文档和 `SHA256SUMS.txt`。Windows 单 EXE 仍通过 `scripts/package.ps1` 单独生成。Drone 必须使用 Linux amd64 Docker runner;归档留在构建工作区,持久下载需由 Drone artifact 存储或外部上传服务保存。流水线验证不代表真实数据库或 SSH 服务器的在线测试。 +发布包内容为 Linux amd64 无 CGO 二进制、`VERSION`、`README.md`、构建/测试文档和 `SHA256SUMS.txt`。Windows 单 EXE 仍通过 `scripts/package.ps1` 单独生成。Drone 必须使用 Linux amd64 Docker runner;流水线验证不代表真实数据库或 SSH 服务器的在线测试。