国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于DotNetty實現(xiàn)自動發(fā)布 - 實現(xiàn)一鍵打包發(fā)布

這篇具有很好參考價值的文章主要介紹了基于DotNetty實現(xiàn)自動發(fā)布 - 實現(xiàn)一鍵打包發(fā)布。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

上一篇,我只實現(xiàn)了一鍵檢測代碼變化,本篇才是真正的實現(xiàn)了一鍵打包發(fā)布

效果圖

基于DotNetty實現(xiàn)自動發(fā)布 - 實現(xiàn)一鍵打包發(fā)布
基于DotNetty實現(xiàn)自動發(fā)布 - 實現(xiàn)一鍵打包發(fā)布
基于DotNetty實現(xiàn)自動發(fā)布 - 實現(xiàn)一鍵打包發(fā)布

客戶端打包待發(fā)布文件

    /// <summary>
    /// 把多個文件添加到壓縮包 (保留文件夾層級關系)
    /// </summary>
    public static async Task<ZipFileResult> CreateZipAsync(IEnumerable<ZipFileInfo> zipFileInfo)
    {
        return await Task.Run(() =>
        {
            var zipDir = EnsureZipDirCreated();
            var zipFileName = $"{DateTime.Now:yyyyMMdd_HHmmss_}{Guid.NewGuid()}.zip";
            var zipPath = Path.Combine(zipDir, zipFileName);
            using var archive = ZipFile.Open(zipPath, ZipArchiveMode.Update);
            foreach (var item in zipFileInfo)
            {
                archive.CreateEntryFromFile(item.FileAbsolutePath, item.FileRelativePath, CompressionLevel.SmallestSize);
            }
            return new ZipFileResult() { FullFileName = zipPath, FileName = zipFileName };
        });
    }

客戶端封裝 NettyMessage

            //讀取zip字節(jié)數(shù)組,填充到 NettyMessage 的 Body
            var body = await File.ReadAllBytesAsync(zipResult.FullFileName);

            //NettyHeader
            var header = new DeployRequestHeader()
            {
                Files = PublishFiles,
                SolutionName = SolutionName,
                ProjectName = webProject!.ProjectName,
                ZipFileName = zipResult.FileName,
            };

            var nettyMessage = new NettyMessage { Header = header, Body = body };

            //創(chuàng)建 NettyClient
            Logger.Info("開始發(fā)送");
            using var nettyClient = new NettyClient(webProject.ServerIp, webProject.ServerPort);
            await nettyClient.SendAsync(nettyMessage);
            Logger.Info("完成發(fā)送");

            Growl.SuccessGlobal($"發(fā)布成功");

            //保存發(fā)布記錄
            await solutionRepo.SaveFirstPublishAsync(SolutionId, SolutionName, lastGitCommit!.Sha);
            Growl.SuccessGlobal($"操作成功");

            quickDeployDialog?.Close();

NettyHeader 設計

具體實現(xiàn)是 DeployRequestHeader, 繼承自 NettyHeader, 保存待發(fā)布文件集合,項目名稱,解決方案名稱, zip 文件名稱等

/// <summary>
/// 發(fā)布請求頭部
/// </summary>
public class DeployRequestHeader : NettyHeader
{
    public DeployRequestHeader() : base("Deploy/Run") { }
    public List<DeployFileInfo> Files { get; set; } = [];
    public string ProjectName { get; set; } = string.Empty;
    public string SolutionName { get; set; } = string.Empty;
    public string ZipFileName { get; set; } = string.Empty;
}

服務端處理

  • 解壓 zip
  • 備份目標文件(存在才備份)
  • 替換目標文件(不存在則新建)
