Captura 持续集成(CI)深度指南:AppVeyor + Cake 自动化构建、测试与发布流水线解析
桌面应用屏幕录制音视频【免费下载链接】CapturaCapture Screen, Audio, Cursor, Mouse Clicks and Keystrokes项目地址https://gitcode.com/gh_mirrors/ca/Captura点击查看免费下载本文围绕 Captura 开源仓库的 docs/CI.md 展开深入剖析该项目的持续集成体系从 AppVeyor 如何响应 GitHub 提交自动克隆、构建、测试到 tag 构建时自动发布到 GitHub Releases草稿与 Chocolatey 的完整链路并结合 appveyor.yml、build.cake 及 scripts 目录下的 Cake 脚本给出源码级解释。读完本文你将掌握 Captura 的 CI 流水线全貌、dev build开发版的获取方式以及如何在本地用 Cake 脚本复现 CI 构建流程。一、CI 流水线总览一次提交到发布的全过程按 docs/CI.md 的描述Captura 的持续集成采用AppVeyor作为 CI 服务整体流程如下开发者向 GitHub 仓库推送 commitAppVeyor 克隆仓库使用Cake 构建脚本仓库根目录的 build.cake执行构建与测试如果是tag 构建打标签的提交构建产物会被部署到 GitHub Releases以草稿形式以及 Chocolatey 包仓库。从 appveyor.yml 的配置可以还原出这条流水线的完整实现构建镜像image: Visual Studio 2019即每次构建运行在 Windows VS2019 环境中双配置构建configuration同时声明Debug与ReleaseAppVeyor 会对两种配置各跑一遍构建构建脚本入口build_script段调用dotnet-cake --targetCI --configuration$env:CONFIGURATION --build_version$version把版本号与配置作为参数交给 Cake测试开关test: off表示关闭 AppVeyor 自带的测试发现机制——因为单元测试已经作为 Cake 任务Test集成在CI目标中执行避免重复运行产物收集artifacts段声明temp/Captura-Portable.zipPortable 版、temp/Captura-Setup.exe安装版与temp/captura.*.nupkgChocolatey 包发布deploy段包含 GitHub Releases仅 Release 配置 tag 构建与 ChocolateyNuGet provider同样仅 Release 配置 tag 构建两个 provider。值得注意的是 appveyor.yml 的分支排除策略branches.except排除了l10n_masterCrowdin 本地化合并分支与gh-pages官网页面分支避免翻译同步和文档站点更新触发不必要的完整构建。二、appveyor.yml 关键配置逐项解读appveyor.yml 是整条 CI 流水线的声明式外壳下面逐段说明其关键配置及其作用。1. 版本号与安全环境变量version: 0.0.{build} environment: imgur_client_id: secure: Y/2WUSisk7oLSQNY1YzUxw yt_client_id: secure: ... yt_client_secret: secure: ... choco_key: secure: ... git_key: secure: ...version: 0.0.{build}是 AppVeyor 侧构建号格式{build}由 AppVeyor 自动填充五个环境变量全部使用secure加密存储imgur_client_idImgur 图床上传、yt_client_id/yt_client_secretYouTube 上传、choco_keyChocolatey API Key、git_keyGitHub Personal Access Token。注释# Used in build.cake表明这些变量会在构建阶段被 Cake 脚本消费——详见下文API Key 注入一节。2. 安装依赖install 段install: - dotnet tool install -g Cake.Tool --version 0.32.1 - choco install innosetup -y --no-progress安装固定版本0.32.1的 Cake 全局工具与 docs/Cake.md 中的安装命令完全一致保证 CI 与本地开发环境使用相同构建工具链通过 Chocolatey 安装 Inno Setup用于生成Captura-Setup.exe安装包对应根目录的 Inno.iss 安装脚本。3. 构建脚本build_script 段与 tag 识别build_script: - ps: - $tag $env:APPVEYOR_REPO_TAG_NAME if ($tag -ne $null) { $env:prerelease $tag.Contains(-) if ($tag -match ^build-number-) { Write-Host Build number tag is skipped Exit-AppveyorBuild } else { dotnet-cake --targetCI --configuration$env:CONFIGURATION --build_version$tag } } else { $version v0.0. $env:APPVEYOR_BUILD_NUMBER dotnet-cake --targetCI --configuration$env:CONFIGURATION --build_version$version }这段 PowerShell 逻辑区分了三种场景场景判断条件行为tag 构建含连字符$tag非空且包含-标记为 prerelease如v9.0.0-beta3tag 构建正式版$tag非空且不含-按正式版处理如v9.0.0构建号 tag$tag匹配^build-number-直接跳过构建Exit-AppveyorBuild普通 commit无 tag$tag为空自动生成v0.0.build_number作为 dev 构建版本无论哪种情况最终都会调用dotnet-cake --targetCI把版本号通过--build_version传入 Cake 脚本。prerelease标志会被保存在$env:prerelease中供后续 GitHub 部署阶段读取prerelease: $(prerelease)。4. 产物与部署artifacts / deploy 段artifacts: - path: temp/Captura-Portable.zip name: Portable - path: temp/Captura-Setup.exe name: Setup - path: temp/captura.*.nupkg name: Chocolatey三个产物分别对应PortableCaptura-Portable.zip免安装绿色版由 Cake 的Pack-Portable任务生成到temp/SetupCaptura-Setup.exeInno Setup 安装版由Pack-Setup任务生成Chocolateycaptura.版本号.nupkg由Pack-Choco任务生成。部署策略deploy段两个 provider 都带有on条件configuration: Release且appveyor_repo_tag: true也就是说只有 Release 配置下的 tag 构建才会真正发布Debug 配置或非 tag 构建只产出 dev build 产物不触发发布。GitHub provider 上传 Portable 与 Setup 两个 artifact并使用git_key作为鉴权 tokenNuGet provider 则将 Chocolatey 包推送到https://chocolatey.org。三、Cake 构建脚本CI 目标的任务编排build.cake 是整个构建体系的核心它通过#l指令引入了 scripts 目录下的五个辅助脚本#l scripts/backup.cake # 文件备份/还原机制 #l scripts/constants.cake # 目录与路径常量 #l scripts/choco.cake # Chocolatey 打包 #l scripts/apikeys.cake # API Key 注入 #l scripts/version.cake # 版本号解析与 AssemblyInfo 更新1. 任务依赖图CI目标Task的依赖关系链如下CI ├── Test 依赖 Build运行 xunit 单元测试 ├── Pack-Portable 依赖 Populate-Output → Clean-Output Build ├── Pack-Setup 依赖 Populate-Output └── Pack-Choco 依赖 Pack-Portable其中Populate-Output负责把编译产物、语言文件、keymaps、许可证等组装到dist/目录void PopulateOutput() { CopyDirectory(licensesFolder, distFolder Directory(licenses)); // 许可证 CopyDirectory(uiBinFolder Directory(Languages), ...); // 多语言 CopyDirectory(uiBinFolder Directory(keymaps), ...); // 按键映射 // Release 复制 lib 目录Debug 额外复制 dll/pdb/xml }关键行为差异Debug 构建会复制.dll、.pdb、.xml便于调试而Release 构建只复制lib目录压缩体积、仅发布依赖程序集。Pack-Setup调用 Inno Setup 并传入MyAppVersion参数InnoSetup(InnoScriptPath, new InnoSetupSettings { QuietMode InnoSetupQuietMode.Quiet, ArgumentCustomization Args Args.Append($/DMyAppVersion{version}) });对应的安装脚本是仓库根目录的 Inno.iss。2. 单元测试集成Test任务通过XUnit2运行测试程序集var testTask Task(Test) .IsDependentOn(buildTask) .Does(() XUnit2(sourceFolder File($Tests/bin/{configuration}/**/Captura.Tests.dll)));测试工程位于 src/Tests覆盖音频文件写入、截图、属性存储、录屏、窗口捕获与控制台启动等核心功能如 AudioFileWriterTests.cs、ScreenShotTests.cs、ConsoleStartTests.cs。这也解释了为什么appveyor.yml中要写test: off——测试已经作为 Cake 任务链的一部分被显式调用无需 AppVeyor 再做一轮自动测试发现。3. Setup / Teardown 钩子Setup(context { EnsureDirectoryExists(tempFolder); EnsureDirectoryExists(distFolder); HandleVersion(); // 解析版本号并更新 AssemblyInfo if (configuration Release) EmbedApiKeys(); // 仅 Release 注入 API Key }); Teardown(context { RestoreBackups(); // 还原被临时修改的文件 });Setup 阶段在 Release 构建时注入 API KeyTeardown 阶段统一还原所有被构建过程临时改动的源文件配合 scripts/backup.cake 的备份/还原机制保证 CI 修改不会污染仓库工作副本。四、版本号处理与 AssemblyInfo 更新scripts/version.cake 负责把--build_version参数解析成可用的程序集版本const string StableVersionRegex ^v\d\.\d\.\d$; const string PrereleaseVersionRegex ^v\d\.\d\.\d-[^\s]$; // 稳定版/CI 构建去掉前导 v如 v9.0.0 → 9.0.0 // 预发布版取第一个 - 前的部分如 v9.0.0-beta3 → 9.0.0版本号校验通过后会备份并更新两个项目的AssemblyInfo.cssrc/Captura/Properties/AssemblyInfo.csGUI 主程序src/Captura.Console/Properties/AssemblyInfo.cs命令行程序这也印证了 docs/Cake.md 中关于-build_version参数的说明稳定版应为v9.0.0形式预发布版应为v9.0.0-beta3形式构建期间会根据该值更新 AssemblyInfo。五、API Key 注入与 Chocolatey 打包的实现细节1. API Key 注入仅 Releasescripts/apikeys.cake 中的EmbedApiKeys()会读取 src/Captura.Core/ApiKeys.cs用正则Get\((.*)\)找出所有 API Key 占位符再把 AppVeyor 环境变量中的真实值替换进去if (HasEnvironmentVariable(variable)) { content content.Replace($Get(\{variable}\), $\{EnvironmentVariable(variable)}\); }这意味着 Imgur、YouTube 等服务的密钥只在 CI 的 Release 构建中被嵌入本地编译或 Debug 构建则保留占位符避免密钥泄露到开发分支。由于EmbedApiKeys仅挂在Setup且configuration Release条件下因此普通 commit 的 Debug/Release dev build 均不会嵌入生产密钥。2. Chocolatey 打包与校验和scripts/choco.cake 的PackChoco()先计算 Portable zip 的 SHA256 校验和然后把它与 tag 一起注入 choco/tools/chocolateyinstall.ps1var checksum CalculateFileHash(PortablePath).ToHex(); var newContent $$tag {tag}; $checksum {checksum}; {originalContent};注入后的安装脚本会从 GitHub Releases 下载Captura-Portable.zip并校验 SHA256$params { PackageName Captura; Url https://github.com/MathewSachin/Captura/releases/download/$tag/Captura-Portable.zip; UnzipLocation $(Split-Path -parent $MyInvocation.MyCommand.Definition); Checksum $checksum; ChecksumType sha256; }; Install-ChocolateyZipPackage params最后通过ChocolateyPack依据 choco/captura.nuspec 生成captura.版本号.nupkg到temp/目录。同样地临时注入的 tag 与 checksum 会在 Teardown 阶段被RestoreBackups()还原。六、获取开发版构建Dev Builds这是 docs/CI.md 的核心实战章节。dev build 是每次 commit 触发的非 tag 构建产物用于提前体验新功能与修复但也可能不稳定。原文提示dev builds 可能不稳定仅供测试用途。获取步骤如下打开 AppVeyor 上 Captura 项目的构建页面对应master分支可以看到历史构建列表每次 push 都会触发一条构建选择构建配置Debug或ReleaseDebug 构建包含调试符号.pdb与 XML 文档便于排查问题Release 构建产物更接近正式发布形态打开Artifacts构建产物标签页根据需求下载Portable绿色版 zip或SetupInno Setup 安装程序版本。对应到流水线中普通 commit 会自动生成v0.0.build_number这样的版本号并执行dotnet-cake --targetCI产物即 appveyor.yml artifacts 段声明的 Portable zip 与 Setup exe。由于非 tag 构建不满足 deploy 的appveyor_repo_tag: true条件dev build 只停留在 AppVeyor 的 Artifacts 页供手动下载不会污染正式发布渠道。七、在本地复现 CI 构建若想在本地完整复现 CI 的构建流程可参照 docs/Cake.md安装 Cake需要 .NET Core 2.1 或以上dotnet tool install -g Cake.Tool --version 0.32.1运行默认构建dotnet-cake指定参数参数说明-build_version构建版本号。稳定/CI 构建形如v9.0.0预发布构建形如v9.0.0-beta3构建期间会据此更新 AssemblyInfo.cs-configuration构建配置Release或Debug-target要执行的任务如CI、Default见 build.cake 中的任务定义例如模拟 CI 构建dotnet-cake --targetCI --configurationRelease本地的Default目标会依次执行 Pack-Portable、Pack-Setup、Pack-Choco 三个打包任务产出于temp/目录CI目标则在打包之外额外串联Test任务与 AppVeyor 上的行为保持一致。需要注意的是本地执行时若缺少 Imgur/YouTube 等环境变量Release 构建的 API Key 注入环节会跳过对应替换不会影响编译与打包本身。八、总结Captura 的 CI 体系是一个典型的AppVeyor 调度 Cake 编排组合appveyor.yml负责环境准备、参数传递、产物收集与多 provider 部署build.cake及其 scripts 辅助脚本负责构建、测试、版本注入、API Key 嵌入与三种发行物Portable / Setup / Chocolatey的打包tag 构建自动触发 GitHub Releases 草稿与 Chocolatey 发布普通 commit 则产出可用于测试的 dev build。整套设计保证了从提交到发布的全流程自动化同时通过仅 Release tag 的部署条件、加密环境变量与文件备份还原机制兼顾了发布安全与仓库洁净。如果你正在为 Captura 做本地开发验证dotnet-cake --targetCI --configurationDebug即可在本地跑通与 CI 等价的构建与测试链路。赞分享桌面应用屏幕录制音视频【免费下载链接】CapturaCapture Screen, Audio, Cursor, Mouse Clicks and Keystrokes项目地址https://gitcode.com/gh_mirrors/ca/Captura点击查看免费下载相关推荐Gitea持续集成自动化测试与构建流水线Gitea持续集成自动化测试与构建流水线 引言从手动部署到自动化流水线的转型 在现代软件开发中持续集成Continuous IntegrationCI后端代码托管研发协作CI/CDPomotroid CI/CD流水线AppVeyor持续集成配置Pomotroid CI/CD流水线AppVeyor持续集成配置 Pomotroid是一个简单美观的番茄工作法计时器应用通过AppVeyor CI/CD流水FindMy.py持续集成自动化构建与测试流水线FindMy.py持续集成自动化构建与测试流水线 ? 痛点开源项目质量保障的挑战 作为Apple Find My网络生态系统的Python实现FindMy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

