no-mistakes服务化安装:launchd/systemd/schtasks三平台渲染
【免费下载链接】no-mistakesgit push no-mistakes项目地址: https://gitcode.com/GitHub_Trending/no/no-mistakes
no-mistakes 是一款 git push 驱动的自动化代码校验工具,它的核心是常驻后台的 daemon 守护进程。安装时,no-mistakes 会自动渲染并注册系统级托管服务:macOS 用 launchd LaunchAgent、Linux 用 systemd 用户服务、Windows 用计划任务(schtasks),全程无需手动编写任何服务文件,一条daemon restart即可完成服务化安装。
为什么需要服务化安装
daemon 是 no-mistakes 的长驻进程:git push no-mistakes之后,git hook 只需通知 daemon 就立即退出,真正耗时的 worktree 创建、流水线执行、CI 监控、崩溃恢复全部由 daemon 在后台完成。
如果 daemon 只是普通进程,关终端就没了、崩溃后没人拉起、更新二进制后要手动重跑。托管服务解决这三个问题:
- 开机/登录自启:登录系统后 daemon 自动就位
- 崩溃自愈:launchd 的
KeepAlive与 systemd 的Restart=always保证进程退出后自动拉起 - 无感更新:
no-mistakes update替换二进制后,通过重启托管服务让新可执行文件生效
官方文档对这部分有完整说明:docs/src/content/docs/concepts/daemon.md
三平台各自的渲染产物
安装器根据操作系统分派到三条安装路径,统一入口在 internal/daemon/service.go 的installManagedServiceWithExecutable。
macOS:launchd LaunchAgent
渲染产物是一个 plist 文件,写入~/Library/LaunchAgents/com.kunchenguid.no-mistakes.daemon.<后缀>.plist。模板见 internal/daemon/service_launchd.go:
ProgramArguments固定为<可执行文件> daemon run --root <NM_HOME>RunAtLoad+KeepAlive实现登录自启和崩溃拉起WorkingDirectory指向 NM_HOME 根目录- 标准输出/错误重定向到
~/.no-mistakes/logs/daemon-bootstrap.log
启动时走launchctl bootout→bootstrap→kickstart -k三步。由于 launchctl 的 bootout 是异步的,bootstrap 可能撞上 errno 37(EPROGRESS),代码内置了 10 秒窗口的自动重试:internal/daemon/service_launchd.go
Linux:systemd 用户服务
渲染产物是~/.config/systemd/user/no-mistakes-daemon-<后缀>.service,unit 模板见 internal/daemon/service_systemd.go:
Type=simple,ExecStart同样指向daemon run --root <NM_HOME>Restart=always+RestartSec=2提供崩溃自愈[Install]段WantedBy=default.target,登录后随用户会话自动启动
安装流程依次执行daemon-reload和systemctl --user enable,重启前还会reset-failed清掉 crash-loop 残留状态。
Windows:计划任务 schtasks
渲染产物不落盘为文件,而是直接通过schtasks /Create注册,见 internal/daemon/service_schtasks.go:
/SC ONLOGON登录时触发,/RL LIMITED以普通权限运行- 任务命令为
no-mistakes.exe daemon run --root <NM_HOME> - 查询状态时通过 PowerShell 的
Get-ScheduledTask解析 State 判定运行中/已退出
一个刻意的设计:Windows 路径不转发代理环境变量。因为 ONLOGON 任务运行在用户的交互登录会话里,天然继承会话环境(包括HTTP_PROXY等),无需把可能含凭据的代理地址写进任务定义,也就没有泄露风险。
渲染机制中的三个通用细节
1️⃣ 服务标识按安装隔离
launchd 标签、systemd 单元名、Windows 任务名都带一个由sha256(NM_HOME 根目录)派生的 8 位稳定后缀。这让同一台机器上多个不同NM_HOME的 no-mistakes 安装可以并存,互不覆盖,也不会误杀别的安装的 daemon。实现见 serviceInstanceSuffix。
2️⃣ 代理环境转发与凭据保护
launchd/systemd 拉起的进程只有极简环境。若你在安装时配置了代理,渲染器会把HTTP_PROXY、https_proxy等变量"烘焙"进服务定义,保证 daemon 及其派生的 agent 能走代理上网。一旦文件里含代理值,落盘权限自动收紧为0600,并采用"临时文件 + 原子改名"写入,凭据从头到尾对其他用户不可见:writeServiceFile。
3️⃣ 兜底与自愈
- 托管服务安装或启动失败时,自动降级为 detached 守护进程,安装流程仍然成功
- 新版本会检测并清理旧版本遗留的全局命名服务(先停止再删除),避免"新旧两套 daemon"并存
- 服务定义中的
PATH由已知 bin 目录按"用户目录优先"顺序拼出,保证go、cargo、Homebrew 工具都能被找到
常用命令速查
| 命令 | 作用 |
|---|---|
no-mistakes daemon start | 安装(如缺失)并启动托管服务 |
no-mistakes daemon stop | 停止 daemon(不删除服务定义) |
no-mistakes daemon restart | 重启,安装脚本 docs/install.sh 末尾即调用此命令 |
no-mistakes daemon status | 查看 daemon 与服务状态 |
no-mistakes update | 校验 SHA-256 后原子替换二进制并重启服务 |
CLI 侧封装在 internal/cli/daemon_cmd.go,安装方式一览见 安装文档。
💡小结:你不需要理解任何 plist/unit/schtasks 语法——no-mistakes 按平台渲染、按 NM_HOME 隔离、含凭据自动收紧权限、失败自动降级。装好之后,git push no-mistakes就可以在任何终端、任何登录会话中稳定触发后台流水线了。
【免费下载链接】no-mistakesgit push no-mistakes项目地址: https://gitcode.com/GitHub_Trending/no/no-mistakes
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考