You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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的参数化构建来控制:

  1. 在Jenkins项目中添加参数化构建过程,新增一个布尔参数DO_PUBLISH,默认值设为false,描述写“是否执行ClickOnce发布”。
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:38:36