本文主要内容是在Centos系统环境下搭建Gitlab+Jenkins 持续集成环境,并实现.NET web项目的自动化部署,网上针对.NET项目持续集成的介绍不多,而且选择的大都是windowsI环境。本文内容根据网络搜索和我的实战操作记录整理而成,踩坑无数,最后成功,希望对大家有用。
Gitlab:Centos7.6
Jenkins:Centos7.6
IIS服务器:Windows Server 2008
GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。1
[root@localhost ~] yum -y install policycoreutils openssh-server openssh-clients postfix
postfix支持gitlab发信功能,设置postfix开机自启
[root@localhost ~] systemctl enable postfix && systemctl start postfix
[root@localhost ~] wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.3.4-ce.0.el7.x86_64.rpm
......
[root@localhost ~] rpm -ivh gitlab-ce-11.3.4-ce.0.el7.x86_64.rpm
修改配置文件gitlab.rb
[root@localhost ~] vim /etc/gitlab/gitlab.rb
修改external_url为服务器IP和指定端口,这里我设置成8086
## GitLab URL
##! URL on which GitLab will be reachable.
##! For more details on configuring external_url see:
##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
external_url 'http://10.5.1.122:8086'
[root@localhost ~] gitlab-ctl reconfigure
......
[root@localhost ~] gitlab-ctl restart
输入服务器IP和指定端口进行访问,可能出现的问题见参考文献1。
创建项目很简单,还可以从很多代码托管机构直接导入项目。
项目创建完毕,进入项目管理首页,看到两个提示:
You won’t be able to pull or push project code via SSH until you add an SSH key to your profile
你不能通过SSH方式拉取或者推送项目代码,除非你添加了SSH秘钥到配置文件
The Auto DevOps pipeline has been enabled and will be used if no alternative CI configuration file is found. More information
已启用了自动DevOps管道,如果找不到其他CI配置文件,将使用该管道。
这两个提示不用管,我觉得内网环境,小规模的开发团队不需要,如果要添加,在用户设置里操作,点击generate one按钮按设置说明操作,如果要中文请看这里 2
项目创建完毕后,将程序推送到git仓库,切换到程序根目录下,右键菜单启动Git Bash(你的开发环境要安装有Git)
用户名@机器名 MINGW64 ~
$ git init
用户名@机器名 MINGW64 ~
$ git add -A
用户名@机器名 MINGW64 ~
$ git commit -a -m "注释内容”
用户名@机器名 MINGW64 ~
$ git remote add origin http://10.5.1.122:8086/root/projectname.git
用户名@机器名 MINGW64 ~
$ git push origin master
如果出现类似README.md文件冲突的问题,参见这里 3
如果.gitigonre设置了却失效,参见这里 4
我是下载的rpm安装包进行安装的5,安装完成后直接可用没有什么幺蛾子,JAVA环境默认安装的版本就是1.8.0_181,我卸载了重新装了一遍还是这个版本,这里没有坑,网上资料丰富。
wget https://pkg.jenkins.io/redhat/jenkins-2.156-1.1.noarch.rpm
rpm -ivh jenkins-2.156-1.1.noarch.rpm
vim /etc/sysconfig/jenkins
修改两个属性
JENKINS_USER=“root”:将用户权限修改为root权限
JENKINS_PORT=“8088”:将端口修改为你需要的端口
systemctl start jenkins
MonoDevelop 是个Linux平台上的开放源代码集成开发环境,主要用来开发Mono与.NET Framework软件。MonoDevelop 整合了很多Eclipse与Microsoft Visual Studio的特性,像是 Intellisense、版本控制还有 GUI 与 Web 设计工具。另外还整合了GTK# GUI设计工具(叫做Stetic)。目前支援的语言有C#、Java、BOO、Nemerle、Visual Basic .NET、CIL、C与C++ 6。
官方网站安装说明在这里
我是参照这里安装的7
yum –y update
参照Mono官方的CentOS安装 http://www.mono-project.com/download/#download-lin-centos,首先添加安装包仓库
yum install yum-utils
rpm --import http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
yum-config-manager --add-repo http://download.mono-project.com/repo/centos7/
yum install mono-complete
等待几分钟的下载安装,安装完后我们使用Mono –V 检查我们的安装是否成功,目前版本是6.6
目前覆盖的API范围到4.8 了。
按提示从服务器查找默认密码
cat /var/lib/jenkins/secrets/initialAdminPassword
Git要设置Name和Path,这里的Path是指Centos上git的环境地址,如图8.3.1-1所示,按照图8.3.1-2设置即可。
图8.3.1-1
图8.3.1-2
如图8.3.2-1所示,这里我设置了两个MSBuild环境,最开始设置的是shell-XBuild环境(shell-XBuild这个Name是自己命名的),因为xbuild.exe在文件夹/usr/lib/mono/xbuild/14.0/bin/下(图8.3.2-2),这样配置的话Jenkins项目构建就只能采用shell方式,命令不方便带参数调用(我觉得肯定是可以带参数的,但是我在网上找了好久包括官网都没有找到带参数的使用方法)。后来改用MSBuild环境,设置Path为/usr/bin/xbuild(图8.3.2-3),构建就可以使用Build a Viusal Studio project or solution using MSBuild方式,带参数执行更方便。
图8.3.2-1
图8.3.2-2
图8.3.2-3
可以注意到/usr/bin/xbuild下的xbuild是一个shell文件,他实际指向的仍然是/usr/lib/mono/xbuild/14.0/bin/xbuild.exe,打开这个shell文件,内容是:
#!/bin/sh
MONO_GC_PARAMS="nursery-size=64m,$MONO_GC_PARAMS" exec /usr/bin/mono $MONO_OPTIONS /usr/lib/mono/xbuild/14.0/bin/xbuild.exe "$@"
这个shell文件的地址是这样求出来的(如图8.3.2-4)
图8.3.2-4
为什么说账号密码要看SMTP的设置说明,以腾讯QQ邮箱为例,账号和密码是有特殊要求的,比如如果是foxmail邮箱,账号必须要写邮箱全称地址,密码不是邮箱的登录密码而是授权码。SSL、端口号也按照邮件服务商的说明来设置,字符集默认UTF-8。
点击Test configuration按钮可以立即发送测试邮件。
我采用的是发布到windows共享文件夹的方式来部署,所以需要安装CIFS插件8。
Name和Hostname就是指我们部署IIS的windows服务器,我直接用的IP地址,用机器名不能成功,原因不明。Username和Password就是远程访问共享文件夹的账号和密码,我是域网络,所以直接输入域账号特别方便,注意坑:域账号要带域信息一起输入(Username:域\用户名)。Share就是远程共享文件夹的名称。其它参数用默认值即可。点击Test Configuration按钮如果共享文件夹连接成功,显示Success
General标签页里我没有设置,直接跳到源码管理。这里使用之前我们安装Gitlab并配置好的仓库地址,如图8.6.1-1。Credentials使用的凭据就是Git的账号密码,点击添加按钮,如图8.6.1-2操作。
图8.6.1-1
图8.6.1-2
可以设置Jenkins定时构建或者轮询SCM9
(1)定时构建:不管SVN或Git中数据有无变化,均执行定时化的构建任务 ;
(2)轮询SCM:只要SVN或Git中数据有更新,则执行构建任务;
(3)构建语法说明:
首先格式为:* * * * (五个星);
第一个表示分钟,取值0~59
第二个表示小时,取值0~23
第三个表示一个月的第几天,取值1~31
第四个表示第几月,取值1~12
第五个表示一周中的第几天,取值0~7,其中0和7代表的都是周日
使用举例:
每隔10分钟构建一次:H/5 * * * *
每隔1小时构建一次: H H/1 * * *
每月30号构建一次: H H 30 * *
每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38)
H H(9-16)/2 * * 1-5
(4)定时构建和轮询SCM使用互不冲突,具体如何组合,需要根据项目情况合理配置;
我没有设置,保持默认选项。
MSBuild Version是该构建的名称;
MSBuild Build File指向.NET项目的sln文件;
Command Line Arguments 参数。
参数的用法
/t:Rebuild 重新生成
/p:Configuration=Release 生成模式
/p:VisualStudioVersion=14.0 指定子工具集版本,不设置会报错
/p:DeployOnBuild=True;PublishProfile=MaterialControlTest 使用 MaterialControlTest.pubxml 发布文件来发布项目,我设置了然而没有任何用处
/p:OutDir=/var/lib/jenkins/workspace/Material3/website/ 输出打包文件地址
我的参数如图8.6.4-1所示,当构建完成后,打包后的程序会输出到/var/lib/jenkins/workspace/Material3/website/,如图8.6.4-2。
巨坑1:/var/lib/jenkins/workspace/是Jenkins的工作空间,OutDir输出路径一定要设置在Jenkins工作空间里,因为构建后操作里的归档文件路径只能从工作空间里获取。
图8.6.4-1
图8.6.4-2
构建后操作一共有三个。
设置用于存档的文件地址为website/_PublishedWebsites/WEC.MaterialControl/也就是你Centos服务器上程序根目录下输出的从website开始的那一段路径,如图8.6.5-1。_PublishedWebsites/WEC.MaterialControl/的名称是依据什么自动设置出来的目前我还没有找到。
巨坑2:归档成品操作是一定要有的,否则无法把打包好的文件复制给IIS服务器的共享文件夹,存档的文件路径不需要输入Jenkins的工作空间地址,已经默认指向了。
图8.6.5-1
在Project Recipient List中加入要接收通知的邮件地址,其它参数全部默认。
Name这里就是选择我们之前在Jenkins系统配置时预设置的CIFS,我用的名称就是IP地址,Source files的地址设置为:website/_PublishedWebsites/WEC.MaterialControl/**,简单说就是指向打包输出的程序文件夹。
巨坑3:website/_PublishedWebsites/WEC.MaterialControl/**的最后是两个*号,**表示复制该文件夹下的所有文件夹及文件,*.*表示仅复制该文件夹下的所有文件,不包括文件夹。
Exclude files设置了没有效果,不过这都是小问题了,以后再百度解决。
点击立即构建按钮。
构建中…
构建完成,蓝色灯状态表示构建成功,在下拉菜单中选择控制台输出,打开构建日志。
构建日志的的结尾显示本次构建的结果,如图8.8-1
图8.8-1
GitLab服务器和Jenkins服务器可以通过Web Hook的方式进行通信。10
在Jenkins服务器中,安装插件:GitLab Plugin和GitLab Hook Plugin
在Jenkins项目中打开配置,构建触发器中选择"Build when a change is pushed to GitLab."记下GitLab webhook URL。
在Jenkins中修改安全策略(谨慎操作,确保操作用户具有所有权限):系统管理->全局安全配置->在安全矩阵中给予匿名用户Build权限,如图9.3-1。
图9.3-1
在Admin area->Settings->Outbound requests勾选Allow requests to the local network from hooks and services
Outbound requests:外发请求
Allow requests to the local network from hooks and services:允许来自钩子和服务的对本地网络的请求
如果不设置的话,添加Webhooks时会报错:Urlis blocked: Requests to localhost are not allowed
在Gitlab项目中选择Settings->Integrations->设置URL,将Jenkins构建触发器中的GitLab webhook URL地址填在这里,并确保Push events选中,点击下方的Add webhook按钮完成添加。
添加完毕后点击Test按钮,选择Push events测试触发功能是否正常。
返回200表示正常,此时Jenkins已经开始构建动作了。
在Jenkins项目页面可以看到构建进度条。
Jenkins定时构建,轮询SCM设置11
定时构建:不管SVN或Git中数据有无变化,均执行定时化的构建任务 ;
轮询SCM:只要SVN或Git中数据有更新,则执行构建任务;
构建语法说明:
首先格式为:* * * * (五个星);
第一个表示分钟,取值0~59
第二个表示小时,取值0~23
第三个表示一个月的第几天,取值1~31
第四个表示第几月,取值1~12
第五个表示一周中的第几天,取值0~7,其中0和7代表的都是周日
使用举例:
每隔10分钟构建一次:H/5 * * * *
每隔1小时构建一次: H H/1 * * *
每月30号构建一次: H H 30 * *
每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38)
H H(9-16)/2 * * 1-5
定时构建和轮询SCM使用互不冲突,我觉得开启SCM的话就忽略post-commit钩子吧,不然每次构建会跑两遍;
看到一篇不错的文章,有一些介绍持续集成知识的内容,推荐一下:Jenkins搭建.NET自动编译测试并实现半增量部署
Centos7部署配置Gitlab ↩︎
GitLab中配置SSH key ↩︎
用VS2017上传项目到码云gitee.com和基本命令 ↩︎
.gitigonre设置了却失效 ↩︎
centos7踩坑(二)安装git+jenkins ↩︎
CentOS 7 安装Mono 及 Hello World ↩︎
CentOS 7.2下安装Mono 5.0 ↩︎
Publish Over CIFS Plugin ↩︎
Jenkins定时构建,轮询SCM设置 ↩︎
向GitLab提交代码之后自动触发Jenkins构建 ↩︎
Jenkins定时构建,轮询SCM设置 ↩︎