.Net微服务实战之技术选型篇html
.Net微服务实战之DevOps篇linux
相关源码:https://github.com/SkyChenSky/Sikirogithub
在软件工程很多的思想、概念来源于建筑工程,你们也喜欢把开发软件比喻成建房子。那么若是说运维是软件的地基,那么框架就是承重墙。起房子就是先打地基,再建承重墙。地基打得越稳,房子才能起得更高。也等同于运维技术越扎实,系统才能更加健壮。web
特别在微服务兴起得时代,运维愈加的现得尤其得重要,DevOps也风靡全球。只要聊起DevOps与微服务,CI/CD老是不能避免的。CI/CD不必定限制于微服务,我认为不管在什么样风格的架构和怎么样组织架构的团队,自动化技术越早使用收效越高。docker
我认为IT人员更可能是脑力大于体力的劳动者,一些重复的、错误率高的、没法对本身有增加的工做应该尽早交给自动化技术处理,节省了不须要浪费的时间与精力,这样才能更好的去完成有价值、有意义的工做。shell
以上是我在虚拟机环境的部署图:json
一共三台服务器,每台服务器都装了Docker,Server B是docker swarm的Manger角色,A和C是worker。vim
在Server B装了Jenkins、Docker Registry、dotnet sdk,Server A装了Gitlab,Server C装了私有Nuget。
那么工做流程是:
安装最新版本Docker,并在全部须要使用docker的服务器节点根据如下步骤安装
升级yum并安装基础组件
yum upgrade -y sudo yum install -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 yum install 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
选取一个服务器-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
把相关涉及到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
选择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
在Server A服务器上基于docker安装
sudo docker run -d \ --hostname 192.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
第一次启动会有点慢,须要耐心的等待一下(几分钟),初始化完了后进入系统设置root的密码,登陆进去咱们建立两个项目,一个Web应用,一个工具库,等会须要用到
在Server B服务器基于docker安装Jenkins
mkdir -p /root/jenkins setenforce 0
docker run --name jenkins -u 0 -d --restart always -v /root/jenkins/jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
开放端口
firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload
启动完了后须要等待一会,咱们先去查看Jenkins的docker log,咱们找到下面那段密码,在Jenkins欢迎页输入,设置好管理员后,选择Custom Select,若是您对网络有自信就直接点继续,若是您对网络没自信,避免花了很长的时间还没安装好插件就直接啥都不选继续。(若是出现一个XXX失败代理的页面直接跳过)
docer logs xxx
Please use the following password to proceed to installation:
53d4a2880bf8460c8ff61936278855ca
插件自动下载完后了,终于进去了,若是有没有安装成功的都得保证如下三个插件安装好,Gitlab Hook 、Gitlab、Push Over SSH.
登陆后,在左侧点击【系统管理】,拖下去点击 【插件管理】,确保Gitlab Hook 、Gitlab、Push Over SSH成功安装,若是没法顺利安装则到https://plugins.jenkins.io/下载插件手动上传。
docker exec -it 81 /bin/bash
tzselect 4 9 1 1 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ##查看时间 date -R
在Server B安装.Net SDK,由于在Server B安装了Jenkins,所以会基于Server B的环境进行.Net的应用进行打包、发布
添加下载源:
rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
下载安装:
sudo yum install dotnet-sdk-3.1
dotnet nuget add source http://192.168.88.139:8081 -n LocalNugetServer
列出已有包源
dotnet nuget list source
固然能够经过 dotnet restore -s http://192.168.88.139:8081 指令指定还原包源,可是为了不若是服务地址变更后shell脚本会大面积的修改,仍是建议经过dotnet nuget add soure指令。
那么到这里全部的关于Linux的工具安装、初始化的准备工做都完成了,那么接下来就是讲解Jenkins结合Gitlab,把应用与工具包发布到Nuget与Docker。
在一切开始以前得把SSH配置好,由于后续会使用到,在【SSH Servers】模块把服务器地址、帐号密码填进去保存。
返回到首页面板点击【新建任务】-选择【构建一个自由风格的软件项目】(FreeStyle Project)。
自由风格的项目更可能是使用shell脚本结合相应平台的指令实现自动化,所以建议你们对shell脚本有个初步的认识与学习,虽然Jenkins也提供了对应平台语言的一些插件,可是只要您熟悉了shell就会发现它的灵活性与便捷性。
接下来咱们只要关注3个模块,源码管理、构建触发器、构建
源码构建,填写您要自动发布的项目的源码地址,并输入帐号密码。
构建触发器,这里勾选Build when a chenge ……,把URL 复制记录下来,等下在Gitlab须要使用到。这里就是与Gitlab webhook作了联动,能够理解成Jenkins开放了一个接口,让Gitlab被push代码后会主动告诉Jenkins作一次自动化构建。
构建,这里其实就是执行shell脚本完成发布。这里得注意下我是用ssh,由于个人Jenkins是使用了docker安装的,若是我使用了【构建】模块里的【执行shell】就会在Jenkins环境里进行编译、打包,同时也须要安装相应的环境 例如dotnet sdk等。值得注意的是,个人环境与Jenkins挂载的都是在了Server B这个宿主环境,所以经过Jenkins的SSH Publishers连到Jenkins的宿主服务器(Server B),执行相应的shell脚本从Jenkins挂载的目录进行构建镜像。
固然有同窗想在Jenkins环境先打包而后经过SSH的Transfers模块进行文件传也是能够的。
这个是工具库发布到私有Nuget的脚本
#脚本开始执行 echo '脚本开始执行' base_path=/root/jenkins/jenkins_home/workspace/TestNuget nuget_url=http://192.168.88.139:8081/ nuget_api_key=chengong project_path=$base_path/TestNuget package_path=$project_path/bin/Debug cd $project_path rm -rf $package_path/*.nupkg dotnet pack $project_path && dotnet nuget push --source $nuget_url -k $nuget_api_key $package_path/*.nupkg >/dev/null if [ $? -eq 0 ]; then echo '发布成功:'$project_path'' else echo '发布失败:'$project_path'' fi echo '脚本执行结束'
下面这个是Web应用发布到单台服务器的脚本
#!/bin/bash echo '脚本开始执行' base_path=/root/jenkins/jenkins_home/workspace/TestDockerSwarm project_name=testdockerswarm project_path=$base_path/TestDockerSwarm publish_path=$project_path/bin/Release/netcoreapp2.2/publish cd $project_path rm -rf $project_path/bin dotnet publish -c Release && ( cd $publish_path && docker stop $project_name docker rm $project_name docker image rm $project_name docker build -t $project_name . && docker run -d -p 5000:80 -e ASPNETCORE_ENVIRONMENT="Development" --name $project_name $project_name && echo '发布成功:'$project_path'' || echo '发布失败:'$project_path'' ) || echo '发布失败:'$project_path'' echo '脚本执行结束'
下面这个是经过Docker Swarm把Web应用发布到多台服务器
#!/bin/bash echo '脚本开始执行' base_path=/root/jenkins/jenkins_home/workspace/TestDockerSwarm project_name=testdockerswarm project_path=$base_path/TestDockerSwarm publish_path=$project_path/bin/Release/netcoreapp2.2/publish private_registry_url=192.168.88.141:6000 version=`date "+%Y%m%d%H%M%S"` cd $project_path rm -rf $project_path/bin dotnet publish -c Release && ( ( cd $publish_path docker service rm testdockerswarm docker images | grep $private_registry_url/$project_name | awk '{print $3}' | xargs docker rmi docker build -t $private_registry_url/$project_name:$version ./ docker push $private_registry_url/$project_name:$version ) && docker service create -d -p 5000:80 --replicas 2 -e ASPNETCORE_ENVIRONMENT="Development" --constraint=" node.role==worker" --name $project_name $private_registry_url/$project_name:$version && echo '发布成功:'$project_path'' || echo '发布失败:'$project_path'' ) || echo '发布失败:'$project_path'' echo '脚本执行结束'
上面脚本有一处地址得注意下我指定了--constraint=" node.role==worker" 也就是woker节点才会部署应用,由于我定义了ServerA和C是Web服务器。固然各位能够按照本身的须要处理。
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM base AS final WORKDIR /app COPY ./ /app ENTRYPOINT ["dotnet", "TestDockerSwarm.dll"]
进入Gitlab,点击【Admin Area】-【Network】,勾选选项后保存
进入一个Project,点击【Setting】-【Webhooks】,把刚刚在Jenkins的复制下来的Url填写进去,勾选相应的触发事件后保存。
以上就是本篇的内容了,完成了部署后,能够在Jenkins点击【马上构建】和在Gitlab迁入一次代码查看运行效果。Shell脚本做为一个demo,若是对脚本有更好的建议和优化的写法能够在评论区反馈给我。