ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Captura 持续集成(CI)深度指南:AppVeyor + Cake 自动化构建、测试与发布流水线解析

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),仅供参考
返回列表