37.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--擴展功能--增加Github Action

在第二部分(微服務基礎工具與技術)中我們講解了GitHub Action的相關知識,那么在這一節中,我們將為已有的微服務增加GitHub Action的支持。

一、什么是GitHub Action

雖然前面已經介紹過GitHub Action的相關知識,但這里還是簡單回顧一下。GitHub Action是GitHub提供的一種持續集成和持續交付(CI/CD)服務,允許開發者在代碼庫中定義自動化工作流,以便在特定事件發生時自動執行任務。通過GitHub Action,開發者可以實現代碼的自動構建、測試、部署等操作,從而提高開發效率和代碼質量。

GitHub Action的工作流是由一系列的步驟(steps)組成的,每個步驟可以執行一個或多個操作(actions)。這些操作可以是預定義的,也可以是自定義的腳本。工作流可以在代碼提交、拉取請求、定時任務等多種事件觸發下運行。

GitHub Action的主要優勢包括:

  • 自動化:可以自動執行重復性任務,減少手動操作。
  • 集成:與GitHub緊密集成,可以直接在代碼庫中管理工作流。
  • 可擴展性:支持自定義操作,可以根據項目需求擴展功能。
  • 社區支持:有大量的預定義操作可供使用,可以快速集成常用功能。
  • 可視化:提供了直觀的界面來查看工作流的執行狀態和日志。

GitHub Action的工作流文件通常存儲在代碼庫的.github/workflows目錄下,文件格式為YAML。每個工作流可以定義觸發條件、執行步驟、環境變量等。

二、創建 Dockerfile

我們依然以SP.ConfigService配置服務為例,創建一個Dockerfile文件。這個文件將定義如何構建配置服務的Docker鏡像。

