AntDeploy

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

发布功能支持:

  • docker容器一键部署
  • docker镜像一键发布
  • 支持iis一键部署
  • windows服务一键部署
  • linux服务一键部署
  • 支持增量发布
  • 支持一键回滚
  • 支持点火
  • 支持选择特定文件发布
  • 支持查看发布记录

一个issue

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

他是用asp5.0开发了一个web程序,然后用AntDeploy来部署,

由于AntDeploy部署时读取服务的安装路径,然后进行更新。

但是针对nssm部署的服务有一个特点,执行路径是nssm.exe,如下图:

那么AntDeploy在更新部署的时候会更新到nssm.exe所在的目录了。

解决思路

nssm是一个开源c语言写的软件,大概只有300kb,可以很方便的把程序安装成一个windows服务。

nssm就像是一个服务管理器,windows服务启动的时候 会调用nssm.exe传入serviceName、然后nssm.exe会根据serviceName拿到配置的实际要运行的文件。

查了下nssm官网

可以根据命令

nssm get <serviceName> Application

获取实际要执行的程序地址

那么要想要兼容第一次是由nssm.exe部署,后面用AntDeploy发布的场景,则需要

    1. 根据调用nssm的命令拿到真实路径
    1. 根据真实路径进行部署

既然是开源软件,就让这位仁兄来帮我写这部分代码吧

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

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

扩展nssm发布windows功能

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

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

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

好处有:

一般按照微软开发winfows服务的标准的话 是需要引入包:Microsoft.Extensions.Hosting.WindowsServices

但是用nssm可以不需要引入。

所以在netcore开发web的场景使用nssm安装为windows服务很方便

而且使用nssm安装的另外一个优点是可以指定启动参数? 比如 --urls=http://*:10007

开始开发

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

2. ageng端增加 nssm

在windows场景下才 作为内嵌资源。针对linux场景不需要。

在启动的时候释放出来:


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测试

完整的运行效果是:

服务部署成功

访问成功

成功物

插件最新版: v7.32

agent最新版:v6.9

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

交流QQ群:488312978

netcore一键nssm发布为windows服务的更多相关文章

  1. Asp.NetCore 3.1demo发布使用Windows服务

    Core之Windows服务 使用测试之前,先来简单了解一下 window自带的sc命令 ========install.bat set serviceName=你的服务名称 set serviceF ...

  2. 用JavaServiceWrapper将JAVA程序发布成Windows服务

    怎么把jar文件做成系统服务,比较多的解决方案是使用 wrapper-windows 这个软件包.这个软件包的强大之处是能把jre环境也给打进去,这个服务可以正常运行在根本没有jre环境即就没有安装J ...

  3. windows下zookeeper安装并发布成windows服务

    https://blog.csdn.net/yzy199391/article/details/80605195

  4. AntDeploy一键发布netcore3.0Windows服务到远程服务器

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

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

    Windows服务是非常强大的应用程序,可用于在backgorund中执行许多不同类型的任务.他们可以在不需要任何用户登录的情况下启动,并且可以使用除登录用户之外的其他用户帐户运行.但是,如果通过遵循 ...

  6. netcore项目在Windows部署:使用NSSM部署Windows服务

    NSSM部署Windows服务 1 准备工作 在Windows平台部署Asp.net core应用程序一般采用IIS,但是如果我们的net core应用执行的是定时任务,需要开机自启,稳定运行的话,使 ...

  7. dotnet-warp && NSSM 部署 .net core 项目到 windows 服务

    如果你想将 .net core 项目以服务的形式部署到 windows 系统,希望本篇文章能够让你少走弯路 dotnet-warp 安装使用 dotnet-warp 是一个全局的.NET Core 工 ...

  8. 使用NSSM把.Net Core部署至 Windows 服务

    为什么部署至Windows Services 在很多情况下,很少会把.Net Core项目部署至Windows服务中,特别是Asp.net Core就更少了.一般情况下,Asp.net Core会部署 ...

  9. NSSM把.Net Core部署至 Windows 服务

    NSSM把.Net Core部署至 Windows 服务 https://www.cnblogs.com/emrys5/p/nssm-netcore.html 为什么部署至Windows Servic ...

随机推荐

  1. MySQL:数据库优化,看这篇就够了

    数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷. 1. 优化一览 ...

  2. 十亿级流量下,我与Redis时延小突刺的战斗史

    一.背景 某一日收到上游调用方的反馈,提供的某一个Dubbo接口,每天在固定的时间点被短时间熔断,抛出的异常信息为提供方dubbo线程池被耗尽.当前dubbo接口日请求量18亿次,报错请求94W/天, ...

  3. Visual Studio 2019 v16.10 和 v16.11 Preview 1 现已推出!

    Visual Studio 2019 v16.10有什么新功能? 我们很高兴地宣布Visual Studio 2019 v16.10 GA 和 v16.11 preview 1发布.此版本使我们的主题 ...

  4. Hive和Spark分区策略

    1.概述 离线数据处理生态系统包含许多关键任务,最大限度的提高数据管道基础设施的稳定性和效率是至关重要的.这边博客将分享Hive和Spark分区的各种策略,以最大限度的提高数据工程生态系统的稳定性和效 ...

  5. NXNSAttack漏洞简析

    漏洞简介: 该漏洞为DNS 放大攻击,是 DDoS 攻击,攻击者利用 DNS 服务器中的漏洞将小查询转换为可能破坏目标服务器的更大负载. 在 NXNSAttack 的情况下,远程攻击者可以通过向易受攻 ...

  6. 高性能的Redis之对象底层实现原理详解

    对象 在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合, 等等. Redis 并没有直接使用这些数据结构来实 ...

  7. Linux-ansible批量管理

    1.ansible批量管理服务概念 (1)是基于Python语言开发的自动化软件工具 (2)是基于SSH远程管理服务实现远程主机批量管理 2.ansible批量管理服务意义 (1)提高工作的效率 (2 ...

  8. solidity基础知识

    1.solidity是一种语法类似JavaScript的高级语言,它被设计成以编译的方式生成以太坊虚拟机代码.在后续的内容中你将会发现,使用它很容易创建用于投票.众筹.封闭拍卖.多重签名钱包等等的合约 ...

  9. JVM到底是什么呢

    在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.那JVM到底是什么呢? JVM是Java程序的运行环境,它同时也是一个操作系统的一个应用程序.一个进程,因此他也有他自己的运行生命周期, ...

  10. python导入模块--案例

    1 导入模块 1.1 问题 本案例要求先编写一个star模块,主要要求如下: 建立工作目录 ~/bin/ 创建模块文件 ~/bin/star.py 模块中创建pstar函数,实现打印50个星号的功能 ...