.net core基于gitlab+jenkins+docker构建发布webapi项目(centos7)
前言:
在今年8月份时领导说要使用CI/CD,然后就想到了通过gitlab+jenkins+docker来做持续构建和部署,年纪越来越大,也不太爱总结(所以能力也不咋地),所以记录下来实施步骤,以免后面忘了,要是文中有不对的地方或更好的方式还请大家告知。
背景:
公司的技术栈是winform+devexpress .net core oracle tfs centos7
后来因为tfs基于windows的在docker中部署的jenkins不太好拉取tfs代码,所以将tfs换成了git,并在公司内部搭建了gitlab。gitlab也有自己的CI/CD,因为以前使用过jenkins,稍微熟悉点,所以还是使用jenkins。既然公司用到了.net core(也是最近才把项目的服务端改成core)就考虑要跨平台部署,所以使用了centos7。
整个步骤大致可分为3步
1. 使用docker创建gitlab容器、jenkins容器(把所需的工具先准备好)
2. 将代码上传到gitlab中并配置好jenkins能够成功拉取到代码并构建(这一步做完就已经实现提交后自动构建发布了)
3. 编写dockerfile,在jenkins任务中写shell脚本生成并运行docker容器(这一步是针对第二步的优化)
虽然大致分了3步走,但每一步的具体操作还有很多。
下面再细分每一步步骤。
第一步
centos7中下载安装docker就不说了
这里贴下创建gitlab和jenkins容器命令吧
1 #运行gitlab 2 docker run -d -p 8443:443 -publish 8090:8090 -p 4422:22 --name p-gitlab --restart always -v /docker/gitlab/config:/etc/gitlab -v /docker/gitlab/logs:/var/log/gitlab -v /docker/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce 3 4 #运行jenkins(jenkins部署相对简单,当时没记录命令,下面这条是根据运行时的容器推过来的) 5 docker run -d -p 8080:8080 -p 50000:50000 --name p-jenkins --restart always
这里的坑点在于gitlab的配置,一共需要修改三行配置,这里我改了ssh的端口,其实也可以不改,不改的话docker run那里端口映射也还是22对22。(之前一直徘徊在设置了ssh公私钥但还是无法使用ssh方式下代码,整了我一个星期终于整通了)
external_url 'http://192.168.0.52:8090' gitlab_rails['gitlab_shell_ssh_port'] = 4422 nginx['listen_port'] = 8090
第二步
接下来就是将代码传到gitlab上,然后去jenkins中创建一个任务,配置好jenkins中的任务能够成功拉取到gitlab中的代码并构建,这里说下jenkins创建任务步骤。
1. 新建项目
输入名字=》选择自由风格项目=》创建
2. 配置项目
- 填写描述:项目的作用(描述下干了些什么事,有什么用途,好备查)
- 设置gitlab连接地址,这个需要在系统设置中配置,然后在下拉列表中可以选择刚配置的选项。
example:
-
- 系统设置中的Gitlab配置,需要安装gitlab插件才会出现这一栏配置,配置完后可以测试连接,测试连接通过了才算配置成功(这里的凭证是在gitlab中用户设置-访问令牌-创建Personal Access Tokens添加的)

-
- 再在项目设置中选择刚配置的gitlab地址,这里的列表显示的是系统设置中gitlab的连接名
192.169.0.52-gitlab
- 再在项目设置中选择刚配置的gitlab地址,这里的列表显示的是系统设置中gitlab的连接名

- 源码管理中选择Git=》配置项目仓库地址=>添加相应凭证(这里使用的方式是ssh拉取代码,所以要在53服务器添加ssh密钥,当然也可以使用用户名密码的方式,使用ssh的方式比较简便与安全)=>选择要构建的分支(可以使用通配符、也可以指定单个分支、添加多个分支)
example:

- 构建触发器设置(这里设置成只要有代码推送就会出发构建,这需要将webhook URL配置到gitlab项目中)
example:

高级设置部分(只在推送到master分支时才出发构建,Secret token也需要填写gitlab项目设置中)

- 构建环境设置,这里选择在构建开始之前清空工作区,避免出现问题
example:

- 填写构建步骤,这里共划分为4步(7-10)
- 先停掉运行中的dotnet程序(如果存在),然后执行批处理脚本publish.bat
- 执行批处理脚本publish-staging.bat
- 执行批处理脚本runSelfHost.bat,本机(因为jenkins是运行在0.53上的所以这里本机就是0.53)运行发布的dotnet程序
- 执行批处理脚本reBuild.bat,发布客户端(因为客户端时cs程序,所以这一步在centos中无法完成,如果把jenkins部署在windows系统中可以使用这一步)
example:(这里没有执行reBuild.bat脚本,因为centos环境生成framework的程序肯定是不现实的,如果是在windows环境可以执行此脚本)

这里需要重点介绍下这几个批处理脚本中的内容
- publish.bat
在脚本中已经有注释就不再赘述,脚本内容如下:
1 @echo off 2 echo ############################## 3 echo begin publish current solution 4 echo ############################## 5 : 1.生成发布文件,2.将原来的发布包压缩成备份, 3.将新的发布文件替换out目录,4.运行程序 6 echo 1.生成发布文件 7 dotnet restore 8 dotnet publish ./PrologAdp.Medicine.SelfHost/PrologAdp.Medicine.SelfHost.csproj -c Release -o out 9 echo 2.正在压缩备份上次发布文件 10 rar a -r -ep1 "D:\PrologAdpMedicine\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%.rar" "D:\PrologAdpMedicine\publish" 11 echo 3.拷贝发布文件到D:\PrologAdpMedicine\publish目录 12 xcopy ".\PrologAdp.Medicine.SelfHost/out" "D:\PrologAdpMedicine/publish" /s/e/y 13 copy ".\runSelfHost.bat" "D:\PrologAdpMedicine\publish" /y 14 :echo 4.运行发布程序 15 :runSelfHost.bat 16 echo ######################################## 17 echo publishing finished,model release, pls check the result. 18 echo ######################################## 19 :pause
-
- publish-staging.bat
此脚本的内容和publish.bat差不多只是改了发布模式从release变成staging,脚本内容如下
1 @echo off 2 echo ############################## 3 echo begin publish current solution 4 echo ############################## 5 : 1.生成发布文件,2.将原来的发布包压缩成备份, 3.将新的发布文件替换out目录,4.运行程序 6 echo 1.生成发布文件 7 dotnet restore 8 dotnet publish ./PrologAdp.Medicine.SelfHost/PrologAdp.Medicine.SelfHost.csproj -c Staging -o out-staging 9 echo 2.压缩备份上次发布文件 10 rar a -r -ep1 "D:\PrologAdpMedicine\staging-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%.rar" "D:\PrologAdpMedicine\StagingPublish" 11 echo 3.拷贝发布文件到D:\PrologAdpMedicine\StagingPublish目录 12 xcopy ".\PrologAdp.Medicine.SelfHost/out-staging" "D:\PrologAdpMedicine/StagingPublish" /s/e/y 13 :echo 4.运行发布程序 14 :runSelfHost.bat 15 echo ######################################## 16 echo publishing finished,model staging, pls check the result. 17 echo ######################################## 18 :pause
-
- runSelfHost.bat
此脚本用于启动发布的dotnet程序,脚本内容如下:
1 start "PrologAdpMedicine" /D D:\PrologAdpMedicine\publish dotnet PrologAdp.Medicine.SelfHost.dll
-
- reBuild.bat
此脚本用户发布客户端程序,脚本内容如下:
1 @echo off 2 echo ############################## 3 echo begin rebuild current solution 4 echo ############################## 5 set MSBUILD_EXE="" 6 if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe" ( 7 set MSBUILD_EXE="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe" 8 ) 9 if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" ( 10 set MSBUILD_EXE="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" 11 ) 12 if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" ( 13 set MSBUILD_EXE="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" 14 ) 15 if exist "D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" ( 16 set MSBUILD_EXE="D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" 17 ) 18 if exist "D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" ( 19 set MSBUILD_EXE="D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" 20 ) 21 :使用MSBuild构建工具发布客户端项目PrologAdp.Medicine.Main.csproj,输出目录是Client 22 :关闭自动序列化程序集/p:GenerateSerializationAssemblies=Off 23 %MSBUILD_EXE% /p:OutputPath=%cd%\Client;TreatWarningsAsErrors=false;DebugType=none;Configuration=Release /t:Rebuild .\PrologAdp.Medicine.Main\PrologAdp.Medicine.Main.csproj 24 echo ######################################## 25 echo building finished, pls check the result. 26 echo ######################################## 27 pause
- 添加一个回传结果到gitlab的步骤
explame:

至此,第二步的任务完成,这时我们还没有接入dockerfile,而是直接在jenkins服务器上直接运行构建成功的服务端
第三步
直接删除掉第二步jenkins任务中的所有构建步骤(上文中的6-10步操作)
然后添加一个shell步骤,脚本如下:
1 # 切换到源码目录,对应在jenkins-home的workspace下面 2 cd /var/jenkins_home/workspace/PrologAdp; 3 image_version=`date +%Y%m%d%H%M`; 4 container_name=plgwms-server; 5 echo $image_version; 6 # 删除Docker容器 7 cid=$(docker ps -a | grep $container_name |awk '{print $1}') 8 if [ x"$cid" != x ] 9 then 10 docker rm -f $cid 11 fi 12 # build镜像并且打上tag 13 docker build -t $container_name:$image_version .; 14 15 # 清理空名字的镜像 16 clearImagesList=$(docker images -f "dangling=true" -q) 17 if [ ! -n "$clearImagesList" ]; then 18 echo "No need to clean up images." 19 else 20 docker rmi $(docker images -f "dangling=true" -q) 21 echo "clear success." 22 fi 23 24 # 把刚刚build出来的镜像跑起来 25 docker run -dit -p 8091:8091 -p 5000:5000 --restart=always --name $container_name $container_name:$image_version; 26 # docker logs $container_name;
explame:

现在只要有提交就会触发构建,成功后会创建一个新的镜像,以后的工作只需要提交代码稍等片刻就能直接访问发布的服务端,而不用每次手动部署项目。
总结:
这些是今年9月份的工作,现在已经过去了1个多月,当时搭这些磕磕绊绊差不多用了半个月的时间,中间遇到的问题也有几个,像gitlab配置问题,编写dockerfile问题,公司项目中服务端还是有部分framework的代码导致无法在centos运行。 最后还是顺利解决掉这些问题实现了CI CD。然而因为某些原因还是没能用在实际工作中,这里记录下,以后要再碰到还能备查。

浙公网安备 33010602011771号