/// <summary>
/// 執(zhí)行服務端發(fā)布
/// </summary>
/// <param name="model"></param>
public void Run(DeployRequestHeader model)
{
    Logger.Warn($"收到客戶端的消息: {model.ToJsonString(true)}");

    var configs = NettyServer.AppHost.Services.GetRequiredService<IOptions<List<ProjectConfig>>>();
    var projectConfig = configs.Value.FirstOrDefault(a => a.ProjectName == model.ProjectName);
    if (projectConfig == null)
    {
        Logger.Error("請現(xiàn)在服務器項目的appsettings.json中配置項目信息");
        return;
    }

    var zipBytes = Request.Body;
    if (zipBytes == null || zipBytes.Length == 0)
    {
        Logger.Error("ZipBytes為空");
        return;
    }

    var zipFileName = model.ZipFileName;
    if (string.IsNullOrEmpty(zipFileName))
    {
        Logger.Error("ZipFileName為空");
        return;
    }

    //解壓
    var zipDir = ZipHelper.UnZip(zipBytes, zipFileName);

    Logger.Info($"解壓成功: {zipDir}");

    //備份并覆蓋舊文件
    DoPublish(model.Files, zipDir, zipFileName, projectConfig);

    Logger.Info($"發(fā)布成功: {zipDir}");
}
/// <summary>
/// 備份并覆蓋舊文件
/// </summary>
private static void DoPublish(List<DeployFileInfo> files, string zipDir, string zipFileName, ProjectConfig projectConfig)
{
    try
    {
        //先創(chuàng)建備份文件夾
        var backupDir = EnsureBackupDirCreated(zipFileName);

        //遍歷每個待發(fā)布的文件,依次先備份再替換
        foreach (DeployFileInfo file in files)
        {
            //文件相對路徑(相對于待發(fā)布的項目根目錄,也是相對于解壓后的根目錄)
            var relativeFilePath = file.PublishFileRelativePath;

            //源文件路徑(解壓后的文件路徑)
            var sourceFileName = Path.Combine(zipDir, relativeFilePath);

            //待發(fā)布的文件路徑 (服務器真實文件路徑)
            var destFileName = Path.Combine(projectConfig.ProjectDir, relativeFilePath);

            //服務器已存在此文件,先執(zhí)行備份
            if (File.Exists(destFileName))
            {
                //備份文件路徑
                var backupFileName = Path.Combine(backupDir, relativeFilePath);
                //確保創(chuàng)建備份文件夾
                var backupFileDir = Path.GetDirectoryName(backupFileName);
                if (!Directory.Exists(backupFileDir))
                {
                    Directory.CreateDirectory(backupFileDir!);
                }
                File.Copy(destFileName, backupFileName);
            }
            else
            {
                //服務器不存在此文件,先創(chuàng)建文件夾層級(比如你新加了一個頁面demo.aspx,需要發(fā)布到服務器對應的位置)
                var destFileDir = Path.GetDirectoryName(destFileName);
                if (!Directory.Exists(destFileDir))
                {
                    Directory.CreateDirectory(destFileDir!);
                }
            }

            //替換服務器文件
            File.Copy(sourceFileName, destFileName, true);
        }
    }
    catch (Exception ex)
    {
        Logger.Error(ex.ToString());
    }
}

總結

至此,我已經(jīng)完成了自動發(fā)布項目的主體功能,實現(xiàn)自動檢測代碼變化,自動一鍵打包發(fā)布, 不足的地方有: 第一次發(fā)布需要手動處理, 項目也需要手動編譯,并配置輸出目錄,但是我相信,這些都不是問題,只要有思路,都是可以解決的,我主要分享下我的實現(xiàn)步驟

注意

1. 本項目目前只支持 .net framework 的單體 Web 項目
2. 客戶端和服務端均是 Windows 服務器
3. 線上項目是 IIS 部署的
4. 代碼可能存在 BUG,大家發(fā)現(xiàn)可以自行解決,或者聯(lián)系我,我后面不準備繼續(xù)維護這個項目,畢竟主要是學習分享用的~~~

代碼倉庫

項目暫且就叫 OpenDeploy

  • OpenDeploy: https://gitee.com/broadm-dotnet/OpenDeploy

歡迎大家拍磚,Star

下一步

服務端目前是控制臺實現(xiàn), 可以部署為 Windows 服務, 這個也很簡單, 我就不發(fā)了, 大家自行實現(xiàn)吧, 完結~文章來源地址http://www.zghlxwxcb.cn/news/detail-750464.html

