Skip to content

Release v0.3.8#13

Merged
zhuxbo merged 28 commits into
mainfrom
dev
Apr 7, 2026
Merged

Release v0.3.8#13
zhuxbo merged 28 commits into
mainfrom
dev

Conversation

@zhuxbo

@zhuxbo zhuxbo commented Apr 7, 2026

Copy link
Copy Markdown
Owner

Summary

  • Windows 全面适配:升级/部署平台差异化策略,安装脚本 PowerShell 修复
  • setup 增强:支持 --key/--file-validation/--webroot 参数,批量模式私钥汇总
  • Docker 容器扫描:Apache 容器扫描支持 + 扫描架构优化
  • Apache reload 容器兼容:无 systemd 环境下回退 /proc 扫描 + SIGUSR1
  • 测试覆盖率提升:单元测试 44.6% → 51.4%
  • E2E 测试基础设施:Bats + Docker Compose 重构,CI workflow 集成

Commits

  • feat: Windows 升级/部署全面适配 + 平台差异化升级策略
  • feat: setup 支持 --key/--file-validation/--webroot + 批量模式私钥汇总
  • feat: Docker 容器扫描支持 Apache + 扫描架构优化
  • fix: Apache reload 容器环境回退(无 systemd → /proc + SIGUSR1 → apachectl 进程名映射)
  • fix: install.ps1 进度条修复
  • test: 单元测试覆盖率全面提升
  • refactor: E2E 测试基础设施重构 + CI 集成
  • fix: E2E 测试质量修复(14 项审核 + 状态隔离 + 超时 + 回调)