手把手教你学Simulink——基于Simulink的硬件在环(HIL)电机控制器测试平台

手把手教你学Simulink——基于Simulink的硬件在环(HIL)电机控制器测试平台

目录 手把手教你学Simulink ——基于Simulink的硬件在环(HIL)电机控制器测试平台 一、引言:为什么“纯仿真”不够?真实控制器必须经受HIL考验! 二、什么是电机HIL?核心架构解析 HIL基本原理 三大核心优势: 三、应用场景:伺服驱动器量产前的全面验证 四、建模与实…

2026/9/24 1:43:24 阅读更多 →
华为OD机考往年真题 - 查找接口成功率最优时间段

华为OD机考往年真题 - 查找接口成功率最优时间段

2026年在考真题 2026年目前正在考的真题目录:2026最新华为OD机试新系统卷 双机位C卷 真题题库目录|全覆盖题库 逐点算法考点详解 文章目录2026年在考真题题目描述输入描述输出描述示例1示例2解题思路:最长满足平均失败率的时间段解题步骤C…

2026/9/24 1:43:24 阅读更多 →
Infer `debug` 子命令完全指南:透视内部数据结构、过程摘要与调用图

Infer `debug` 子命令完全指南:透视内部数据结构、过程摘要与调用图

静态分析代码质量开发工具 【免费下载链接】infer A static analyzer for Java, C, C, and Objective-C 项目地址: https://gitcode.com/gh_mirrors/infer/infer 点击查看 免费下载 导读 infer debug 是 Infer 静态分析器中面向分析与调试场景的命令行工具&#x…

