如何通过Azure Pipeline从命令行启动Kestrel服务?
解决方案
针对你的内部QA环境自动化需求,完全可以不用IIS,通过两种方式实现最后一步的自动化启动:
一、直接在发布流水线中远程执行dotnet命令
这种方式适合短期快速实现,不需要额外配置服务:
Windows虚拟机
如果你的VM是Windows,确保流水线执行账户拥有VM的远程管理权限,然后在流水线中添加PowerShell步骤远程执行命令:
Invoke-Command -ComputerName "你的VM名称/IP" -ScriptBlock { # 切换到项目解压目录 Set-Location "C:\部署文件夹路径" # 后台启动Kestrel,避免会话关闭后进程终止 Start-Process dotnet -ArgumentList "ProjectName.dll" -NoNewWindow -PassThru }
Linux虚拟机
如果是Linux,通过SSH远程执行命令,用nohup让进程在后台持续运行:
ssh 用户名@VMIP "cd /部署文件夹路径 && nohup dotnet ProjectName.dll > /dev/null 2>&1 &"
> /dev/null 2>&1 &会将输出重定向,让进程脱离当前会话后台运行。
二、创建系统服务(推荐,更稳定)
如果希望进程意外终止后能自动重启,或者需要更规范的启停管理,可以在VM中创建系统服务,再通过流水线触发启停:
Windows系统
- 在VM上通过PowerShell创建服务(可将此步骤加入流水线的远程执行环节):
New-Service -Name "QA-ProjectService" ` -BinaryPathName "C:\Program Files\dotnet\dotnet.exe C:\部署文件夹路径\ProjectName.dll" ` -DisplayName "QA环境项目服务" ` -StartupType Manual
- 流水线中添加启动服务的命令:
Invoke-Command -ComputerName "你的VM名称/IP" -ScriptBlock { Start-Service -Name "QA-ProjectService" }
更新部署后,将Start-Service替换为Restart-Service即可重启服务。
Linux系统
- 在VM上创建systemd服务文件(比如
/etc/systemd/system/qa-project.service):
[Unit] Description=QA环境.NET Core项目服务 [Service] WorkingDirectory=/部署文件夹路径 ExecStart=/usr/bin/dotnet /部署文件夹路径/ProjectName.dll Restart=on-failure User=合适的运行账户 [Install] WantedBy=multi-user.target
- 流水线中通过SSH执行命令启用并启动服务:
ssh 用户名@VMIP "sudo systemctl daemon-reload && sudo systemctl enable qa-project.service && sudo systemctl start qa-project.service"
更新部署后,执行sudo systemctl restart qa-project.service即可重启服务。
注意事项
- 确保流水线执行账户拥有VM的远程执行权限(Windows需开启WinRM,Linux需开启SSH)
- 运行
dotnet命令的账户需要有项目文件夹的读写权限 - 提前在VM上测试命令,确认端口未被占用、Kestrel能正常启动
- 短期环境可设置服务为手动启动,仅通过流水线触发启停
内容的提问来源于stack exchange,提问作者Kiran Ramaswamy
相关产品推荐
相关产品推荐

