AntDeploy

是我开发一款开源一键部署工具包

功能一览:

  • docker容器一键部署

  • docker镜像一键发布

  • 支持iis一键部署

  • windows服务一键部署

  • linux服务一键部署

  • 支持增量发布

  • 支持一键回滚

  • 支持点火

  • 支持选择特定文件发布

  • 支持查看发布记录

一个issue

前两天有一个使用者给我反馈了一个issue

image

他是用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

果然这位仁兄战斗力可以,很快就搞定了

image

image
开源就是要参与进来 这也是我热爱开源的原因

扩展nssm发布windows功能

上面虽然已经解决了:首次用nssm发布,后面用AntDeploy来更新的场景。

还需要解决掉首次无法使用nssm发布的功能。

我觉得有必要加这个功能,来完成nssm发布windows服务的闭环

好处有:

一般按照微软开发winfows服务的标准的话 是需要引入包:Microsoft.Extensions.Hosting.WindowsServices但是用nssm可以不需要引入。所以在netcore开发web的场景使用nssm安装为windows服务很方便而且使用nssm安装的另外一个优点是可以指定启动参数? 比如 --urls=http://*:10007

开始开发

1. 客户端 增加入口可以使用nssm

image

2. 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, 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测试 完整的运行效果是:

image

服务部署成功

image

访问成功

image

成功物

插件最新版: v7.32

agent最新版:v6.9

源码地址:https://github.com/yuzd/AntDeployAgent

交流QQ群:488312978

netcore一键nssm发布为windows服务相关推荐

  1. WTM(ASP.NET 5 or 6)发布为Windows服务和使用bat方式启动

    最近部署wtm研发的考试系统,系统在线下机房部署.运气不好的是对方给提供WindowsServer2016操作系统居然是盗版系统,IIS无法正常部署wtm应用. 为了解决这一问题,初期想到的方案就是使 ...

  2. java windows wrapper_Java Service Wrapper 发布Java程序为Windows服务

    现在目前只要32位有免费的,64位免费版目前还没有做出来.官网上(社区)那一列是免费的. 1.先把你的项目用MANIFEST.MF打成jar包,例如bb.jar.新建目录,例如:dist,放在D盘下面 ...

  3. 第三节:Windows平台部署Asp.Net Core应用(基于IIS和Windows服务两种模式)

    一. 简介 Asp.Net Core 部署方式有两种:依赖框架和独立部署. 1. 框架依赖的部署: 顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core. 由于 ...

  4. 使用C#调试Windows服务模板项目

    目录 介绍 特征 准备此应用程序的步骤如下 1.创建Windows服务项目 2.将项目输出类型从Windows应用程序更改为控制台应用程序 3.安装log4net包 4.配置log4net 5.添加S ...

  5. 如何基于 dotnetcore worker service 创建 windows 服务

    .NET CORE 3.1 提供了 worker service 这么一个模板,可以方便开发者来创建"windows 服务程序"(同样可发布于 linux). 本篇以 centos ...

  6. netcore一键部署到linux服务器以服务方式后台运行

    AntDeploy 是我开发一款开源一键发布插件 将本地vs中的代码,一键打包,部署到任意的远程服务器 部署方式支持 windows服务,linux服务,docker容器,iis 支持增量发布(只更新 ...

  7. 一键将kafka,zookeeper安装为windows服务

    正式的网站项目,使用了kafka和 zookeeper,原来是通过命令行启动的,存在的风险就是其他人上服务器可能随时或者不小心给你把命令行cmd给关闭掉,这样kafka和zookeeper就挂掉了,那 ...

  8. nssm和AlwaysUp来包装exe文件为windows服务

    最近遇到要把windows exe文件部署为service,因为原先开发为exe程序,现在有不想修改code改为service,但是部署必须是service服务, 所以我们需要一个包装器来包装exe为 ...

  9. 使用C#创建Windows服务 并发布Windows 服务

    一.开发环境 操作系统:Windows 10 X64 开发环境:VS2015 编程语言:C# .NET版本:.NET Framework 4.0 目标平台:X86 二.创建Windows Servic ...

最新文章

  1. python第三方库之学习pyserial库--串口通信
  2. 比特币现金锚定货币交易所越来越多
  3. 使用SQL SERVER 2000的全文检索功能
  4. Android 内存优化测试(转)
  5. 视频服务器读取hdfs文件,基于HDFS的流媒体服务器Red5视频文件分发的研究与应用...
  6. Java项目:前台展示+后台管理结合的在线购书系统(java+Springboot+ssm+mysql+maven)
  7. LumaQQ.NET For Visual Studio 2005 代码下载
  8. GCT 英语单词分组记忆手册
  9. C语言基础学习——基本数据类型(char型)
  10. JUC并发编程学习笔记
  11. 计算机编程在哪里学,高中毕业想学计算机编程,不知道从哪开始学起。
  12. Web在线打印设计器即将推出,像Excel一样在线设计模板
  13. 数据库学习笔记2(补遗笔记1)
  14. 螺栓校核matlab仿真
  15. Apache虚拟主机配置详解
  16. 计算机毕业设计php的宠物狗销售网站
  17. 软件无线电技术简介及特点应用
  18. WRF中使用ERA5再分析数据
  19. 程序员 计算机网络,程序员必备计算机网络知识
  20. 熊掌记导出html没有换行,Bear|熊掌记:标签使用指南

热门文章

  1. CIO们对数据中心虚拟化心存的六大疑虑
  2. NppFTP小插件的使用
  3. 使用badboy录制脚本 结合Jmeter一起测试。
  4. 160809308周子济第7次作业
  5. 基于netty的微服务架构
  6. ABAP的自学之路 ,初步认识ABAP 一
  7. http协议--笔记
  8. 零拷贝概念 -- linux内核
  9. CSS hack:区分IE6 IE7 Firefox
  10. Asp组件中级入门与精通系列之五