到了這里,關于基于DotNetty實現(xiàn)自動發(fā)布 - 實現(xiàn)一鍵打包發(fā)布的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Jenkins的環(huán)境部署,(打包、發(fā)布、部署、自動化測試)

    Jenkins的環(huán)境部署,(打包、發(fā)布、部署、自動化測試)

    一、Tomcat環(huán)境安裝 1.安裝JDK(Java環(huán)境) JDK下載地址:Java Downloads | Oracle 安裝好后在系統(tǒng)環(huán)境變量里配置環(huán)境變量: ①添加JAVA_HOME 變量名:JAVA_HOME 變量值:C:Program FilesJavajdk1.8.0_181(根據(jù)自己的實際路徑配置) ②添加CLASSPATH 變量名:CLASSPATH 變量值:.;%JAVA_HOME%libdt.jar;%J

    2024年01月18日
    瀏覽(30)
  • android 實現(xiàn)本地一鍵打包,告別繁瑣的studio操作

    android 實現(xiàn)本地一鍵打包,告別繁瑣的studio操作

    在實際開發(fā)項目中,我們的工程目錄往往是多個app在一個工程下的,每次打包都需要手動的用studio點擊Build-Generate Signed Bundle or APK-APK 選擇app,簽名等,甚至有的app簽名還不一樣,還需要手動的來回切換,非常麻煩。所以,我就考慮采用多渠道打包+shell腳本的方式,來實現(xiàn)一行

    2024年02月10日
    瀏覽(28)
  • java實現(xiàn)微信公眾號圖文、視頻一鍵發(fā)布

    在微信開發(fā)平臺申請一個測試賬號(優(yōu)先選擇這個),如果可以使用認證過的訂閱號最好,不過我們在開發(fā)階段很多功能都是測試用的,申請一個測試賬號完全夠用 個人的訂閱號是不可以申請認證的,所以很多微信API不可以用 二、開始開發(fā) 寫在前面 項目所需依賴 所有涉及

    2024年02月15日
    瀏覽(18)
  • Jenkins自動構建打包發(fā)布vue項目報錯Error: error:0308010C:digital envelope routines::unsupported

    錯誤日志: 原因: 新版本node.js使用了OpenSSL3.0對允許算法和密鑰大小增加了嚴格的限制。 解決辦法: Windows: Linux:

    2024年02月17日
    瀏覽(25)
  • Filebeat 自動安裝部署&一鍵配置實現(xiàn)

    Filebeat 自動安裝部署&一鍵配置實現(xiàn)

    Filebeat 是使用 Golang 實現(xiàn)的輕量型日志采集器,也是 Elasticsearch stack 里面的一員。 Filebeat本質上是一個 agent ,可以安裝在各個節(jié)點上,根據(jù)配置讀取對應位置的日志,并上報到相應的日志管理平臺上去 平時接到將某一服務的日志接入到日志管理平臺的需求 通常的做法都是:

    2023年04月08日
    瀏覽(22)
  • Unity 基于Jenkins自動化打包流程

    Unity 基于Jenkins自動化打包流程

    什么是Jenkins? ????????Jenkins是一款開源 CICD 軟件,用于自動化各種任務,包括構建、測試和部署軟件。Jenkins 支持各種運行方式,可通過系統(tǒng)包、Docker 或者通過一個獨立的 Java 程序。 Jenkins的下載與安卓 直接搜索jenkins進入官網(wǎng)下在LTS(穩(wěn)定版本)下載地址:https://www.jen

    2024年02月08日
    瀏覽(53)
  • 基于Jenkins自動打包并部署Tomcat環(huán)境

    基于Jenkins自動打包并部署Tomcat環(huán)境

    目錄 1、配置git主機 2、配置jenkins主機 3、配置web主機 4、新建Maven項目 5、驗證 Jenkins 自動打包部署結果 Jenkins 的工作原理是先將源代碼從 SVN/Git 版本控制系統(tǒng)中拷貝一份到本地,然后根據(jù)設置的腳本調用Maven進行 build(構建)。整個系統(tǒng)的關鍵就是 build 腳本,build 腳本告訴

    2024年02月11日
    瀏覽(30)
  • 基于Jenkins自動打包并部署docker環(huán)境

    基于Jenkins自動打包并部署docker環(huán)境

    目錄 1、安裝docker-ce 2、阿里云鏡像加速器 3、構建tomcat 基礎鏡像? 4、構建一個Maven項目 實驗環(huán)境 操作系統(tǒng) IP地址 主機名 角色 CentOS 7.5 192.168.200.111 git git服務器 CentOS 7.5 192.168.200.112 Jenkins?git客戶端 jenkins服務器 CentOS 7.5 192.168.200.113 docker web服務器 在192.168.200.113上創(chuàng)建遠程目錄

    2024年02月11日
    瀏覽(34)
  • SpringBoot+Vue前后端分離項目在Linux系統(tǒng)中基于Docker打包發(fā)布,并上傳鏡像到阿里鏡像私倉

    SpringBoot+Vue前后端分離項目在Linux系統(tǒng)中基于Docker打包發(fā)布,并上傳鏡像到阿里鏡像私倉

    將打好的jar包放到咱們opt目錄下的自定義文件夾內(nèi) 打包成功后 –rm 代表退出之后,容器移動刪除 可以看到成功啟動了服務 阿里云免費私倉 創(chuàng)建好自己的鏡像倉庫后會顯示操作指南 身份登錄 將鏡像推送到Registry 可以在鏡像倉庫中進行查看 拉取鏡像 default.conf 1.root:設置靜態(tài)

    2024年04月17日
    瀏覽(41)
  • Jenkins+Docker 實現(xiàn)一鍵自動化部署項目

    Jenkins+Docker 實現(xiàn)一鍵自動化部署項目

    1.安裝Jenkins 注:因為Jenkins容器里的用戶是Jenkins,而主機用戶不是Jenkins,就算是root也一樣會報錯:/var/jenkins_home/copy_reference_file.log: Permission denied,這個時候就需要在主機上面給主機地址賦予訪問Jenkins容器的權限,Jenkins內(nèi)部用的是uid 1000的user。 -privileged=true讓容器具有root權限

    2024年02月16日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包