不推荐直接在c#中调用jenkins api发版,因c#非ci/cd调度层,硬写客户端等于重复造轮子;应让c#项目可被jenkins识别构建,由pipeline控制发版,c#仅提供产物和部署脚本。

为什么直接在C#里调用Jenkins API发版不推荐
因为C#本身不是CI/CD调度层,硬写JenkinsClient发构建、轮询状态、解析BuildResult,等于重复造jenkins-cli.jar的轮子。真正要做的不是“用C#发版”,而是让C#项目可被Jenkins识别、构建、归档、部署——发版动作该由Jenkins Pipeline控制,C#只负责提供可执行产物和配套脚本。
如何让Jenkins正确构建C#项目(.NET SDK环境)
Jenkins默认没有.NET SDK,必须显式安装并配置PATH,否则dotnet build会报The term 'dotnet' is not recognized。Windows节点建议用Chocolatey安装,Linux节点用apt-get install dotnet-sdk-8.0(注意版本对齐)。
- 在Jenkins全局工具配置中添加
.NET SDK,指定dotnet路径(如C:\Program Files\dotnet\dotnet.exe或/usr/bin/dotnet) - Pipeline脚本里避免写死SDK版本,改用
tools { dotnet '8.0' }声明,Jenkins会自动注入对应PATH -
dotnet publish必须加--configuration Release --self-contained true --runtime win-x64(按目标平台选runtime),否则生成的publish目录缺依赖,部署后启动失败
怎样从C#代码触发Jenkins构建(安全且可控)
用C#发HTTP请求调/job/{jobName}/build最简单,但没参数、没认证、没反馈。生产环境必须用buildWithParameters + CRUMB + API Token,否则Jenkins 2.176+默认拦截CSRF请求。
- 先GET
http://jenkins-url/crumbIssuer/api/json拿crumb和crumbRequestField - 再POST
http://jenkins-url/job/{jobName}/buildWithParameters?branch=main&version=1.2.3,Header带Content-Type: application/x-www-form-urlencoded和{crumbRequestField}: {crumb} - 认证用
HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{user}:{apiToken}"))),别存明文密码 - 构建触发后立刻查
/lastBuild/api/json?tree=result,timestamp不靠谱——得等几秒再查,否则返回null
发布包怎么从Jenkins传到目标服务器(不靠FTP)
用scp或rsync太重,Windows上还麻烦;直接在Pipeline里用archiveArtifacts只存包不部署。真正要的是“推完就启”,所以推荐C#项目内置deploy.ps1或deploy.sh,Jenkins最后一步sh 'chmod +x deploy.sh && ./deploy.sh'即可。
- deploy.sh里用
rsync -av --delete ./publish/ user@prod-server:/opt/myapp/比scp -r快且支持断点续传 - Windows目标机开启WinRM,C#项目附带
deploy.ps1,Jenkins用powershell "Invoke-Command -ComputerName prod-server -FilePath ./deploy.ps1" - 别在Jenkins里写
ssh user@server 'systemctl restart myapp'——权限和环境变量常不一致,统一走部署脚本内部处理
真正卡住人的从来不是“怎么写C#调Jenkins”,而是.NET运行时版本错配、publish输出路径没对齐、Jenkins节点没装git-lfs导致大资源文件拉不全、或者deploy脚本里用了cd ..却没判断当前路径——这些细节不验一遍,Pipeline看着绿,发出去的包根本跑不起来。











