在第二部分(微服务基础工具与技术)中我们讲解了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;如宏或文件包含。它…