一、简介#
在先前的博客中介绍了Linux搭建.net core CI/CD环境,但并未对CI/CD原理做解释,本篇将继上篇教程做更加详细的介绍以及完整的CI/CD环境搭建。
什么是CI/CD#
维基百科解释如下:
在软件工程中,CI / CD或CICD通常是指持续集成以及持续交付或持续部署的组合实践。
在公司沟通的上下文中,CI / CD也可以指代公司标识和公司设计的整个过程。
这篇解释十分简洁却直击要点---所谓的CI/CD就是持续集成、持续交付、持续部署。那么,为什么在软件工程中需要CI/CD,为什么在传统的单体项目开发中极少听说CI/CD,为什么在微服务开发中离不开CI/CD,通过什么样的技术可以实现CI/CD?下面请听我一一解释。
什么样的场景中需要CI/CD#
首先,ci/cd是软件工程中及其重要的概念,虽然我已经忘记大部分软件工程的概念。。。软件开发的形式有很多中,有一种开发形式是团队性、持续性、迭代性的,在这种开发中我们不可能指望一次性设计完所有的需求,所有的开发人员像流水线工人一样去需求消化、开发。要知道软件开发是一件精细活,开发的过程中修修改改是常态,正是在这种常态的打磨下我们的软件才会越来越成熟、稳健,所以把软件开发比喻成一场修行毫不为过。在这种高度变化的工作场景中我们需要制定一套机制,这套机制可以让我们的团队在持续性的项目开发中徐徐渐进的往项目中集成功能,而不是各自为营,大家自顾自的开发自己的需求,最后在项目收尾的时候进行大合并。
总结下就是大型、持续性(产品)、平台性的项目开发中需要用到软件工程中CI/CD概念。
为什么在传统的单体项目开发中极少听说CI/CD#
单体项目顾名思义就是一个项目由单一结构或架构构成,如三层MVC架构,四层DDD架构或其他多层工程结构组成的单一项目。这样的架构形式适合中小型的项目开发,比如内部OA、CRM等项目,这样的项目往往对并发、性能要求不高,更加重要的是这样的项目需要的人手不多,很多小型单体项目往往是一个人开发完成的。在成熟的单体架构中开发一个项目用时往往比较少,通常2-3月就完成,所以完全没必要搭建一套复杂的持续集成体制。
为什么在微服务开发中离不开CI/CD#
微服务近几年在国内可谓是声名鹊起,火爆之极,许多互联网、软件公司无论大小都想往微服务方向发展,替换原有的单体或SOA结构的项目。微服务架构虽然强大、好用但是开发起来是非常复杂和困难的,即使是有经验的架构师搭建一套成熟的企业级微服务架构都需要数月,许多没有微服务经验的架构师往往只能望而却步,不敢冒险。微服务适合于大型互联网、平台产品,所以必须要有一套持续集成体制保质保量的推进项目进展。
通过什么样的技术可以实现CI/CD?#
上面讲了一大堆废话,终于可以讨论具体实践了。声明在前,如果公司有钱可以直接买Azure服务,微软提供了非常专业的DevOps服务,其中就包括ci/cd。如果资金有限想要自己折腾的话可以继续看下去了,要知道,自己搭建的话肯定都是使用免费的工具(免费===坑)。所以自主搭建一定没有想象中的理想,但是对很多公司来说有就够了,不就是低配版嘛~
想要实线持续集成我们需要一个能执行Shell的工具(Jenkins)、一个优秀的代码托管服务(git、tfs)、容器服务(Docker),好了,找到方法了下面直接开工把。
二、搭建CI/CD#
讲了这么多道理,下面开始实践如何搭建CI/CD,首先你得有两把刷子,你得:
- 掌握Linux系统
- 掌握shell脚本
- 掌握Docker
- 能吃苦耐劳
...
如果你掌握了以上技术,恭喜你可以解锁新姿势了~
关于Docker、Jenkins如何安装操作,你可以参考前传:https://www.cnblogs.com/william-xu/p/11497108.html
如果你已经完成了前传的所有操作,那么接下来你只需要修改Docekerfile和执行Shell就可以坐等成功了。
最新Dockerfile如下:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /app
WORKDIR /src
COPY . .
COPY NuGet.Config /root/.nuget/NuGet/NuGet.Config
RUN dotnet restore
RUN dotnet publish -c Release -o publish
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /src/publish ./
ENTRYPOINT ["dotnet", "AuthServer.Host.dll"]
Jenkins执行Shell如下:
#!/bin/sh
cd /var/lib/jenkins/workspace/auth-server/applications/AuthServer.Host
docker container prune << EOF
y
EOF
docker container ls -a | grep "auth-server"
if [ $? -eq 0 ];then
docker container stop auth-server
docker container rm auth-server
fi
docker image prune << EOF
y
EOF
docker build -t auth-server .
docker run -d -p 64999:80 --name=auth-server auth-server
现在只需通过提交代码就可以享受服务器开发、生产环境自动构建、集成、部署的乐趣了~
通过以上方式搭建低配版CI/CD还有很多的功能有待探索,感兴趣的朋友可以继续深挖哦~
三、总结#
以上内容介绍了软件工程中的CI/CD概念和实践方式,其实自主搭建CI/CD只是微服务开发路上的一小步,但是这一小步十分困难,原因在于需要的技术含量较高,需要十分稳重的心态和百折不挠的精神。由于具体实践繁琐复杂,本篇内容无法完整讲述全部实践过程,希望大家抱着学习、研究的心态去慢慢实践,慢慢享受掌握知识的乐趣。