zhuxbo added 28 commits April 1, 2026 00:49
- Windows 服务停止改为同步等待(StopPending → Stopped),解决升级时 "already running" 和 "Access is denied" 问题
- daemon 通过 context 感知服务停止,替代不生效的 SIGTERM 信号,停止从 30 秒超时降至秒级
- 升级流程平台差异化:Linux 先装后重启(零停机),Windows 先停后装再启动(避免 exe 锁定)
- Windows exe 替换采用 rename 策略,重试等待文件句柄释放
- Windows 非服务模式部署:reload 失败回退到进程重启(taskkill → 等待守护拉起 → 手动启动)
- 安装脚本升级时重启服务(install.sh 三种 init 系统 + install.ps1 停止/启动服务)
- install.ps1 下载性能优化(-UseBasicParsing + 关闭进度条)
- 签名格式升级:单一 signature → 按文件名索引 signatures map
- 升级错误类型化(ErrReleaseSource),替代脆弱的中文字符串匹配
- install.sh Python 路径 channel 默认值修复
- Apache VirtualHost 匹配放宽为任意非 443 端口
- Apache/Nginx 路径检测增强(集成面板、完整路径查找)
- 全局设置 $ProgressPreference 禁用进度条,避免覆盖控制台输出
- 移除函数内局部 $ProgressPreference 操作
- 新增 --key 指定私钥文件路径(隐含 --local-key)
- 新增 --file-validation 启用文件验证(隐含 --local-key)
- 新增 --webroot 指定 Web 根目录(隐含 --file-validation)
- 私钥交互改为输入文件绝对路径,不再粘贴 PEM 内容
- 批量模式跳过逐个交互,汇总时单独列出需要私钥的证书
- 私钥来源优先级:API → --key → 默认路径 → 交互输入
- deploy-spec §5.3 更新为通用描述,适配 CLI 和 UI 项目
- 文档同步更新(CLAUDE.md/README.md/deploy-spec.md/skills)
- 新增 Apache Docker 容器发现与站点扫描(discover.go/scanner.go)
- 集成 Nginx/Apache Docker 扫描到统一扫描入口,本地与 Docker 独立扫描互不阻塞
- Docker 站点返回非 SSL 站点(有效 server_name 即保留),便于 SSL 安装流程
- 新增容器内运行检测(ShouldSkipContainerProcess),容器内不跳过同容器进程
- scan/setup 输出增加 Docker 非卷挂载警告提示
- ScannedSiteInfo 增加 ContainerID/VolumeMode 字段,贯穿扫描→匹配→部署链路
- pkg/util: SafeReadFile 安全函数 + CheckRootPrivilege 测试 (39% → 55%)
- pkg/logger: cleanOldLogs 轮转清理 + JSON 输出模式 + 环境变量 (68% → 87%)
- executor: 带值参数跳过 + RunDetached 白名单 + 动态回退 (62% → 80%)
- pkg/backup: 路径穿越防护 + keepVersions 边界 + 恢复异常分支 (74% → 85%)
- pkg/certops: extractDomains 纯函数 + fixCertName/syncOrderID + 部署错误分支 (50% → 60%)
- pkg/upgrade: Execute/FetchReleaseInfo 入口校验 + 完整升级流程 (67% → 78%)
- pkg/webserver: ListRegisteredTypes + DetectDockerServer 输入校验 + PATH 隔离测试 (44% → 63%)
- pkg/service: New 服务名格式校验 + Windows stub 全方法覆盖 (23% → 39%)
- nginx/scanner: extractListenPort 等纯函数 + 解析边界条件 (50% → 60%)
- apache/scanner: apachectl -S 正则解析 + enrichSiteFromConfig + 文件限制 (57% → 75%)
- nginx/docker: truncateOutput + ExecAux 白名单 + isNginxContainer + 部署模式 (32% → 51%)
- 测试框架从手写 bash 迁移到 Bats,解决报告失效和断言降级通过问题
- 容器编排从手动 docker build/run 迁移到 Docker Compose,Mock API 通过内部网络访问
- Mock API 重写:新增 batch/renew-flow/releases 场景,CA 分层证书生成
- 发行版升级:Ubuntu 24.04、Alpine 3.21
- 新增测试:daemon 续签、upgrade 升级、uninstall 卸载、Docker-in-Docker 扫描
- 覆盖 37 个测试用例,涵盖所有 CLI 命令
- 删除旧脚本和泄漏的二进制文件
- workflow_dispatch 支持选择发行版/服务器/测试文件
- 矩阵策略:4 发行版 × 2 服务器 = 8 个并行任务
- 独立 DinD job(可选触发)
- 失败时自动收集容器日志和 sslctl 日志
- push 到 dev 且 docker/test/** 或 e2e.yml 变更时自动触发全矩阵
- 保留 workflow_dispatch 手动触发(合入 main 后可用)
- push 触发时 inputs 为空,默认跑全矩阵,DinD 跳过
- Rocky: dnf install 添加 --allowerasing 解决 curl-minimal 冲突
- Alpine nginx: 站点配置放入 http.d/(而非 conf.d/)确保在 http 块内
- SSRF: 用 socat 将 localhost:8080 转发到 mock-api,绕过私有 IP 检查
- curl 统一添加 --max-time 防止无限挂起
- common_setup mock_reset 容错(失败不阻塞测试)
- Rocky Apache 生成 mod_ssl 默认证书
- workflow 加入连通性验证步骤 + socat 预启动
- timeout 从 30 分钟增加到 45 分钟
- mock_set_scenario/mock_reset 输出重定向到 /dev/null,防止污染 Bats 输出
- 所有依赖 run_initial_setup 的 .bats 文件在 setup_file 中先 mock_reset + 清理旧配置
- 确保每个测试文件的 setup_file 从干净状态开始
- Mock API 支持逗号分隔的 order 查询(批量部署格式)
- setup.bats: 不安装服务测试前清理旧服务文件
- deploy.bats/rollback.bats: 动态从 config.json 提取证书名,不再硬编码
Rocky Linux 9 的 httpd 编译时链接了 systemd-notify,httpd -k graceful
在无 systemd 的容器中会失败。ReloadService 检测到 systemd 相关错误后
回退到 kill -USR1 发送 Apache graceful reload 信号。
pidof 命令在 Rocky Linux 9 容器中不存在,改为直接扫描 /proc/*/comm
查找进程 PID,通过 os.FindProcess + SIGUSR1 信号实现 graceful reload。
用 build tag 隔离平台差异(signal_unix.go / signal_windows.go)。
之前的策略是先执行 httpd -k graceful 失败后再回退,但 Rocky 的 httpd
会因连接 dbus 失败导致进程异常退出,回退时已找不到进程。
改为预检 /run/systemd/system 是否存在,不可用时直接跳过 httpd -k graceful
用 SIGUSR1 信号 reload。
- [Critical] build.sh 清理调试注释
- [Important] e2e.yml 命令注入防护(inputs 改用环境变量传递)
- [Important] run-tests.sh DinD 超时逻辑修复(break 2 → 标志变量)
- [Important] .gitignore 补充 .tap 规则
- [Important] daemon.bats sleep 改为轮询 Mock API 请求日志
- [Important] upgrade.bats 添加 teardown 确保配置恢复
- [Important] findPIDByName 优先匹配 master 进程(读 PPid)
- [Important] reloadFallbackLinux 移除 origErr 参数,返回具体错误
- [Important] docker-scan.bats 固定 nginx:1.27-alpine
- [Suggestion] Mock API Dockerfile Go 1.23 → 1.24
- [Suggestion] docker-compose.yml YAML anchors 简化重复
- [Suggestion] rollback.bats 断言改为正则匹配时间戳
- [Suggestion] setup.bats 文件验证增加 webroot 写入检查
- [Suggestion] status.bats 增加域名断言
apachectl/apache2ctl 是 shell wrapper,实际运行的进程名是 httpd/apache2。
reloadFallbackLinux 用 /proc 查找进程时需要映射到真实进程名。
- daemon.bats: cert_expires_at 改为 5 天后触发续签,API/回调断言改硬失败
- deploy-local.bats: setup_file 自行创建配置,支持 --test deploy-local 独立运行
- setup.bats: 文件验证模式改 assert_failure,移除永远跳过的条件断言
- deploy.bats: 去掉 || true,deploy 失败不再被吞掉
- common.bash: socat 重定向 fd 到 /dev/null,修复 exec 挂起
- upgrade: validateReleaseURL 可替换函数 + e2e.go build tag 跳过 HTTPS/签名
- mock-api: releases 改为 gzip 数据、sha256: 前缀、正确文件名和下载路由
- docker-compose: 二进制改挂 /opt/sslctl-binary:ro,run-tests 复制到可写路径
- e2e.yml: WARN 改硬失败,失败时上传 TAP/logs artifact,构建加 -tags e2e
@zhuxbo zhuxbo merged commit 3e0fe48 into main Apr 7, 2026
16 checks passed
zhuxbo added a commit that referenced this pull request May 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant