.Net微服务实战之CI/CD(一)

简介: .Net微服务实战之CI/CD(一)

系列文章



相关源码:https://github.com/SkyChenSky/Sikiro


地基

  

在软件工程不少的思想、概念来源于建筑工程,大家也喜欢把开发软件比喻成建房子。那么如果说运维是软件的地基,那么框架就是承重墙。起房子就是先打地基,再建承重墙。地基打得越稳,房子才能起得更高。也等同于运维技术越扎实,系统才能更加健壮。

  

特别在微服务兴起得时代,运维越发的现得尤为得重要,DevOps也风靡全球。只要聊起DevOps与微服务,CI/CD总是不能避免的。CI/CD不一定限制于微服务,我认为无论在什么样风格的架构和怎么样组织架构的团队,自动化技术越早使用收效越高。

  

我认为IT人员更多是脑力大于体力的劳动者,一些重复的、错误率高的、无法对自己有增长的工作应该尽早交给自动化技术处理,节省了不需要浪费的时间与精力,这样才能更好的去完成有价值、有意义的工作。

  

2020-12-1更新,下文之前做的时候是使用了Docker部署Jenkins,在默认情况Jenkins容器是无法与宿主的Docker命令公用的,因此我使用了SSH从Jenkins容器调用宿主的方式解决。后来经过和同行沟通,使用了挂载docker.sock目录的方式,让Jenkinis容器调用宿主Docker指令的方式进行构建。为了保持原来文章的整体性,我打算在文章末尾额外加上新的方案。


部署图

image.png

  

以上是我在虚拟机环境的部署图:

  

一共三台服务器,每台服务器都装了Docker,Server B是docker swarm的Manger角色,A和C是worker。

  

在Server B装了Jenkins、Docker Registry、dotnet sdk,Server A装了Gitlab,Server C装了私有Nuget。

  

那么工作流程是:

  1. 迁入代码push到Gitlab
  2. Gitlab触发webhook的push触发事件并主动通知Jenkins构建
  3. Jenkins在Gitlab获取源码并通过配置好的规则与shell脚本进行构建


  • 如果是工具库则dotnet push到192.168.88.139:8081的私有Nuget
  • 如果是Web应用则通过dockerfile构建docker镜像并push到192.168.88.141:6000的Docker Registry,然后由docker swarm create多节点


安装Docker


安装最新版本Docker,并在所有需要使用docker的服务器节点根据以下步骤安装

升级yum并安装基础组件

yum upgrade -y

sudoyuminstall -y yum-utils device-mapper-persistent-data lvm2


添加安装源信息

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


安装docker-ce

yum makecache fast

yuminstall docker-ce -y

 

修改镜像源

vim /etc/docker/daemon.json


{
  "registry-mirrors" : [
    "http://ovfftd6p.mirror.aliyuncs.com",
    "http://registry.docker-cn.com",
    "http://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries" : [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "debug" : true,
  "experimental" : true
}

   


启动docker

systemctl daemon-reload

systemctl enable docker

systemctl start docker


image.png


安装 Docker Registry(私有仓储)


选取一个服务器-Server B使用docker安装Registry

docker run -d -p 6000:5000 -v /root/docker_registry:/var/lib/registry --name private_registry registry


开放6000端口

firewall-cmd --permanent --add-port=6000/tcp

firewall-cmd --reload


以上就Registry安装完成了,但为了正常使用还需要做点配置修改


编辑所有需要docker registry使用的节点的daemon.json文件,确保能正常访问

vim /etc/docker/daemon.json


{
"insecure-registries":["192.168.88.141:6000"]
}
重启docker
systemctl daemon-reload
service docker restart
如果需要推送镜像到私库确保标签(tag)前缀带有私库地址
docker push 192.168.88.141:6000/testdockerswarm


image.png


docker swarm的初始化


把相关涉及到docker swarm的节点端口开启


firewall-cmd --permanent --zone=public --add-port=2377/tcp


firewall-cmd --permanent --zone=public --add-port=4789/udp


firewall-cmd --permanent --zone=public --add-port=7946/udp


firewall-cmd --reload


选取Server B作为Manager节点,执行下面的指令后会出现docker swarm join的指令文本,复制保存下来


docker swarm init --advertise-addr 192.168.88.141


Server A和Server C为Worker节点,执行刚刚保存下来指令


docker swarm join --token SWMTKN-1-0odogegq3bwui4o76aq5v05doqqvuycb5jmuckjmvzy4bfmm59-ewht2cz6fo0r39ky44uv00aq5 192.168.88.141:2377


查看节点信息

docker node ls

image.png


私有Nuget的安装


选择Server C基于docker的Nuget安装
docker run -d \
           -p 8081:80 \
           --env NUGET_API_KEY=chengong \
           -v /root/nuget/database:/var/www/db \
           -v /root/nuget/packages:/var/www/packagefiles \
           --name nuget-server \
           sunside/simple-nuget-server
开放相关8081端口
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload
上传包指令,注意包名有中文会导致上传出现bad request
dotnet nuget push --source http://192.168.88.139:8081/ -k chengong TestPackage.1.0.0.nupkg
删除包指令
dotnet nuget delete --source http://192.168.88.139:8081/ -k chengong  TestPackage 1.0.0
如果在Windowsx系统可以通过工具上传
https://github.com/NuGetPackageExplorer/NuGetPackageExplorer


image.png


Gitlab的安装


在Server A服务器上基于docker安装

sudo docker run -d \

 --hostname192.168.88.138 \

 -p 443:443 -p 8080:80 -p 2222:22 \

 --name gitlab \

 --restart always \

 -v /root/gitlab/config:/etc/gitlab:Z \

 -v /root/gitlab/logs:/var/log/gitlab:Z \

 -v /root/gitlab/data:/var/opt/gitlab:Z \

 gitlab/gitlab-ce


开放端口

firewall-cmd --permanent --add-port=8080/tcp

firewall-cmd --reload



目录
相关文章
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
989 3
|
12月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
722 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
542 18
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
321 1
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
2057 8
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
426 2
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
827 0
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
548 2
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
905 0
|
Java Spring 传感器
AI 浪潮席卷,Spring 框架配置文件管理与环境感知,为软件稳定护航,你还在等什么?
【8月更文挑战第31天】在软件开发中,配置文件管理至关重要。Spring框架提供强大支持,便于应对不同环境需求,如电商项目的开发、测试与生产环境。它支持多种格式的配置文件(如properties和YAML),并能根据环境加载不同配置,如数据库连接信息。通过`@Profile`注解可指定特定环境下的配置生效,同时支持通过命令行参数或环境变量覆盖配置值,确保应用稳定性和可靠性。
257 0