.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配置

 

第二步

接下来就是将代码传到gitlab上,然后去jenkins中创建一个任务,配置好jenkins中的任务能够成功拉取到gitlab中的代码并构建,这里说下jenkins创建任务步骤。

1. 新建项目

输入名字=》选择自由风格项目=》创建

2. 配置项目

  1. 填写描述:项目的作用(描述下干了些什么事,有什么用途,好备查)
  2. 设置gitlab连接地址,这个需要在系统设置中配置,然后在下拉列表中可以选择刚配置的选项。

    example:

    • 系统设置中的Gitlab配置,需要安装gitlab插件才会出现这一栏配置,配置完后可以测试连接,测试连接通过了才算配置成功(这里的凭证是在gitlab中用户设置-访问令牌-创建Personal Access Tokens添加的)

      

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

        

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

    example:

      

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

    example:
      

 

 

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

       

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

    example:

      

  1. 填写构建步骤,这里共划分为4步(7-10)
  1. 先停掉运行中的dotnet程序(如果存在),然后执行批处理脚本publish.bat
  1. 执行批处理脚本publish-staging.bat
  1. 执行批处理脚本runSelfHost.bat,本机(因为jenkins是运行在0.53上的所以这里本机就是0.53)运行发布的dotnet程序
  1. 执行批处理脚本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.bat
    • 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
publish-staging.bat
    • runSelfHost.bat

      此脚本用于启动发布的dotnet程序,脚本内容如下:

1 start "PrologAdpMedicine" /D D:\PrologAdpMedicine\publish dotnet PrologAdp.Medicine.SelfHost.dll
runSelfHost.bat
    • 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
reBuild.bat
  1. 添加一个回传结果到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;
dockershell

    explame:

      

 现在只要有提交就会触发构建,成功后会创建一个新的镜像,以后的工作只需要提交代码稍等片刻就能直接访问发布的服务端,而不用每次手动部署项目。

 

总结:

  这些是今年9月份的工作,现在已经过去了1个多月,当时搭这些磕磕绊绊差不多用了半个月的时间,中间遇到的问题也有几个,像gitlab配置问题,编写dockerfile问题,公司项目中服务端还是有部分framework的代码导致无法在centos运行。 最后还是顺利解决掉这些问题实现了CI CD。然而因为某些原因还是没能用在实际工作中,这里记录下,以后要再碰到还能备查。

posted @ 2019-10-31 14:53  格叽  阅读(472)  评论(0)    收藏  举报