Jenkins集成.Net5
前言
集成.Net5项目到Jenkins中,Jenkins和.Net5项目都在容器中
一、Jenkins配置
1、创建项目
- 新建Item
- 选择Freestyle project(自由风格)
2、配置
- 源码管理
操作:我使用的码云,直接填上码云地址,再新建Credentials选中即可。 - 构建触发器
我勾选的Poll SCM,填的*/1 * * * *。这样每分钟就去检测,如果代码有提交就会构建
3、构建环境
无
4、构建
- 新增步骤,选择一类
操作:我选择的是:Send files or execute commands over SSH - SSH Server
操作:需要提前创建好,这里选中就行
详细:Manage Jenkins => System Configuration => Publish over SSH(需要先安装这个插件) - Exec command
#复制代码到.net5容器挂载的目录中
\cp -r /home/jenkins/workspace/TeamPlayApi/* /root/dotnet/TeamPlayApi/app/TeamPlayApi
#让容器执行shell脚本,
docker exec -i 0ee7ddc90264 bash /publish/shell/start.sh
#重启容器(其实就是重启服务)
docker restart 0ee7ddc90264
exit 0
备注1:参数是-i不是-it,使用-t会报错
备注2:/home/start.sh是容器中的文件(我是将目录挂载到了服务器)
二、Jenkins命令+Shell脚本
方式1、docker容器重启时自动重启服务
前言
docker容器重启时,自动重启服务。所以在jenkins命令中,在编译生成可执行文件后,只需要重启容器就可以重启服务
1. Dockerfile
Dockerfile文件中指定了CMD,以CMD来运行服务
2. Jenkins命令
#复制代码到.net5容器挂载的目录中
\cp -r /home/jenkins/workspace/SteamApi/* /root/dotnet/SteamApi/app/SteamApi
#让容器执行shell脚本,
docker exec -i 0ee7ddc90264 bash /publish/shell/start.sh
#重启容器(其实就是重启服务)
docker restart 0ee7ddc90264
exit 0
3. start.sh脚本
#!/bin/bash
cd /publish/TeamPlayApi #进入到代码的目录
dotnet build --configuration Release #已release模式编译
\cp -r /publish/SteamApi/bin/Release/net5.0/* /publish #将编译好的DLL覆盖之前的DLL
exit #一定要加上,不然服务启动不了
方式2、start.sh脚本重启服务
流程间接
Jenkins远程连接进入到docker容器中,先复制代码,然后到容器中先停止服务,再编译代码,再重启服务
1. Jenkins命令
#复制代码
\cp -rf /var/jenkins_home/workspace/SteamApi/SteamApi/root/SteamApi/api
#容器中执行脚本
docker exec -i 5b948d967552 bash /api/SteamApi/start.sh
exit 0
3. start.sh脚本
SteamApi.dll时可执行文件,grep -v grep是用来过滤本身的影响
#!/bin/bash
ps -ef | grep SteamApi.dll | grep -v grep | awk '{print $2}' | head -n 1 | xargs kill -9 #杀掉进程
cd /api/SteamApi
dotnet build --configuration Release
cd /api/SteamApi/bin/Release/net5.0
dotnet SteamApi.dll
exit #一定要加上,不然服务启动不了
三、总结
1、我做了一件什么事?
- 在Docker中,将.Net5集成到了Jenkins中
2、这件事有什么用?
- 在开发过程中,我代码提交后,能直接部署(当前我是测试环境),省略了发布这一个过程。加快了开发效率。
3、出现了哪些问题?是否解决?是否明确了问题出现的根本原因?
- 使用cp命令复制项目代码时,发现项目代码中的文件夹没有复制过去
- 想使用dotnet命令去重启程序,发现找不到命令,不知道咋重启dll程序。最后直接重启容器,容器直接挂载了命令【CMD [“dotnet”, “TeamPlayApi.dll”]】
- dotnet重启程序方式:①杀掉进程,在启动(直接启动会重复启动)②注册为服务,重启服务
4、学到了哪些知识点?
- 使用cp命令复制文件夹(文件夹内还有文件夹)到另外一个文件夹时,需要使用-r参数
- 在搭建整个流程时,我是直接全部正好在测试的。把start.sh脚本写好,jenkins命令写好。直接测试。每一步单独测试好会更顺畅,start.sh脚本写好之前,先测试每条命令。写好之后在测试start.sh脚本。每一步单独测试好后,整体花费时间会更少,效率会更高。
- grep -v命令排除输出。可以用于ps -ef | grep本来带来的影响
5、备注
同上一章大同小异