2026/9/24 1:43:24 阅读更多 →

最新新闻

AI陪伴机器人生产部署清单-从云服务器到稳定运行

AI陪伴机器人生产部署清单-从云服务器到稳定运行

10-生产部署清单-从云服务器到稳定运行系列:AI 伙伴(AI-Partner)——具身智能陪伴机器人 数据接口部署与二次开发篇(10/12)一、先说结论:这套 Demo 距离生产差几步 AI 伙伴(AI-Partner&#xf…

2026/9/24 3:45:44 阅读更多 →
all-in-rag 食谱知识库实战:以一份简易红烧肉菜谱为例的数据准备全流程解析

all-in-rag 食谱知识库实战:以一份简易红烧肉菜谱为例的数据准备全流程解析

教程人工智能大模型RAG 【免费下载链接】all-in-rag 🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/ 项目地址: https://gitcode.com/datawhalechina/all-in-ra…

2026/9/24 3:45:44 阅读更多 →
AutoCAD硬件加速与显卡驱动优化指南

AutoCAD硬件加速与显卡驱动优化指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 3:45:44 阅读更多 →
陪诊行业爆发:平台 + 陪诊师 + 医院 + 渠道多方分账怎么解?

陪诊行业爆发:平台 + 陪诊师 + 医院 + 渠道多方分账怎么解?

随着老龄化加剧、优质医疗资源紧张和城市就医流程复杂化,陪诊服务正在从 “小众帮忙” 变成城市家庭的高频刚需。一线城市陪诊平台数量已超过 200 家,不少项目从医院周边的小团队,快速成长为连接患者、陪诊师、医院渠道、保险公司和推荐人的医…

2026/9/24 3:45:43 阅读更多 →
先验证谁付钱——「2026年,手机就能做」可复制的 AI 步骤拆解

先验证谁付钱——「2026年,手机就能做」可复制的 AI 步骤拆解

**项目名片(学习向)**赛道:内容创作变现模式:广告/橱窗(公开常见路径)启动门槛:低到中适合人群:图文创作者核心承诺:先验证谁付钱重要声明:本文为 **AI 应用与…

2026/9/24 3:45:43 阅读更多 →
AI大模型重构在线旅游:从行程规划到供应链的实战拆解

AI大模型重构在线旅游:从行程规划到供应链的实战拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 3:44:43 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →