快速打造一个MINI自动发布系统

前情提要:因为项目特点,需要在自己的服务器上集成测试,而不是用github的DevOpt体系;再有就是服务器是windows的;项目仓库在github上;并且项目是asp.net core的项目;开发人员一枚。以前的做法就是发布后,把执行码复制在服务器上启动;后来就是在服务器写了个bat,运行bat,完成clone项目,发布项目,运行项项目;再后台就是写了个web服务,让github项目感知到推送后,通知web服务,web服务执行这个bat。

在这里面,有几个要素:

  • bat:完成代码clone,发布,运行(其实真实中还要完成对运行的项目进行关闭,清理等工作,以方便展开最新一次的clone,发布,运行)

  • web服务

  • github通知配置

先看bat,命令如下,就是关闭运行中的项目,清理目录,clone项目,进入项目目录,发布项目,然后运行项目

taskkill /f /im 项目名称.exe
timeout 1 >NUL
@RD /S /Q "C:\项目名称\项目目录"
cd  C:\项目名称
git clone https://用户名:密码@github.com/用户名/项目名称.git
cd  C:\项目名称\项目目录
dotnet publish -o C:\项目名称\pub
timeout 1>NUL
cd C:\项目名称\pub
项目名称.exe

再看一下web服务,就是等待github通知,收到通知后,获取key参数,然后验证这个调用通知是否有效(最好和https),再调用bat

appsettings.json

projects的配置目的是实现一个web服务,可以接收多个项目的通知,然后针对不对的项目进行发布和运行,当github通知的时间,会在参数key中告诉web服务要执行那个project,这里与web服务的key参数结合使用。

{"urls": "http://*:6789","Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","Projects": [{"key": "memall","BATPath": "C://MeMall/MeMall_Start.bat","Secret": "e0f0d18348fbcb090fa17f9fbc638a8be56be3ab"}]
}

homecontrolloer.cs文件

