GitLab
有CI
和CD
功能模块,但我对Jenkins
更熟悉些,所以先使用Jenkins
将自动发布搭建起来,后面再继续研究GitLab
的CI
和CD
功能。
dotNET Core
编写,代码通过GitLab
的Merge Request
的方式推送到服务端Merge
后会合并到master
分支Jenkins
对master
分支监控,获取最新代码,部署到CentOS
的Docker
容器中有两种方式进行构建 1、在安装
Jenkins
的服务器上安装dotNET Core
环境,编译和发布在此服务器上进行,Docker
中只需要运行环境的镜像即可 2、在Docker
中进行编译、发布,但需要下载编译环境的镜像 本文采用第一种方式
jdk
Jenkins2.129
VS2017
Git
GitLab10.6.4
docker-ce18.04
dotnetcore
在Jenkins
的官网https://jenkins.io/download/进行Jenkins
的下载,如使用Windows
,下载Windows
版本即可
-w415
因为Jenkins
是基于Java
的,所以在Windows
上先安装好JDK
的最新版本。然后根据安装向导进行安装,安装成功后会出现下面界面:
根据向导安装所有的默认插件,这个步骤也可以手动根据需要来安装相应的插件
因为构建时需要通过SSH
连接到CentOS
,所以需要安装SSH
的publish over ssh
插件
添加了publish over ssh
插件后,在「系统管理/系统设置」中可以看到Publish over SSH
的设置区域,将需要构建发布的ContOS
的服务器信息添加进去
在「系统管理/全局工具配置」中设置Git
路径C:\Program Files (x86)\Git\bin\git.exe
,在构建时拉取代码需要用到Git
工具
首先需要创建一个任务,选择构建一个自由风格的软件项目
配置分为五个步骤:
CentOS
中GitLab
的账户密码设置gitlab
GitLab
为10.6的版本代码拉到本地需要进行存储,在General
中进行路径的设置
构建触发器有很多中,这里我们选择轮询SCM
,意思是定时检查源码变更(根据SCM软件的版本号),如果有更新就pull
最新code
下来,然后执行构建动作。
表达式配置为H/2 * * * *
表示每两分钟检查一次。表达式规则如下:
* * * * *
(五颗星,中间用空格隔开)
第一颗*表示分钟,取值0~59
第二颗*表示小时,取值0~23
第三颗*表示一个月的第几天,取值1~31
第四颗*表示第几月,取值1~12
第五颗*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
构建后的操作选择Send build artifacts over SSH
进行SSH的相关配置
SSH
服务器dotNET Core
程序的发布目录dotNET Core
程序的发布目录CentOS
服务器的根目录中创建webapi
目录,此处配置目录路径CentOS
服务器的根目录中创建名称为devops_webapi.sh
的脚本文件,此处配置文件路径到此Jenkins
配置完成,保存即可。
1、在根目录中创建webapi
目录,Jenkins
会将dotNET Core
发布后的文件复制到该目录中,在该目录中创建Dockerfile
文件,用来生成Docker
镜像,Dockerfile
文件内容如下:
FROM microsoft/aspnetcore
COPY . /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "FW.WebAPI.dll"]
2、在根目录下创建devops_webapi.sh
文件,用来构建镜像和创建容器,文件内容如下:
#!/bin/bash
echo "del none images"
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi
echo "container del success"
docker stop $(docker ps -a | awk '/webapi:v1/ {print $1}')
docker rm $(docker ps -a | awk '/webapi:v1/ {print $1}')
echo "begin docker build"
cd webapi
docker build -t webapi:v1 .
echo "build end"
docker run -d -p 9011:5000 --restart=always --name webapitest webapi:v1
#echo "none image del start"
#docker rmi $(docker images -f "dangling=true" -q)
#echo "none image del success"
程序自动发布的方式有很多种,先选一种自己熟悉的方式运行起来,再进行更深入的研究,和更优方式的选择。跟写代码一样,不能纸上谈兵,先运行起来,再逐步优化重构。