Files
server-deploy/docs/development.md

100 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 新设备开发与验证
先看根目录 [HANDOFF.md](../HANDOFF.md)。以下命令在仓库根目录执行,不依赖原开发者的磁盘路径。
这里只构建/测试新执行器,不调用旧部署脚本,不连接服务器,不安装 Docker。
## 环境前提
- Git 和 SSH 客户端:克隆工作分支并访问仓库。服务器 SSH 权限与仓库权限是两件事。
- Go:`go.mod` 要求 1.26.0 或更新版本;本次基线实际使用 Go 1.27.1。
- Node.js:仅用于无第三方依赖的 CLI 冒烟测试;本次 Windows 基线为 v24.19.0。
尚无面板 package.json,不需要 `npm install`。
- Windows:PowerShell;Linux:Bash。Linux 专有行为使用 Ubuntu/WSL 验证。
- Linux `go test -race` 需要可用的 C 编译器/CGO;检查 `go env CGO_ENABLED` 和 `cc --version`。
- 在线仓库测试另外需要 curl、GnuPG 的 `/usr/bin/gpg` 与 `/usr/bin/gpgv`、Python 3、awk、tar 和常规核心工具。
从组织认可的软件渠道或 [Go 官方下载](https://go.dev/dl/) / [Node 官方下载](https://nodejs.org/en/download)
获取工具链;核对下载摘要。不要复制旧机器临时目录里的未知二进制。
上述版本是实测基线,不表示所有更新版本已验收。macOS 便携产品尚未验证;完整 Linux 专有测试需 Linux。
## Windows:基础离线检查
确认 `go` 和 `node` 已在 PATH。新设备无需沿用原设备的 GOCACHE、临时 Go 目录或磁盘盘符。
```powershell
go version
node --version
go test ./... -count=1
if ($LASTEXITCODE -ne 0) { throw 'Go tests failed' }
go vet ./...
if ($LASTEXITCODE -ne 0) { throw 'Go vet failed' }
go build -o dist/deployctl.exe ./cmd/deployctl
if ($LASTEXITCODE -ne 0) { throw 'Build failed' }
node --test tests/cli-smoke.test.mjs
if ($LASTEXITCODE -ne 0) { throw 'CLI smoke tests failed' }
./dist/deployctl.exe version
Get-Content -Raw protocol/examples/plan-request.json | ./dist/deployctl.exe plan
```
Windows 可能因权限限制跳过符号链接测试;Linux 必须补验。仓库 `.gitattributes` 已将 Shell 脚本固定为 LF,
不要把脚本转为 CRLF。Git 换行提示不等于测试失败;实际错误须单独排查。
## Linux/WSL:基础离线检查
```bash
set -euo pipefail
go version
node --version
go test ./... -count=1
go vet ./...
go test -race ./... -count=1
go build -o dist/deployctl ./cmd/deployctl
node --test tests/cli-smoke.test.mjs
./dist/deployctl version
./dist/deployctl plan < protocol/examples/plan-request.json
./dist/deployctl preflight
```
`preflight` 报告运行它的本机/WSL,不是云服务器。它可以报告“不支持/有阻塞项”,不代表测试失败,
也不得为消除阻塞项擅自修改机器。WSL 临时目录可能随实例生命周期消失,不能作为跨会话依赖。
另有 `bash scripts/verify-linux.sh /绝对路径/已验证的Go.linux-amd64.tar.gz`:
会解包到新建临时目录、使用独立缓存执行 Go 全量测试/vet/race/构建及 CLI 只读检查。
它不下载 Go,不自动校验调用者提供的 Go 压缩包,不运行 Node 冒烟;调用前验证官方压缩包摘要,
Node 冒烟按上面命令另跑。该脚本按 amd64 测试流程提供,其他架构没有同等实测证据。
## 可选在线测试:不要默认运行
先完成离线检查。以下测试只在本地下载公开测试资料,不使用 SSH、不运行 APT、不解包或安装 deb。
需访问 Docker 官方仓库;网络、上游签名/密钥或元数据有效期变化都可能使测试失败,不能绕过校验。
```bash
set -euo pipefail
go build -o dist/deployctl ./cmd/deployctl
# 只验证官方仓库签名、索引及篡改拒绝
bash scripts/probe-docker-repository.sh "$PWD/dist/deployctl"
# 另外下载约 90 MB(随测试版本变化)的五个 deb,验证并故意损坏其中一个
DEPLOYCTL_ONLINE_ARTIFACT_PROBE=1 bash scripts/probe-docker-repository.sh "$PWD/dist/deployctl"
```
需要连同 Go 全量 Linux 检查及真实签名单元测试一起运行时:
```bash
DEPLOYCTL_ONLINE_REPOSITORY_PROBE=1 DEPLOYCTL_ONLINE_ARTIFACT_PROBE=1 \
bash scripts/verify-linux.sh /绝对路径/已验证的Go.linux-amd64.tar.gz
```
命令末尾的临时目录仅用于该次诊断。负向测试会故意篡改资料,不能当成安装输入或备份。
日志中出现预期的 `artifact verification failed` / `repository verification failed` 后,
应跟随篡改已拒绝的提示且整个脚本退出码为 0;不能只看一条成功输出。
未提供真实元数据夹具时,`TestStagedSignatureIntegration` 会跳过,这是明确的在线覆盖缺口,
不是已完成在线验收。
## 接续纪律
- 当前没有可运行的面板/便携包;开发依赖与未来用户免安装的产品依赖不要混淆。
- 先失败测试、再实现;用真实 CLI 和隔离 Linux 环境覆盖涉及的边界。
- 未通过验证、不支持或未检查的能力须保持不可执行;不要临时开放 `apply` 以便演示。
- 每次交接更新 HANDOFF 和实施状态,记录运行环境、命令、结果、跳过项及待确认事项。
- `dist/`、下载包、缓存、日志、SSH 密钥与真实配置不纳入源码提交。