其中IsGitHubSignatureSHA1和 IsGitHubSignatureSHA256是两种验证方式,可以选其中的一种进行验证就可以,验证成功才能执行bat,这里同时用两种验证方式,只是为了演示而以。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Primitives;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;namespace GitHubNotice.Controllers
{[ApiController][Route("[controller]")]public class HomeController : ControllerBase{private readonly IEnumerable<Project> _projects;private readonly ILogger<HomeController> _logger;public HomeController(ILogger<HomeController> logger, IConfiguration configuration){_projects = configuration.GetSection("Projects").Get<List<Project>>();_logger = logger;}[HttpPost("/")]public async Task<IActionResult> Notice(){_logger.LogInformation($"应用收到github Notice");     Request.Headers.TryGetValue("X-GitHub-Delivery", out StringValues gitHubDeliveryId);Request.Headers.TryGetValue("X-GitHub-Event", out StringValues gitHubEvent);_logger.LogInformation($"收到github通知事务:X-GitHub-Delivery:{gitHubDeliveryId},X-GitHub-Event:{gitHubEvent}");Request.Headers.TryGetValue("X-Hub-Signature", out StringValues gitHubSignature);Request.Headers.TryGetValue("X-Hub-Signature-256", out StringValues gitHubSignature256);var reader = new StreamReader(Request.Body, Encoding.UTF8);var bodyContent = await reader.ReadToEndAsync();var key = GetMark(bodyContent);var rgx = new Regex(@"^[a-zA-Z]+$");if (!string.IsNullOrWhiteSpace(key) && !rgx.IsMatch(key)){_logger.LogError($"key={key} 错误");return BadRequest();}else{var project = _projects.SingleOrDefault(s => s.Key == key);if (project != null){var resultSHA256 = IsGitHubSignatureSHA256(project.Secret, bodyContent, gitHubSignature256);var resultSHA1 = IsGitHubSignatureSHA1(project.Secret, bodyContent, gitHubSignature);_logger.LogInformation($"SHA1={resultSHA1},SHA256={resultSHA256}");if (resultSHA1 && resultSHA256){var p = new Process();p.StartInfo.CreateNoWindow = true;p.StartInfo.UseShellExecute = true;p.StartInfo.FileName = project.BATPath;p.Start();p.Close();_logger.LogInformation($"github通知成功");return Ok();}else{_logger.LogError("认证错误");return Unauthorized();}}else{_logger.LogError($"检查配置文件Projects是否与github中的Payload URL相匹配");return BadRequest();}}}/// <summary>/// 获取匹配项目的key/// </summary>/// <param name="text"></param>/// <returns></returns>string GetMark(string text){var arry = text.Split('&');foreach (var item in arry){if (item.Contains("key=")){return item.Split('=')[1];}}return "";}/// <summary>/// sha1/// </summary>/// <param name="seckey"></param>/// <param name="bodyContent"></param>/// <param name="signatureSHA1"></param>/// <returns></returns>static bool IsGitHubSignatureSHA1(string seckey, string bodyContent, string signatureSHA1){if (string.IsNullOrWhiteSpace(bodyContent))throw new ArgumentNullException(nameof(bodyContent));if (string.IsNullOrWhiteSpace(signatureSHA1))throw new ArgumentNullException(nameof(signatureSHA1));var signature = signatureSHA1.Replace("sha1=", "");var secret = Encoding.ASCII.GetBytes(seckey);var payloadBytes = Encoding.ASCII.GetBytes(bodyContent);using (var hmacsha1 = new HMACSHA1(secret)){var hash = hmacsha1.ComputeHash(payloadBytes);var hashString = ToHexString(hash);if (hashString.Equals(signature))return true;}return false;static string ToHexString(byte[] bytes){var builder = new StringBuilder(bytes.Length * 2);foreach (byte b in bytes){builder.AppendFormat("{0:x2}", b);}return builder.ToString();}}/// <summary>/// X-Hub-Signature-256/// </summary>/// <param name="secret"></param>/// <param name="bodyContent"></param>/// <param name="signatureSHA256"></param>/// <returns></returns>static bool IsGitHubSignatureSHA256(string secret, string bodyContent, string signatureSHA256){if (string.IsNullOrWhiteSpace(bodyContent))throw new ArgumentNullException(nameof(bodyContent));if (string.IsNullOrWhiteSpace(signatureSHA256))throw new ArgumentNullException(nameof(signatureSHA256));var secretBytes = Encoding.UTF8.GetBytes(secret);var hasher = new HMACSHA256(secretBytes);var data = Encoding.UTF8.GetBytes(bodyContent);var computedSignature = BitConverter.ToString(hasher.ComputeHash(data)).Replace("-", "").ToLower();return computedSignature == signatureSHA256.Replace("sha256=", "");}}/// <summary>/// 项目实体/// </summary>public class Project{public string Key { get; set; }public string BATPath { get; set; }public string Secret { get; set; }}
}

最后就是github的Webhooks,通过配置,当有人推送代码时,会通知web服务,方便进行拉取构建。

其实这就是一个极其简单,代替手工发布的脚本级别工具,特点就是小巧,灵活,简单,可以随心所欲的改;如果是大团队,或更多的要求,比如集成测试,打包镜像等,可以选用比较成熟的产品(可以搜索CICD工具,这里不作广告了)来使用,相对来说也需要学习成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

话里话外:ERP与PDM、MES的关系区别是什么

博主推荐延展咨询资深顾问梁云文章 ERP、PDM、MES这几个名词既会以独立的管理理念存在&#xff0c;也会在不同的管理软件中存在&#xff0c;而管理理念和管理软件是不同的。本文将抛开软件本身&#xff0c;从管理理念和原理的角度入手&#xff0c;分析上述三个概念之间的关系。…

考试必错规则:如果你觉得题目很简单,代表你肯定错了

全世界有3.14 % 的人已经关注了数据与算法之美1曾经的考试生涯以前考试的时候&#xff0c;老师经过我旁边我都会盖住答案&#xff0c;因为害怕老师看到我那些愚蠢的答案……&#xff08;via屌絲打分蜻蜓隊長&#xff09;2当我中学第一次进入KTV时&#xff0c;我就知道我注定属于…

aspnetcore 应用 接入Keycloak快速上手指南

登录及身份认证是现代web应用最基本的功能之一&#xff0c;对于企业内部的系统&#xff0c;多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理&#xff0c;提升用户同时使用多个系统的体验&#xff0c;Keycloak正是为此种场景而生。本文将简明的介绍Keyc…

隐藏在数学中的哲理,令人回味无穷

全世界有3.14 % 的人已经关注了数据与算法之美人们在欣赏优美的数、式和数学图形时&#xff0c;将其与现实生活联系&#xff0c;引入到人们的精神世界中&#xff0c;产生丰富的联想和创造&#xff0c;反映出人们崇高的思想境界和要求&#xff0c;因而产生了风格独特、内涵深刻、…

无源的nfc加传感_基于ON Semiconductor SPS无源温度标签,应用于冷链运输的 UHF 标签读取器方案...

冷链&#xff0c;即冷冻冷藏供应链的简称&#xff0c;泛指冷藏冷冻类食品从原材料供应物流、食品工厂内生产物流、贮藏运输物流至贩卖销售物流等&#xff0c;各个环节中始终处于规定的低温环境下&#xff0c;以保证食品质量&#xff0c;减少食品损耗的一项系统工程 。随着科学技…

前端老弟第一次写后端,崩了!

幽默轻松小知识&#xff0c;一起来看看老弟第一次写的后端代码&#xff0c;你觉得如何&#xff1f;大家好&#xff0c;我是鱼皮&#xff0c;今天分享我的老弟第一次写后端代码时出现的囧事&#xff0c;希望大家引以为戒。孽起我的老弟小阿巴&#xff0c;目前大一&#xff0c;自…

Windows Phone 7 系统主题颜色RGB和Hex值

Windows Phone 主题是背景色与个性色的组合。背景色是背景的颜色&#xff0c;个性色是应用于控件和其他可视元素的颜色。有两种背景选项可供使用&#xff08;深色和浅色&#xff09;&#xff0c;另外共有 10 种标准个性色可用于您的应用程序。 下表列出了 10 种标准个性色及其以…

小米8对一加6打开软件速度测试,买一加6还是小米8?小米8和一加6区别对比

买一加6还是小米8&#xff1f;据相关媒体报道&#xff0c;继一加6后&#xff0c;小米前些天也推出了同样搭载骁龙845处理器的最新旗舰——“小米8”。值得一提的是&#xff0c;小米8还被官方称为“8周年的代表之作”&#xff01;那么&#xff0c;一加6和小米8哪个更好一些&…

面试算法工程师时,我居然被化学专业转行的老哥血虐了

全世界有3.14 % 的人已经关注了数据与算法之美我是小A&#xff0c;一个没能当成算法工程师的菜鸡Java工程师&#xff0c;内心却等着上AI这趟车。去年正是人工智能火热的时候&#xff0c;看着各种高薪招聘&#xff0c;我沉寂很久的内心也火热起来了。但是想归想&#xff0c;我内…

编写一个程序,将一串字符倒序存放后输出。

源代码&#xff1a; 1 #include<iostream>2 using namespace std;3 int main()4 {5 char *p;int i,n;6 cout<<"请输入字符串的长度n";cin>>n;7 pnew char[n];8 for(i0;i<n;i)9 cin>>p[i]; 10 for(i0;i<n/…

超好看的科学科普书,孩子大人都可以看!

科学就是高不可攀的吗&#xff1f;科学探究就是神秘而枯燥的吗&#xff1f;科学教育就是“板着面孔”的吗&#xff1f;才不是呢&#xff01;小木认为科学研究是一个充满快乐的过程。而且&#xff0c;科学是无处不在的&#xff0c;日常生活中的点点滴滴也蕴含着科学原理。小木关…

WPF 制作便携小空调

今天看到群里一个小页面挺有意思的&#xff0c;就是这个&#xff1a;https://ac.yunyoujun.cn/于是想着用wpf也模仿一下嘿嘿&#xff0c;为了方便&#xff0c;也顾不上什么代码结构了。。。看看效果吧&#xff1a;代码不多&#xff0c;只有一个窗口&#xff0c;下面就直接看看代…

ML.NET 示例:将ML.NET模型导出到ONNX

在这个示例中&#xff0c;您将看到如何使用ML.NET来训练回归模型&#xff0c;然后将该模型转换为ONNX格式。问题开放式神经网络交换即ONNX是一种表示深度学习模型的开放格式。使用ONNX&#xff0c;开发人员可以在最先进的工具之间移动模型&#xff0c;并选择最适合他们的组合。…

别写代码了!行吗?

全世界有3.14 % 的人已经关注了数据与算法之美01刚才等红绿灯的时候&#xff0c;天开始下雨了。这时候旁边的程序员首先开口说&#xff1a;“下雨了。”大概过了5秒钟&#xff0c;其他人&#xff1a;对哦&#xff0c;有点下雨了。其实&#xff0c;这说的是程序员头秃的故事。02…

dma接收双缓存 stm32_「STM32学习笔记」USART 新特性

之前的学习笔记“SPI不够用&#xff1f;USART来帮忙”一文中介绍了用如何把USART当做SPI来用的方法。此外&#xff0c;ST的USART还有很多新特性&#xff0c;没准有你不知道的。在此&#xff0c;我们整理出来以下串口新特性&#xff0c;供大家参考。支持RXD和TXD管脚互换很多时候…

为什么数学叫“数学”?

全世界有3.14 % 的人已经关注了数据与算法之美“数学”一词是来自希腊语&#xff0c;它意味着某种“已学会或被理解的东西”或“已获得的知识”&#xff0c;甚至意味着“可获的东西”&#xff1b;“可学会的东西”&#xff0c;即“通过学习可获得的知识”&#xff0c;数学名称的…

5月TIOBE编程榜,Java、PHP降级,C#再度上升!

TIOBE 5月编程语言榜单显示&#xff0c;Java数据下滑&#xff0c;排名降级了一位&#xff0c;被Python超越&#xff1b;PHP继续大幅下滑&#xff0c;排名降级到第9&#xff1b;而C#则是再度稳中求进&#xff0c;已经连续N个月上涨了。曾经Web开发三大语言&#xff0c;在2020年后…

捷达vs7测试_捷达VS7——品质硬核!

立冬&#xff0c;准备好“冬眠”了吗&#xff1f;一汽大众的子品牌-捷达(Jetta)在去年9月推出VS5和VA3之后&#xff0c;新型SUV&#xff0c;捷达VS7车型已在国内正式开始预售。这款新车基于大众MQB平台构建&#xff0c;将推出4款车型供消费者选择&#xff0c;定位为紧凑型SUV。…

一句 Task.Result 就死锁, 这代码还怎么写?

一&#xff1a;背景 1. 讲故事前些天把 .NET 高级调试 方面的文章索引到 https://github.com/ctripxchuang/dotnetfly 的过程中&#xff0c;发现了一个有意思的评论&#xff0c;截图如下&#xff1a;大概就是说在 Winform 的主线程下执行 Task.Result 会造成死锁&#xff0c;我…

ant 改变表格数据_表格技巧—Excel表格怎么替换数字

在编制报表时&#xff0c;如果把序列号中的某些数字改变&#xff0c;一个个更正&#xff0c;肯定是比重新录一遍还要慢的&#xff0c;如果只是想替换其中的数字&#xff0c;其实可以利用Excel表格自带的查找替换功能&#xff0c;一步到位解决。接下来小编教大家怎么样将一大批的…