ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Screenpipe Windows 开发镜像实战:基于 Azure Compute Gallery 的不可变开发环境与一次性 VM 自主任务流水线

Screenpipe Windows 开发镜像实战:基于 Azure Compute Gallery 的不可变开发环境与一次性 VM 自主任务流水线 Screenpipe Windows 开发镜像实战基于 Azure Compute Gallery 的不可变开发环境与一次性 VM 自主任务流水线【免费下载链接】screenpipeYC (S26) | Open Computer History | Record your screen continuously locally and provide context to your agents (Claude, Codex, Openclaw, Hermes, Runner...)项目地址: https://gitcode.com/GitHub_Trending/sc/screenpipe本指南以 Screenpipe 仓库的 .claude/skills/develop-screenpipe-windows/references/dev-image.md 为骨架结合 infra/windows-dev-image 目录下的真实构建脚本、分发脚本与验证脚本完整讲解 Screenpipe 如何为 Windows 原生开发搭建一套镜像即制品、VM 即任务的自主开发基础设施。读完本文你将掌握镜像契约包含哪些工具与路径约束、如何构建并发布一个不可变的 Azure Compute Gallery 镜像版本、如何通过一次性的 task blob 派发一个完全自治的 Windows 开发 VM以及这套流水线如何在不开放入站桌面、不烘焙任何密钥的前提下完成 Codex 执行、原生测试、桌面录像、证据上传与 PR 交付。设计前提不可变镜像而非克隆 release runnerScreenpipe 的 Windows 原生开发编译器、进程、服务、本地 API、桌面捕获、安装器等需要一个可重复、可验证的 Windows 环境。这套方案的核心决策是可复用的单元是 Azure Compute Gallery 中一个不可变的 Windows 11 开发镜像而不是对实时 release builder 的克隆。镜像只构建或刷新一次每个任务从某个已通过验证的镜像版本拉起一台一次性 VM任务结束后只销毁该 VM。VM 使用自己的自动登录控制台桌面完成交互式验证与录像不存在操作员会话也没有入站桌面访问。经过一次性派发后任务执行与派发电脑完全解耦——派发方可以立即断网或关机。这套工作流的入口约束记录在 .claude/skills/develop-screenpipe-windows/SKILL.md 中所有 Windows 原生工作都必须使用该镜像创建的 VM禁止交叉编译后当作 Windows 证据也禁止在实时 release builder 上开发或将其克隆作为每任务兜底。若不存在已验证的开发镜像应停止并报告需要一次性构建镜像。镜像契约Image Contract镜像必须从受支持的 Windows 11 桌面版基座构建并满足以下契约交互式控制台桌面已启用且 RDP 被禁用预装完整工具链Codex CLI、Git、Git LFS、PowerShell 7、Bun、Node.js、Rust/Cargo、sccache、Visual Studio Build Tools、LLVM/libclang、CMake、Ninja、7-Zip、jq、FFmpeg内置 Screenpipe 的自主 bootstrap/worker/dispatcher、证据录像器与凭据隔离的 Codex 启动器支持长路径并配置 Screenpipe 构建所需的机器级环境变量稳定的源码路径如C:\src\screenpipe与真正短小的CARGO_TARGET_DIR如C:\spdev由仓库支持的构建命令产出的预热数据debug-devRust 缓存、原生依赖缓存、Bun 缓存与 sccache 数据。VCToolsRedistDir一个必须提前发现的环境变量当 Visual Studio Build Tools 安装在非标准位置时必须在镜像构建期间发现并设置VCToolsRedistDir。文档特别强调仅仅重定向工作区target目录无法阻止深层 CMake/MSBuild 路径以MSB6003或缺失.tlog文件失败——有效的 Cargo target 路径本身必须短。这与 provision.ps1 的实现完全对应脚本在C:\BuildTools\VC\Redist\MSVC下查找版本号最大的子目录将其完整路径带尾部反斜杠写入机器级环境变量VCToolsRedistDir若找不到则直接抛出错误中止构建。镜像内禁止什么不安装、不注册 GitHub Actions runner不烘焙任何 API Key、GitHub 凭据、签名材料、Azure 控制面凭据、源码分支、密码或用户数据OpenAI 与 GitHub 凭据只允许在运行时通过托管身份Managed Identity与 Key Vault 获取。构建并发布一个镜像版本镜像构建被当作一次受控的基础设施操作完整流程如下基于声明的 Windows 11 基座、使用带版本的 provisioning 脚本构建安装镜像契约并在全新 shell 与交互式桌面会话中逐一验证每个工具预热缓存在稳定源码路径使用干净的 Screenpipe checkout 预热缓存随后移除仓库凭据与任务相关的源码状态清理残留删除日志、临时安装器、token、凭据、机器特定标识符等 provisioning 残留设置设备策略DisablePrivacyExperience用 Sysprep 与受支持的oobeSystemanswer 文件做 generalizeanswer 包含HideEULAPage、HideOnlineAccountScreens、HideWirelessSetupInOOBE、HideOEMRegistrationScreen、ProtectYourPC3不得使用SkipMachineOOBE发布不可变的 Compute Gallery 镜像版本并将基座版本、provisioning commit、工具版本、缓存预热 commit 记录为镜像元数据从该精确镜像版本拉起一台独立的一次性 VM派发一个精确不可变的自主可视化 smoke-task blob验证 OOBE 策略、运行时 Codex 认证、控制台自动登录、受支持的原生测试、桌面录像、私有证据上传、凭据清理与关机并确认TCP 3389 无监听、VM无入站 NSG 规则只有在该全新 VM smoke 测试通过后才将镜像版本标记为可用。绝不把任务移到未验证或部分构建的版本上。对应仓库实现provision.ps1 是版本化的 provisioning 脚本内部固定了工具版本Rust1.94.0、Bun1.3.10、Node22.23.2、sccache0.16.0、Codex0.149.1并生成image-manifest.json记录 builtAt、windows 版本、codex/bun/rustc/cargo/sccache/node 版本、warmCommit、sourcePath、cargoTargetDir、vcToolsRedistDir 等元数据unattend.xml 正是上述oobeSystemanswer 文件包含文档列出的全部五个 OOBE 隐藏项与ProtectYourPC3README.md 给出了入口命令./infra/windows-dev-image/build.sh 2026.8.24以版本号为参数。若主机在精确打标的构建 VM 创建后、provisioning 开始前失去 Azure 连接可用RESUME_EXISTING_BUILDtrue显式恢复该 VM正常运行时脚本会拒绝已存在的构建资源组恢复模式则会先校验 VM 的 project/environment/image-version 标签再使用。镜像发布后的验收发布后从精确镜像版本拉起全新 VM 并运行smoke.ps1 -AutonomousVisualTaskId task-id然后派发该精确的不可变可视化 smoke 任务验证控制台自动登录、原生验证、录制/证据上传、凭据清理与关机无入站规则、无操作员会话最后才设置validatedtrue。只有这一次全新镜像验收运行允许ALLOW_UNVALIDATED_IMAGE_FOR_SMOKEtrue所有开发派发都要求已验证镜像。smoke.ps1 具体检查必选路径image-manifest.json、with-openai-key.ps1、bootstrap/worker/dispatcher 脚本、桌面录像脚本、C:\Tools\bun\bun.exe、C:\Tools\cargo\bin\cargo.exe、C:\Tools\sccache\sccache.exe、C:\spdev逐条执行codex.cmd --version、git.exe --version、gh.exe --version、bun/cargo/rustc/sccache --version、ffmpeg.exe -version并校验退出码通过with-openai-key.ps1 -Command codex.cmd -CommandArgs login --with-api-key -PipeKeyToStdin验证运行时 Codex 认证后立即删除.codex最后断言 TermService 为 Disabled/Stopped、TCP 3389 无监听、DisablePrivacyExperience1。镜像刷新与回滚当 Windows 基座、Visual Studio、Rust、Bun、原生依赖、Codex 或 Screenpipe 构建契约发生变化时应主动刷新镜像并至少保留一个此前已验证的版本用于回滚。镜像构建必须不读取、不停机、不修改、不快照、不克隆实时 release builder。每任务 VM 循环Per-task VM Loop每个 Windows 原生任务都遵循如下 8 步循环解析并记录不可变的已验证镜像版本dispatcher 创建一台唯一打标的一次性 VM及其独立 OS 磁盘、NIC、deny-inbound 网络控制、运行时托管身份与关机兜底上传一个精确 task blob 与带版本的运行时脚本只启动一次 bootstrap 后即退出不做轮询VM 从C:\src\screenpipe启动将预热的源码状态替换为请求的精确 Git 修订并在开始工作前验证git rev-parse HEAD对src-tauri运行bun run test:tauri one-filter -- --nocapture——绝不在此运行裸 Cargo 或 Tauri 命令将缓冲的 Azure 命令输出重定向到持久 guest 日志记录显式原生退出码与测试 SHA在严格 PowerShell 下隔离嘈杂的原生 stderr避免无害 banner 变成终止错误worker 录制其控制台桌面用于可视化/交互式验收使用有界的 recorder-readiness 循环交付前将每个本地与上传的证据文件隔离在不可变任务 ID 之下当任务授权交付时worker 推送分支、创建 PR并在 PR 正文中加入六天只读的 user-delegation SAS 视频链接与精确测试 commit/tree租约保持在 Azure 七天 user-delegation 限制内并留出时钟偏移余量。VM没有任何签名、发布或发行权限在finally块中上传失败证据、移除环境凭据与 Codex 认证状态、禁用自动登录、关机稍后删除精确的已停止 VM 资源并验证其不存在保留共享的不可变镜像。若镜像缺失、过期或未通过全新 VM smoke 测试应修复并重新发布镜像而不是退化为反复 provisioning 冷 VM 或克隆 release runner。源码级实现从派发到关机的完整调用链派发端dispatch-autonomous.shdispatch-autonomous.sh 是整个流程的一发即忘入口核心行为如下入参校验task-id必须匹配[a-z0-9][a-z0-9-]{2,39}base-sha必须为 40 位小写十六进制RESUME_LOCAL_HEAD可选的既有 PR head SHA也必须是 40 位十六进制镜像门禁用az sig image-version show --ids image-id --query tags.validated读取validated标签非true且未设置ALLOW_UNVALIDATED_IMAGE_FOR_SMOKEtrue时直接拒绝派发任务 blob用jq组装task.jsontaskId、baseSha、branch、prompt、storage 目标、Key Vault 名称kv-scpwin-aa28、OpenAI 密钥名chatgpt-codex-api-key、GitHub 密钥名screenpipe-github-pr-token、推送远端、PR 标题/正文/commit message连同autonomous-worker.ps1、autonomous-bootstrap.ps1、dispatch-autonomous.sh一并上传到windows-autonomous/task-id/前缀下--overwrite falseVM 创建拒绝已存在的任务资源组创建 TrustedLaunch VM默认区域westus2、大小Standard_D16s_v5可用AZURE_LOCATION、AZURE_VM_SIZE覆盖--nsg-rule NONEStandard SKU 公网 IP网络硬校验创建后查询 NIC 关联的 NSG断言入站安全规则数量为 0断言公网 IP 为 Standard SKU否则拒绝派发关机兜底设置az vm auto-shutdown6 小时后一次性执行将 bootstrap 脚本注入为 RunPowerShellScriptaz vm run-command invoke仅启动一次后即打印派发成功与持久结果前缀脚本退出。引导端autonomous-bootstrap.ps1VM 开机后bootstrap 完成把控制权交给自主 worker的准备重设 OOBEDisablePrivacyExperience1并额外设置 Edge 的HideFirstRunExperience1通过 IMDShttp://169.254.169.254/metadata/identity/oauth2/token获取托管身份 token从任务 blob 前缀拉取 worker/bootstrap/dispatcher 脚本与task.json到C:\screenpipe-worker将本地screenpipe账户密码重置为随机值配置 WinlogonAutoAdminLogon1自动登录控制台桌面注册计划任务ScreenpipeAutonomousWorker登录触发、以交互式最高权限运行autonomous-worker.ps1、执行时限 6 小时、失败重启 2 次清空密码变量后shutdown /r重启进入 worker 阶段。执行端autonomous-worker.ps1autonomous-worker.ps1 是任务的主体对应文档第 38 步等待交互桌面轮询当前会话内 explorer 进程出现且 OOBE/CloudExperienceHost 等进程退出最多 90 次尝试启动桌面录像用ffmpeg -f gdigrab -framerate 15 -draw_mouse 1 -i desktop录制acceptance.mp4带 30 次重试的 readiness 循环与FFREPORT日志运行时取密钥从 Key Vault 拉取 GitHub token 与 OpenAI key30 次重试用codex.cmd login --with-api-key完成 Codex 认证gh auth setup-git配置 Git代码就位fetch 精确 base SHA支持resumeLocalHead且校验其是 base 的后代checkout --force -B branchclean -ffd --exclude target配置 git 身份Codex 执行将任务 prompt 与执行契约写入prompt.txt通过codex.cmd exec --ephemeral --sandbox danger-full-access -c approval_policynever --json运行输出codex.jsonl与codex-final.mdCodex 退出码非零但留下可评审结果时由外层确定性校验决定是否交付确定性校验PowerShell 解析检查infra\windows-dev-image\*.ps1、bash -n检查 shell 脚本、git diff --check并断言工作树干净交付git push --force-with-lease含远程分支租约 SHA以用户委派身份登录az login --identity生成六天只读 SAS 视频链接写入 PR 正文含精确 tested commit 与 tree用gh pr create/pr edit创建或更新 PR并在浏览器打开 PR 留证收尾finally停止录像、写evidence.jsontaskId、state、prUrl、testedHead、videoSha256 等、上传全部证据 blob视频、日志、jsonl、manifest移除GH_TOKEN/OPENAI_API_KEY、删除CODEX_HOME与.azure、关闭 AutoAdminLogon 并删除 DefaultPassword最后Stop-Computer -Force。安全边界无入站、无烘焙、运行时取钥整套设计的信任边界可以概括为三条无入站面VM 的 NSG 零自定义入站规则TermServiceRDPTCP 3389在 provisioning 阶段即被禁用并停止见 provision.ps1smoke 测试强制复核控制台桌面仅供 VM 自己交互无操作员会话无烘焙密钥镜像内不落任何凭据provisioning 末尾会删除.npmrc、.git-credentials与临时目录残留见 provision.ps1运行时凭据最小化凭据只通过运行时托管身份 Key Vault 注入with-openai-key.ps1启动器仅在单条命令生命周期内把 OpenAI Key 注入环境并在finally中清除见 provision.ps1worker 侧同理用完即清并执行az logout。此外任务 VM不具备任何发布权限——不签名、不发布 release、不打 tag、不写 updater 元数据整个工作流不允许发布应用版本。操作与排障要点构建/刷新入口./infra/windows-dev-image/build.sh 版本号恢复模式RESUME_EXISTING_BUILDtrue派发入口AZURE_IMAGE_VERSION_IDgallery版本资源ID AZURE_WORKER_IDENTITY_RESOURCE_ID托管身份资源ID ./infra/windows-dev-image/dispatch-autonomous.sh task-id base-sha prompt-file全新镜像验收额外加ALLOW_UNVALIDATED_IMAGE_FOR_SMOKEtrue可覆盖的环境变量AZURE_SUBSCRIPTION_ID、AZURE_LOCATION默认westus2、AZURE_VM_SIZE默认Standard_D16s_v5、AZURE_GALLERY_RESOURCE_GROUP、AZURE_BUILD_RESOURCE_GROUP、AZURE_GALLERY_NAME、AZURE_IMAGE_DEFINITION持久结果派发后从https://storage.blob.core.windows.net/evidence/windows-autonomous/task-id/拉取证据每个任务使用独立资源组与精确 gallery 镜像 ID任务结束后删除对应资源组并确认资源不存在。这套不可变镜像 一次性 VM 一发即忘派发的模型把 Windows 原生开发中最难复现的环境问题收敛为镜像版本即环境真相只要镜像版本经过 smoke 验收任何一次任务都在完全相同的环境语义下执行且不依赖任何常驻控制器进程。对于需要长期维护 Windows 原生代码库的团队这是一个可直接借鉴的、把开发环境当作受版本控制制品来管理的完整实践。【免费下载链接】screenpipeYC (S26) | Open Computer History | Record your screen continuously locally and provide context to your agents (Claude, Codex, Openclaw, Hermes, Runner...)项目地址: https://gitcode.com/GitHub_Trending/sc/screenpipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表