建网站-湛江市,网站后端都需要什么意思,旅游景区网络推广方案,电脑报网站建设AntDeploy是我开发一款开源一键部署工具包功能一览#xff1a;docker容器一键部署docker镜像一键发布支持iis一键部署windows服务一键部署linux服务一键部署支持增量发布支持一键回滚支持点火支持选择特定文件发布支持查看发布记录一个issue前两天有一个使用者给我反馈了一个i… AntDeploy是我开发一款开源一键部署工具包功能一览docker容器一键部署docker镜像一键发布支持iis一键部署windows服务一键部署linux服务一键部署支持增量发布支持一键回滚支持点火支持选择特定文件发布支持查看发布记录一个issue前两天有一个使用者给我反馈了一个issueimage他是用asp5.0开发了一个web程序然后用AntDeploy来部署 由于AntDeploy部署时读取服务的安装路径然后进行更新。但是针对nssm部署的服务有一个特点执行路径是nssm.exe如下图image那么AntDeploy在更新部署的时候会更新到nssm.exe所在的目录了。解决思路nssm是一个开源c语言写的软件大概只有300kb可以很方便的把程序安装成一个windows服务。nssm就像是一个服务管理器windows服务启动的时候 会调用nssm.exe传入serviceName、然后nssm.exe会根据serviceName拿到配置的实际要运行的文件。查了下nssm官网可以根据命令nssm get serviceName Application
获取实际要执行的程序地址那么要想要兼容第一次是由nssm.exe部署后面用AntDeploy发布的场景则需要根据调用nssm的命令拿到真实路径根据真实路径进行部署image既然是开源软件就让这位仁兄来帮我写这部分代码吧image果然这位仁兄战斗力可以很快就搞定了imageimage开源就是要参与进来 这也是我热爱开源的原因扩展nssm发布windows功能上面虽然已经解决了首次用nssm发布后面用AntDeploy来更新的场景。还需要解决掉首次无法使用nssm发布的功能。我觉得有必要加这个功能来完成nssm发布windows服务的闭环好处有一般按照微软开发winfows服务的标准的话 是需要引入包Microsoft.Extensions.Hosting.WindowsServices但是用nssm可以不需要引入。所以在netcore开发web的场景使用nssm安装为windows服务很方便而且使用nssm安装的另外一个优点是可以指定启动参数 比如 --urlshttp://*:10007
开始开发1. 客户端 增加入口可以使用nssmimage2. ageng端增加 nssm在windows场景下才 作为内嵌资源。针对linux场景不需要。image在启动的时候释放出来
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个新传参useNssm 客户端是否选择采用nssm来部署服务param 服务运行的参数agent端处理第一次用nssm部署主要用到了下面几个命令nssm install serviceName 实际执行文件的完整路径nssm set serviceName AppDirectory 实际执行文件所在的目录nssm set serviceName Description 服务的描述nssm set serviceName AppParameters 服务运行指定的参数nssm start serviceName
封装一个方法来执行nssm命令public static bool RunExternalExe(string projectPath, string arguments, Actionstring 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测试 完整的运行效果是image服务部署成功image访问成功image成功物插件最新版: v7.32agent最新版:v6.9源码地址https://github.com/yuzd/AntDeployAgent交流QQ群488312978