日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2023/12/4 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速打造一个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工具,這里不作廣告了)來使用,相對來說也需要學習成本。

總結

以上是生活随笔為你收集整理的快速打造一个MINI自动发布系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。