前言

  本人是一家互联网公司的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端口的宿主映射会提示“端口已被占用”

换其他端口,开始部署,显示部署日志

容器部署成功会有邮件提醒。

部署日志

【EasyCi】持续集成交付,一键式自动化部署系统,开箱即用的更多相关文章

  1. vsts + XX云服务器构建netcore+docker持续集成交付部署

    持续集成交付部署是什么意思,它给我们带来什么好处? 先贴一张图 持续集成(Continuous Integration) 持续集成强调开发人员提交了新代码之后,立刻进行构建.(单元)测试(这个要看情况 ...

  2. .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统

    .NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言     相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...

  3. .NET 半天搭建Jenkins持续集成与自动化部署系统

    前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们所做的系统业务复杂,系统庞大,设计到多个系统之间的合作,而核心系统更是采用分布式系统架构,由 ...

  4. 持续集成之应用k8s自动部署

    持续集成之应用k8s自动部署 Intro 上次我们提到了docker容器化及自动化部署,这仅仅适合个人项目或者开发环境部署,如果要部署到生产环境,必然就需要考虑很多因素,比如访问量大了如何调整部署,如 ...

  5. 持续集成工具Jenkins安装、部署、使用

    本文介绍jenkins,利用其做项目发布与持续集成交付工具. 一.Jenkins是什么? Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布 ...

  6. 【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)

    写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 服务器规划 IP 主机名 节点 操作 ...

  7. 三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境

    写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 文章和搭建环境所需要的yml文件已收 ...

  8. Jenkins持续集成(下)-Jenkins部署Asp.Net网站自动发布

    环境:Windows 2008 R2.Jenkins2.235.1.Visual Studio 2017: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成S ...

  9. centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解

    centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...

随机推荐

  1. FreeSql (二十一)查询返回数据

    FreeSql 采用 ExpressionTree 优化读取速读,如果懂技术的你一定知道 .NETCore 技术下除了原生代码,最快就是 Emit 和 ExpressionTree. 项目在初期使用的 ...

  2. 搜索专题题解(FJUT - OJ 17级搜索强化训练)

    题目连接:http://120.78.128.11/Contest.jsp?cid=221#H 题目都比较难,每道题都很经典,我也做的很慢,这篇博文算是个收录.具体题目题解点击下面超链接吧. 一.Br ...

  3. C#基础知识总结(二)--泛型

    什么是泛型 我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为 ...

  4. 年年有余之java求余的技巧集合

    背景 传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着雨水一起降落在了共光,龙王怕玉皇大帝责怪,灵机一动便声称他 ...

  5. [C++] 头文件中不要用using namespace std

    先总结下: 1. using namespce std:尽量不要(或者强硬一点,不许)在头文件中使用. 解析: 不让这么用,主要原因就是防止名字重复(即自定义变量名和std中名字重复),因为头文件会被 ...

  6. Spring Boot2 系列教程(八)Spring Boot 中配置 Https

    https 现在已经越来越普及了,特别是做一些小程序或者公众号开发的时候,https 基本上都是刚需了. 不过一个 https 证书还是挺费钱的,个人开发者可以在各个云服务提供商那里申请一个免费的证书 ...

  7. 用Python构造ARP请求、扫描、欺骗

    目录 0. ARP介绍 1. Scapy简述 2. Scapy简单演示 2.1 安装 2.2 构造包演示 2.2.1 进入kamene交互界面 2.2.2 查看以太网头部 2.2.3 查看 ICMP ...

  8. Redis 相关功能和实用命令(五)

    慢查询原因分析 由于 Redis 是单线程的,它内部维护了一个命令队列,所以当有耗时的命令出现时,比如 keys *,后面的命令会被阻塞,通查查出慢查询可以对服务进一步优化. 设置慢查询阀值:默认10 ...

  9. ZK 网络故障应对法

    网络故障可以说是分布式系统天生的宿敌.如果永远不发生网络故障,我们实际上可以设计出高可用强一致的分布式系统.可惜的是不发生网络故障的分布式环境还不存在,ZK 使用过程中也需要小心的应付网络故障. 让我 ...

  10. Spring MVC-从零开始-view-向页面传递data(ModelAndView)

    1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...