# 使用官方.NET 8.0 SDK鏡像作為構建階段
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src# 復制項目文件
COPY ["SP.ConfigService/SP.ConfigService.csproj", "SP.ConfigService/"]
COPY ["SP.Common/SP.Common.csproj", "SP.Common/"]# 還原NuGet包
RUN dotnet restore "SP.ConfigService/SP.ConfigService.csproj"# 復制所有源代碼
COPY . .# 構建應用程序
WORKDIR "/src/SP.ConfigService"
RUN dotnet build "SP.ConfigService.csproj" -c Release -o /app/build# 發布應用程序
FROM build AS publish
RUN dotnet publish "SP.ConfigService.csproj" -c Release -o /app/publish /p:UseAppHost=false# 使用官方.NET 8.0運行時鏡像作為最終階段
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
WORKDIR /app# 安裝必要的系統包(如果需要)
RUN apt-get update && apt-get install -y \curl \&& rm -rf /var/lib/apt/lists/*# 創建非root用戶
RUN groupadd -r appuser && useradd -r -g appuser appuser# 復制發布的應用程序
COPY --from=publish /app/publish .# 設置文件權限
RUN chown -R appuser:appuser /app
USER appuser# 暴露端口
EXPOSE 80
EXPOSE 443# 設置環境變量
ENV ASPNETCORE_URLS=http://+:80
ENV ASPNETCORE_ENVIRONMENT=Production# 啟動應用程序
ENTRYPOINT ["dotnet", "SP.ConfigService.dll"] 

這個Dockerfile文件完整地描述了從源代碼到可運行鏡像的構建流程。它采用多階段構建,先用官方.NET 8.0 SDK鏡像進行編譯和發布,確保最終鏡像僅包含運行所需內容,從而減小體積并提升安全性。項目文件和依賴會被優先復制和還原,避免無關文件影響構建。隨后將所有源代碼復制到鏡像中,完成編譯和發布,生成可部署的應用程序文件。最終階段使用.NET 8.0 ASP.NET運行時鏡像,僅包含必要的運行環境,進一步優化鏡像體積。為提升安全性,Dockerfile創建了非root用戶appuser并設置了文件權限,降低容器運行時的安全風險。鏡像還暴露了80和443端口,并配置了應用程序的運行環境變量,確保服務能在生產環境下正常運行。最后通過ENTRYPOINT指定應用程序的啟動方式,使容器啟動后自動運行服務。通過這樣的配置,可以實現微服務的標準化部署,為后續集成到GitHub Action自動化流程打下堅實基礎。

在創建完Dockerfile后,我們需要創建.dockerignore文件,以避免將不必要的文件添加到Docker鏡像中。當然,這一步并不是必須的,但我建議大家都這么做,以保持鏡像的整潔和高效。以下是配置服務的.dockerignore文件:

# 構建輸出
bin/
obj/# 用戶特定文件
*.user
*.suo
*.userosscache
*.sln.docstates# 構建結果
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
build/
bld/
[Bb]in/
[Oo]bj/# MSTest測試結果
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*# NuGet包
*.nupkg
# NuGet Symbol包
*.snupkg
# 包文件夾
**/[Pp]ackages/*
# 除了build/,它被NuGet用作緩存
!**/[Pp]ackages/build/# 其他
*.swp
*.*~
project.lock.json
.DS_Store
*.pyc
nupkg/# Visual Studio緩存/選項目錄
.vs/# ReSharper
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user# TeamCity
_TeamCity*# DotCover
*.dotCover# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*# MightyMoose
*.mm.*
AutoTest.Net/# Web workbench (sass)
.sass-cache/# Installshield輸出文件夾
[Ee]xpress/# DocProject是一個文檔生成器
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html# Click-Once目錄
publish/# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
*.pubxml
*.publishproj# Microsoft Azure Web App發布設置
PublishScripts/# NuGet包
*.nupkg
# NuGet Symbol包
*.snupkg
# 包文件夾
**/[Pp]ackages/*
# 除了build/,它被NuGet用作緩存
!**/[Pp]ackages/build/# Windows Azure Build Output
csx/
*.build.csdef# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload# Visual Studio緩存文件
# 文件以.vs結尾
.vs/# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs# 包含敏感信息的文件
*.pfx
*.key# 由于構建過程,忽略用戶特定文件
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates# 用戶特定文件(MonoDevelop/Xamarin Studio)
*.userprefs# Mono自動生成的文件
mono_crash.*# Windows圖像緩存文件
Thumbs.db
ehthumbs.db# 文件夾配置文件
[Dd]esktop.ini# 回收站
$RECYCLE.BIN/# Windows Installer文件
*.cab
*.msi
*.msix
*.msm
*.msp# Windows快捷方式
*.lnk# JetBrains Rider
.idea/
*.sln.iml# 日志文件
*.log# 臨時文件
*.tmp
*.temp# Docker相關
Dockerfile*
docker-compose*
.dockerignore# Git相關
.git/
.gitignore# 其他IDE文件
.vscode/
*.code-workspace 

