基于Jenkins与MSBuild实现C#项目Assembly版本整合构建号及ClickOnce发布
针对你的需求和手头的工具栈,我整理了一套一步步可落地的方案,涵盖版本号提取、项目构建和ClickOnce发布全流程:
一、先确认环境就绪
确保你手头的工具都已正确配置:
- MSBuild v14:需保证它在Jenkins的环境变量路径中,或者能直接调用完整路径(
C:\Program Files (x86)\MSBuild\14.0\Bin\msbuild.exe) - Visual Studio 2013:提前在本地配置好项目的ClickOnce基础发布设置,方便后续MSBuild复用
- Jenkins v2.111(Windows Server 2012):已安装Git插件,且服务账号有代码拉取、文件读写和网络共享访问权限
- Git裸仓库:Jenkins能正常通过网络拉取代码
- Windows Batch:Jenkins允许执行Batch脚本
二、提取AssemblyInfo.cs中的主/次版本号
用Windows Batch脚本从AssemblyInfo.cs里提取主版本号和次版本号,再拼接Jenkins的构建号生成最终版本(格式:1.2.$BUILD_NUMBER)。
创建一个Batch脚本(比如BuildWithVersion.bat),内容如下:
@echo off setlocal enabledelayedexpansion :: 1. 定位AssemblyInfo.cs的路径(根据你的项目结构调整,比如在Properties目录下) set ASSEMBLY_INFO=./YourProjectName/Properties/AssemblyInfo.cs :: 2. 从AssemblyVersion行提取主、次版本号 for /f "tokens=2 delims=()\"" %%a in ('findstr /r "AssemblyVersion" "%ASSEMBLY_INFO%"') do ( set VERSION_STR=%%a :: 拆分版本号,取前两位 for /f "tokens=1,2 delims=." %%b in ("!VERSION_STR!") do ( set MAJOR_VER=%%b set MINOR_VER=%%c ) ) :: 3. 拼接最终版本号:主.次.Jenkins构建号 set FULL_VERSION=%MAJOR_VER%.%MINOR_VER%.%BUILD_NUMBER% echo 生成的构建版本号:%FULL_VERSION% :: 4. 备份AssemblyInfo.cs(避免修改后污染Git仓库) copy "%ASSEMBLY_INFO%" "%ASSEMBLY_INFO%.bak" :: 5. 替换AssemblyInfo中的版本号(用PowerShell实现字符串替换,Batch原生替换较麻烦) powershell -Command "(Get-Content '%ASSEMBLY_INFO%') -replace 'AssemblyVersion\(".*?"\)', 'AssemblyVersion("%FULL_VERSION%.0")' | Set-Content '%ASSEMBLY_INFO%'" powershell -Command "(Get-Content '%ASSEMBLY_INFO%') -replace 'AssemblyFileVersion\(".*?"\)', 'AssemblyFileVersion("%FULL_VERSION%.0")' | Set-Content '%ASSEMBLY_INFO%'"
三、用MSBuild构建项目
在上述Batch脚本中继续添加构建命令,将生成的版本号注入到项目中:
:: 6. 用MSBuild构建Release版本 msbuild "./YourSolutionName.sln" ^ /p:Configuration=Release ^ /p:Platform="Any CPU" ^ /m /v:m :: 7. 恢复AssemblyInfo.cs备份(避免Git提交不必要的修改) copy "%ASSEMBLY_INFO%.bak" "%ASSEMBLY_INFO%" del "%ASSEMBLY_INFO%.bak"
四、配置Jenkins的ClickOnce发布触发
要实现“用户选择发布才执行部署”,可以通过Jenkins的参数化构建来控制:
- 在Jenkins项目中添加参数化构建过程,新增一个布尔参数
DO_PUBLISH,默认值设为false,描述写“是否执行ClickOnce发布”。 - 在Batch脚本末尾添加条件判断,当
DO_PUBLISH为true时执行发布:
:: 8. 条件触发ClickOnce发布 if "%DO_PUBLISH%"=="true" ( echo 开始执行ClickOnce发布... msbuild "./YourProjectName/YourProjectName.csproj" ^ /p:Configuration=Release ^ /p:PublishDir=\\YourPublishServer\ClickOnce\YourApp\ ^ /p:PublishUrl=\\YourPublishServer\ClickOnce\YourApp\ ^ /p:InstallUrl=http://YourWebDomain/ClickOnce/YourApp/ ^ /p:UpdateUrl=http://YourWebDomain/ClickOnce/YourApp/ ^ /t:Publish /v:m )
注意:
PublishDir是发布文件的存储路径(可以是本地目录或网络共享),InstallUrl和UpdateUrl是用户安装和检查更新的Web地址,需根据实际部署环境调整。
五、关键注意事项
- 确保Jenkins服务账号对
PublishDir共享目录有读写权限,对Web服务器的发布目录有写入权限 AssemblyInfo.cs中的版本号格式要统一(比如[assembly: AssemblyVersion("X.Y.0.0")]),否则脚本可能提取失败- 每次构建的
BUILD_NUMBER是Jenkins自动递增的,能保证版本号唯一,避免ClickOnce更新冲突
内容的提问来源于stack exchange,提问作者Sulphy
相关产品推荐
相关产品推荐

