前言
本人是一家互联网公司的java开发,由于公司初期公司未招运维人员,恰好我对linux比较熟悉,便在公司服务器搭建了一套Jenkins、Gitlab、Maven私服、Docker私服、Sonarqube、ELK、FastDFS等一套持续集成的运维环境。
后来发现,运维这块以后也归我管了……平时做系统开发,还要兼职运维,一些前端或者后端的发布都要找我来创建Jenkins 项目、添加gitlab hook、添加dockerfile文件等等。
所以就想自己写一套简单的持续化集成发布的系统。便有了接下来的EasyCi。
EasyCi系统开发的目的是免去远程发布的免密登陆、拉取gitlab代码的认证、手动添加gitlab hook、查看gitlab中该项目的git地址等等多余的操作。这些操作均有后台自动完成,系统提供运行环境一键安装脚本、自动化安装部署本系统、开箱即用,只需要几个参数即可实现项目的远程构建,暂时只支持vue和java项目的构建。
Easyci系统采用B/S架构,后端采用springboot框架、前端采用Vue的element ui、数据库采用mysql、运行工具为shell脚本、采用websocket进行实时日志传输。
由于系统由本人独立开发,对前端开发不是很擅长,页面比较简单,只为实现基本功能,后续会对功能和页面进行优化。
系统架构
Jenkins系统架构
工具链
Jenkins:集成各种工具,持续集成、持续交付
Gitlab:代码托管库,通过gitlab hook触发Jenkins持续集成交付
Maven私服:私有jar包仓库
Docker私服:私有docker镜像仓库,用于远程构建
Sonarqube:代码审查工具
ELK:日志手机系统、分析系统
流程
1.Jenkins集成gitlab、maven、docker、sonarqube,安装各种插件
2.开发人员提交代码到gitlab,触发gitlab hook中添加的jenkins项目url进行jenkins构建
3.jenkins自动拉取该项目的gitlab代码,进行打包、再打包成docker镜像,docker镜像提交到docker私服
4.连接需要发布的服务器,拉去docker私服中该项目的镜像,docker run运行容器
5.Jenkins构建项目运行完成后添加gitlab tag并提交gitlab作为以后回滚的依据
6.Jenkins构建失败则自动拉取最新的gitlab tag重新构建,执行回滚,回滚再次构建失败便停止
7.构建成功或者回滚成功或者回滚失败都会通过linux的sendmail发送邮件提醒,并附加构建日志
8.构建的代码会通过sonarqube插件上传sonarqube进行代码审查
系统图
EasyCi系统架构
工具链
EasyCI:easyci系统后台,调用shell脚本、通过接口将结果返回前端
EasyCI-UI:easyci系统前台,vue。调用后台接口展示数据
Gitlab:代码托管工具,通过gitlab hook触发easyci持续集成交付
shell脚本:linux脚本
Docker私服:私有docker镜像仓库,用于远程构建
MySQL:easyci系统数据库
流程
1.根据安装文档安装系统,启动系统
2.访问系统首先需要验证gitlab:gitlab的url、用户名和密码。用于选择项目构建、服务器拉取代码验证、自动添加hook,免去手动操作。
3.添加远程发布服务器:服务器ip、端口、用户名、密码。后台自动完成服务器间的免密登录,用于项目远程发布、查看服务器容器以及容器的各种操作。
4.部署:选择项目url、输入docker容器端口映射关系、选择项目类型、输入收件人邮箱、选择部署服务器,只需要输入两项内容即可完成部署。
5.点击部署,会弹出窗口显示系统部署日志。
6.部署会自动添加easyci的hook接口url到该部署项目的hook中,用于自动触发构建。
7.部署完成自动发送邮件给收件人邮箱,显示构建结果、构建时间、构建项目、构建日志。
8.后续开发人员提交代码到该项目的gitlab,会触发gitlab的hook调用easyci接口,查询之前部署的信息进行自动部署,实现持续集成。
9.页面展示easyci本机正在运行的容器和添加的远程服务器正在运行的容器,支持数据自动刷新与关闭
10.可以选择添加的远程服务器,查看该服务器的容器列表
11.容器操作:可点击启动 、停止、重启、销毁在页面对服务器中运行的容器进行操作,即docker start|stop|restart|rm 容器名称
12..容器实时日志:点击日志,可以查看该容器的实时日志,即docker logs -f 容器名称
安装教程
1.系统准备
- 本系统仅支持Centos7系统
- 配置2H4G
- 固定好ip
1.在公司服务器中分出一个虚拟机作为easyci的运行环境,要求如上图所示。
注意:该虚拟机最好不要运行其他服务,因为easyci会先在本地运行容器测试部署结果,再发送到远程服务器运行容器,要注意端口占用。
2.将easyici.zip通过winscp或者xftp等。
这里我放到/root目录下。
3.通过xshell或者其他工具连接服务器。
4.进入/root目录,将easyci.zip解压
如果解压unzip没有命令,可以执行 yum install -y unzip 安装
再次解压。解压后生成easyci文件夹。
5.进入easyci文件夹
6.编辑install.sh,修改第35行中的localhost修改为本机ip
- vi install
按住“ℹ️”进入编辑,修改localhost为本机ip
修改完成后,按“Esc”退出编辑状态,按“:”输入wq回车,保存。
该install脚本为easyci系统部署所需要所有工具的安装,可按需调整。
7.运行install脚本,进行系统安装
- bash install.sh
系统安装会持续20分钟左右,具体看网速。
出现下图,表示系统所需工具初步安装完成。
8.重载/etc/profile配置文件。
- source /etc/profile
测试java、maven、node等命令是否正常安装。
- java -version
- mvn -v
- node -v
- npm -v
ok,工具按住完成。
9.永久关闭selinux
- vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled
设置后需要重启才能生效。
10.开放mysql的root用户远程访问。
- mysql -hlocalhost -uroot -p123456
- grant all privileges on *.* to root@"%" identified by ".";
- flush privileges;
- exit
11.启动系统
进入easyci系统家目录/home/easyici
执行./startEasyCi.sh启动系统
- netstat -tunlp | grep -E "9875|81"
查看前端81端口和后端9875端口是否开启成功。
使用教程
1.访问系统 浏览器打开 ip:81
系统启动首先需要验证gitlab。
gitlaburl:输入gitlab的地址,不要加http:
用户名密码:建议用户名和密码输入管理员root的用户名和密码。
注:这里的密码不要包含@ / 等特殊符号,否则免认证拉取git代码会失败
此处输入点击登录,后台会调用gitlab api拿到access-token,用于在服务器中拉取免密拉取代码、部署时选择构建的项目。
2.添加远程部署服务器
输入信息点击添加,系统会系统生成本服务器的公钥,添加到该服务器的认证文件中实现免密登陆。
添加完成之后会展示该服务器的docker容器列表,可以进行启动、停止、重启、销毁、查看实时日志操作。
添加服务器完成,会显示本机的容器列表和添加服务器的容器列表。
如果有多个远程服务器,可以选择某个服务器,查看该服务器的容器列表,也可以开启自动刷新,实时刷新容器数据。
“启动|停止|重启|销毁”等操作同步docker start|stop|restart|rm 容器名称。
“日志”可以查看该服务器的实时日志,即docker logs -f -tail 200 容器名称。查看该容器近200行日志,并实时刷新。
3.项目构建
点击选择需要部署的gitlab醒目
端口输入端口映射对。
由于是采用docker容器运行。需要设置映射端口
例如6000:5000
前面的6000为宿主机对外访问开放的端口,后面的5000为构建项目的端口,注意“:”为英文状态下
项目语言选择vue或者java。
收件人邮箱:如果有多个以“,”分割
部署方式:选择要部署的服务器。
注意:本系统是在本地先运行测试容器是否正常运行。运行正常则本地会删除容器释放端口,再发布到远程服务器运行。
所以注意本地端口占用。系统初始端口如下:
22、25、81、5000、3306、9875、68、323
即端口映射前面的端口不能为上述端口。
如果本地或者远程端口被占用,会停止构建,弹窗提醒。
这里easyci本地运行的docker私服占用了5000端口,再发布5000端口的宿主映射会提示“端口已被占用”
换其他端口,开始部署,显示部署日志
容器部署成功会有邮件提醒。
部署日志