這個.dockerignore文件包含了常見的忽略規則,確保在構建Docker鏡像時不會將不必要的文件添加進去,從而減小鏡像體積并提高構建效率。通過排除如編譯輸出目錄(bin/obj/)、用戶和IDE相關文件(如.vs/.idea/*.user)、日志和臨時文件,以及敏感信息文件(如*.pfx*.key),可以有效避免將無關或敏感內容打包進鏡像。這不僅提升了鏡像的安全性和可維護性,也加快了構建過程,減少了存儲和網絡資源的消耗。建議在每個微服務項目中都維護一個合理的.dockerignore文件,以便持續集成和自動化部署時獲得更好的體驗和結果。

三、創建 GitHub Action

在創建完Dockerfile.dockerignore文件后,我們就可以為配置服務創建GitHub Action工作流文件了。我們將在項目的.github/workflows目錄下創建一個名為deploy-config-service.yml的文件,內容如下:

name: Deploy Config Serviceon:push:branches: [ Microservices ]paths:- 'SP.ConfigService/**'jobs:deploy:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Set up Docker Buildxuses: docker/setup-buildx-action@v2- name: Login to Docker Hubuses: docker/login-action@v2with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}- name: Build and push Docker imageuses: docker/build-push-action@v4with:context: .file: ./SP.ConfigService/Dockerfilepush: truetags: ${{ secrets.DOCKER_USERNAME }}/sp-config-service:latest- name: Deploy to Serveruses: appleboy/ssh-action@masterwith:host: ${{ secrets.SERVER_HOST }}username: ${{ secrets.SERVER_USERNAME }}key: ${{ secrets.SERVER_SSH_KEY }}script: |docker pull ${{ secrets.DOCKER_USERNAME }}/sp-config-service:latestdocker stop sp-config-service || truedocker rm sp-config-service || truedocker run -d --name sp-config-service -p 5101:80 ${{ secrets.DOCKER_USERNAME }}/sp-config-service:latest 

在這個工作流文件中,我們定義了一個名為“Deploy Config Service”的工作流。當代碼推送到Microservices分支且涉及SP.ConfigService目錄下的文件時,工作流將被觸發。工作流包含一個名為“deploy”的作業,運行在最新的Ubuntu環境中。作業步驟首先使用actions/checkout@v3操作簽出代碼庫,然后設置Docker Buildx環境以支持多平臺構建。接下來,通過docker/login-action@v2操作登錄到Docker Hub,使用存儲在GitHub Secrets中的憑據確保安全性。隨后,利用docker/build-push-action@v4操作構建并推送配置服務的Docker鏡像到Docker Hub,指定了上下文和Dockerfile路徑,并打上最新標簽。最后,使用appleboy/ssh-action@master操作通過SSH連接到遠程服務器,拉取最新的Docker鏡像,停止并刪除現有的配置服務容器(如果存在),然后以守護態運行新的配置服務容器,映射端口5101到容器的80端口。通過這種方式,實現了從代碼提交到自動構建、推送和部署的完整CI/CD流程,大大提升了開發和運維效率。

我們在創建的yml文件中看到了一些secrets,主要用于讀取存儲在Github倉庫中的機密信息,這些secrets需要我們在GitHub倉庫中進行配置。

  1. 打開GitHub倉庫,點擊右上角的Settings
  2. 在左側菜單中選擇Secrets and variables,然后點擊Actions
  3. 點擊New repository secret按鈕,添加以下幾個secrets
    • DOCKER_USERNAME:你的Docker Hub用戶名。
    • DOCKER_PASSWORD:你的Docker Hub密碼或訪問令牌。
    • SERVER_HOST:你的服務器IP地址或域名。
    • SERVER_USERNAME:用于SSH連接的服務器用戶名。
    • SERVER_SSH_KEY:用于SSH連接的私鑰內容(確保格式正確)。

在這里插入圖片描述

完成這些配置后,當你將代碼推送到Microservices分支時,GitHub Action將自動觸發,構建并部署配置服務。

四、總結

在本節中,我們為微服務項目添加了GitHub Action支持,創建了Dockerfile和相關的工作流文件,實現了從代碼提交到自動構建、推送和部署的完整CI/CD流程。通過這種方式,我們可以更高效地管理微服務的部署,提高開發和運維效率。你可以根據需要調整工作流文件的內容,例如添加更多的測試步驟、通知步驟等,以滿足項目的具體需求。

在下一節中,我們將繼續擴展微服務的功能,增加更多的服務和功能模塊。通過不斷完善微服務架構,我們將逐步實現一個完整的微服務系統。如果你對GitHub Action或Docker有任何疑問,歡迎在評論區留言,我將盡快回復你。同時,也歡迎大家分享自己的經驗和實踐,共同學習和進步。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92034.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ROS2 通過 命令行 發布速度控制指令 控制 麥克娜姆輪

在 ROS2 中,要通過命令行發布速度控制指令來控制麥克娜姆輪機器人,你需要知道機器人所使用的速度控制話題和消息類型。通常麥克娜姆輪機器人使用geometry_msgs/Twist消息類型來接收速度指令。 以下是通過命令行發布速度控制指令的方法: 首先確…

多層Model更新多層ListView

一、總體架構QML (三層 ListView)└─ C 單例 DataCenter (QQmlContext 注冊)├─ L1Model (一級節點)│ └─ 內部持有 QList<L2Model*>│ └─ L2Model (二級節點)│ └─ 內部持有 QList<L3Model*>│ └─ L3Model (三級節…

Git基礎操作教程

本文目的是掌握Git基礎操作教程一、Git簡介Git&#xff1a;分布式版本控制系統&#xff0c;使用倉庫(Repository)來記錄文件的變化最流行的版本控制系統有兩種&#xff1a;集中式&#xff08;SVN&#xff09;、分布式&#xff08;Git&#xff09;二、Git操作1.創建倉庫倉庫(Rep…

Android 之 Kotlin

變量變量的聲明Kotlin使用var&#xff0c;val來聲明變量&#xff0c;注意&#xff1a;Kotlin不再需要;來結尾var 可變變量&#xff0c;對應java的非final變量var b 1val不可變變量&#xff0c;對應java的final變量val a 1兩種變量并未聲明類型&#xff0c;這是因為Kotlin存在…

Design Compiler:布圖規劃探索(ICC)

相關閱讀 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 簡介 在Design Compiler Graphical中&#xff0c;可以用布圖規劃探索(Floorplan Exploration)功能&#xff0c;打開IC Compiler進行布圖規劃的創建、修改與分…

《藍牙低功耗音頻技術架構解析》

《2025GAS聲學大講堂—音頻產業創新技術公益講座》低功耗藍牙音頻系列專題LE Audio & Auracast?專題講座第1講將于8月7日周四19點開講&#xff0c;本次邀請了藍牙技術聯盟 技術與市場經理 魯公羽 演講&#xff0c;講座主題&#xff1a;《藍牙低功耗音頻技術架構解析》。&…

ubuntu apt安裝與dpkg安裝相互之間的關系

0. 問題解釋 在linux系統中&#xff0c;使用neofetch命令可以看到現在系統中使用dpkg, flatpak, snap安裝的包的數量&#xff0c;那么使用apt安裝的包被統計在什么位置了呢&#xff0c;使用apt的安裝流程和使用flatpak的安裝流程有什么關系和區別呢?1. apt 安裝的包在哪里&…

YooAsset源碼閱讀-Downloader篇

YooAsset源碼閱讀-Downloader 繼續 YooAsset 的 Downloader &#xff0c;本文將詳細介紹如何創建下載器相關代碼 CreateResourceDownloaderByAll 關鍵類 PlayModeImpl.csResourceDownloaderOperation.csDownloaderOperation.csBundleInfo.cs CreateResourceDownloaderByAll 方法…

豆包新模型與 PromptPilot 實操體驗測評,AI 輔助創作的新范式探索

摘要&#xff1a;在 AI 技術飛速發展的當下&#xff0c;各類大模型及輔助工具層出不窮&#xff0c;為開發者和創作者帶來了全新的體驗。2025 年 7 月 30 日廈門站的火山方舟線下 Meetup&#xff0c;為我們提供了近距離接觸豆包新模型與 PromptPilot 的機會。本次重點體驗了實驗…

深入探討AI在測試領域的三大核心應用:自動化測試框架、智能缺陷檢測和A/B測試優化,并通過代碼示例、流程圖和圖表詳細解析其實現原理和應用場景。

引言隨著人工智能技術的飛速發展&#xff0c;軟件測試領域正在經歷一場深刻的變革。AI技術不僅提高了測試效率&#xff0c;還增強了測試的準確性和覆蓋范圍。本文將深入探討AI在測試領域的三大核心應用&#xff1a;自動化測試框架、智能缺陷檢測和A/B測試優化&#xff0c;并通過…

音視頻學習筆記

0.vs應用其他庫配置1基礎 1.1視頻基礎 音視頻錄制原理音視頻播放原理圖像表示rgb圖像表示yuvhttps://blog.51cto.com/u_7335580/2059670 https://blog.51cto.com/cto521/1944224 https://blog.csdn.net/mandagod/article/details/78605586?locationNum7&fps1 視頻主要概念…

LLM隱藏層狀態: outputs.hidden_states 是 MLP Residual 還是 Layer Norm

outputs.hidden_states 是 MLP Residual 還是 Layer Norm outputs.hidden_states 既不是單純的 MLP Residual,也不是單純的 Layer Norm,而是每一層所有組件(包括 Layer Norm、注意力、MLP、殘差連接等)處理后的最終隱藏狀態。具體需結合 Transformer 層的結構理解: 1. T…

XML 用途

XML 用途 引言 XML&#xff08;可擴展標記語言&#xff09;是一種用于存儲和傳輸數據的標記語言。自1998年推出以來&#xff0c;XML因其靈活性和可擴展性&#xff0c;在眾多領域得到了廣泛應用。本文將詳細介紹XML的用途&#xff0c;幫助讀者全面了解這一重要技術。 一、數據存…

亞馬遜撤離Google購物廣告:重構流量生態的戰略博弈

戰略突變&#xff1a;從漸進收縮到全面退潮的背后邏輯亞馬遜在2025年7月突然全面停止Google Shopping廣告投放&#xff0c;這場看似 abrupt 的決策實則經歷了一年多的戰略鋪墊&#xff0c;從2024年Q1開始的預算削減&#xff0c;到2025年Q2美國市場支出減半&#xff0c;直至核心…

【QT】常?控件詳解(三)常用按鈕控件PushButton RadioButton CheckButton Tool Button

文章目錄前言一、PushButton1.1 QAbstractButton1.2 添加圖標的按鈕1.3 給按鈕添加快捷鍵1.4 代碼?例:按鈕的重復觸發二、 RadioButtion2.1簡介2.2 幾個槽函數 click,press,release, toggled 的區別2.2 模擬分組點餐三、 CheckBox四、Tool Button&#x1f6a9;總結前言 一、P…

數據結構:反轉鏈表(reverse the linked list)

目錄 通過交換元素值實現反轉&#xff08;reverse by swapping elements&#xff09; 滑動指針&#xff08;sliding pointers&#xff09; 使用滑動指針反轉鏈表&#xff08;Reversing a Linked List using Sliding Pointers&#xff09; 對比分析 如何用遞歸&#xff08;R…

【C#】基于SharpCompress實現壓縮包解壓功能

1.SharpCompress安裝 在vs的nuget下搜索安裝SharpCompress&#xff0c;如圖所示2.解壓縮包功能實現 /// <summary> /// 解壓壓縮包 /// </summary> /// <param name"filePath">壓縮包文件路徑</param> /// <param name"directoryPat…

mybatis連接PGSQL中對于json和jsonb的處理方法

pgsql數據庫表字段設置了jsonb格式&#xff1b;在java的實體里使用String或者對象轉換會一直提示一個錯誤&#xff1a; Caused by: org.postgresql.util.PSQLException: ERROR: column “xx” is of type jsonb but expression is of type character varying 需要加一個轉換方法…

Spring AI Alibaba Graph 深度解析:原理、架構與應用實踐

1. 引言概述 1.1 什么是 Spring AI Alibaba Graph Spring AI Alibaba Graph 是阿里云團隊基于 Spring AI 生態開發的一個強大的工作流編排框架&#xff0c;專門用于構建復雜的 AI 應用。它采用聲明式編程模型&#xff0c;通過圖結構來定義和管理 AI 工作流&#xff0c;讓開發…

C++少兒編程(二十一)—軟件執行流程

讓我們將以下程序視為用C編寫的示例程序。步驟1&#xff1a;預處理器將源代碼轉換為擴展代碼。當您運行程序時&#xff0c;源代碼首先被發送到稱為預處理器的工具。預處理器主要做兩件事&#xff1a;它會從程序中刪除注釋。它擴展了預處理器指令&#xff0c;如宏或文件包含。它…