netcore一键nssm发布为windows服务
AntDeploy
是我開發(fā)一款開源一鍵部署工具包
功能一覽:
docker容器一鍵部署
docker鏡像一鍵發(fā)布
支持iis一鍵部署
windows服務(wù)一鍵部署
linux服務(wù)一鍵部署
支持增量發(fā)布
支持一鍵回滾
支持點(diǎn)火
支持選擇特定文件發(fā)布
支持查看發(fā)布記錄
一個(gè)issue
前兩天有一個(gè)使用者給我反饋了一個(gè)issue
image他是用asp5.0開發(fā)了一個(gè)web程序,然后用AntDeploy來部署, 由于AntDeploy部署時(shí)讀取服務(wù)的安裝路徑,然后進(jìn)行更新。但是針對(duì)nssm部署的服務(wù)有一個(gè)特點(diǎn),執(zhí)行路徑是nssm.exe,如下圖:
image那么AntDeploy在更新部署的時(shí)候會(huì)更新到nssm.exe所在的目錄了。
解決思路
nssm是一個(gè)開源c語(yǔ)言寫的軟件,大概只有300kb,可以很方便的把程序安裝成一個(gè)windows服務(wù)。
nssm就像是一個(gè)服務(wù)管理器,windows服務(wù)啟動(dòng)的時(shí)候 會(huì)調(diào)用nssm.exe傳入serviceName、然后nssm.exe會(huì)根據(jù)serviceName拿到配置的實(shí)際要運(yùn)行的文件。
查了下nssm官網(wǎng)
可以根據(jù)命令
nssm?get?<serviceName>?Application獲取實(shí)際要執(zhí)行的程序地址
那么要想要兼容第一次是由nssm.exe部署,后面用AntDeploy發(fā)布的場(chǎng)景,則需要
根據(jù)調(diào)用nssm的命令拿到真實(shí)路徑
根據(jù)真實(shí)路徑進(jìn)行部署
既然是開源軟件,就讓這位仁兄來幫我寫這部分代碼吧
image果然這位仁兄戰(zhàn)斗力可以,很快就搞定了
imageimage開源就是要參與進(jìn)來 這也是我熱愛開源的原因
擴(kuò)展nssm發(fā)布windows功能
上面雖然已經(jīng)解決了:首次用nssm發(fā)布,后面用AntDeploy來更新的場(chǎng)景。
還需要解決掉首次無法使用nssm發(fā)布的功能。
我覺得有必要加這個(gè)功能,來完成nssm發(fā)布windows服務(wù)的閉環(huán)
好處有:
一般按照微軟開發(fā)winfows服務(wù)的標(biāo)準(zhǔn)的話?是需要引入包:Microsoft.Extensions.Hosting.WindowsServices但是用nssm可以不需要引入。所以在netcore開發(fā)web的場(chǎng)景使用nssm安裝為windows服務(wù)很方便而且使用nssm安裝的另外一個(gè)優(yōu)點(diǎn)是可以指定啟動(dòng)參數(shù)??比如?--urls=http://*:10007開始開發(fā)
1. 客戶端 增加入口可以使用nssm
image2. ageng端增加 nssm
在windows場(chǎng)景下才 作為內(nèi)嵌資源。針對(duì)linux場(chǎng)景不需要。
image在啟動(dòng)的時(shí)候釋放出來:
var?nssmSavePath?=?Path.Combine(Startup.RootPath,?"nssm.exe"); if?(File.Exists(nssmSavePath)) {return; } Assembly?assembly?=?typeof(AntDeployAgentWindowsService).Assembly; using?(Stream?stream?=?assembly.GetManifestResourceStream("AntDeployAgentService.nssm.exe")) {if?(stream?!=?null){using?(var?fileStream?=?File.Create(nssmSavePath)){stream.Seek(0,?SeekOrigin.Begin);stream.CopyTo(fileStream);}} }if?(!File.Exists(nssmSavePath)) {throw?new?FileNotFoundException(nssmSavePath?+?"?not?found"); }和客戶端約定了2個(gè)新傳參:
useNssm 客戶端是否選擇采用nssm來部署服務(wù)
param 服務(wù)運(yùn)行的參數(shù)
agent端處理第一次用nssm部署
主要用到了下面幾個(gè)命令:
nssm?install?<serviceName>?"<實(shí)際執(zhí)行文件的完整路徑>"nssm?set?<serviceName>?AppDirectory?"<實(shí)際執(zhí)行文件所在的目錄>"nssm?set?<serviceName>?Description?"<服務(wù)的描述>"nssm?set?<serviceName>?AppParameters?"<服務(wù)運(yùn)行指定的參數(shù)>"nssm?start?<serviceName>封裝一個(gè)方法來執(zhí)行nssm命令
public?static?bool?RunExternalExe(string?projectPath,?string?arguments,?Action<string>?logger) {Process?process?=?null;try{if?(string.IsNullOrEmpty(arguments)){throw?new?ArgumentException(nameof(arguments));}process?=?new?Process();process.StartInfo.FileName?=?projectPath;process.StartInfo.Arguments?=?arguments;process.StartInfo.CreateNoWindow?=?true;process.StartInfo.WindowStyle?=?ProcessWindowStyle.Hidden;process.StartInfo.UseShellExecute?=?false;process.StartInfo.Verb?=?"runas";process.StartInfo.RedirectStandardError?=?true;process.StartInfo.RedirectStandardOutput?=?true;process.Start();process.OutputDataReceived?+=?(sender,?args)?=>{if?(!string.IsNullOrWhiteSpace(args.Data)){logger(args.Data);}};process.BeginOutputReadLine();process.ErrorDataReceived?+=?(sender,?data)?=>{if?(!string.IsNullOrWhiteSpace(data.Data))?logger(data.Data);};process.BeginErrorReadLine();process.WaitForExit();//var?err?=?process.StandardError.ReadToEnd();return?process.ExitCode?==?0;}catch?(Exception?ex){return?false;}finally{process?.Dispose();} }以aspnet5的web測(cè)試 完整的運(yùn)行效果是:
image服務(wù)部署成功
image訪問成功
image成功物
插件最新版: v7.32
agent最新版:v6.9
源碼地址:https://github.com/yuzd/AntDeployAgent
交流QQ群:488312978
總結(jié)
以上是生活随笔為你收集整理的netcore一键nssm发布为windows服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统信软件用一年时间跨越式发展说明了一件事
- 下一篇: Asp.Net Core 中如何设置 I