前言

  本人是一家互联网公司的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. null==a和a==null的区别

    在项目代码中在if判断中会经常看到一些老司机这样写:if(null == a),而我由于习惯会写成if(a == null),这两种有什么区别呢? 其实两种并没有什么区别,只是前者在细节处理上.我们在 ...

  2. .Net基础篇_学习笔记_第四天_if结构

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. java语言的开发环境

    1.Java  EE和Java  SE Java SE(Java  Platform Standard Edition)标准版:是在java基础阶段主要学习的内容,该技术是java的最核心技术,适合小 ...

  4. TCGA各种肿瘤数据的20多种不同玩法/挖掘方法

    肿瘤基因组图谱 (The Cancer Genome Atlas,TCGA) 计划是由美国国家癌症研究院(National Cancer Institute,NCI)和美国国家人类基因组研究所(Nat ...

  5. 反射的应用、获取Class类实例

    *准备工作: 包结构:* ======================= Person.java代码: package com.atguigu.java; public class Person { ...

  6. log4j日志不输出的问题

    今天服务器上报错,想先去看一下日志进行排查,结果发现日志很久都没有输出过了.从上午排查到下午,刚刚解决,因此记录一下,但现在也只是知其然,并不知其所以然,所以如果大家有什么想法请在下方评论. 先说一下 ...

  7. uboot学习之uboot启动流程简述

    一.uboot启动分为了三个阶段BL0.BL1.BL2:BL0表示上电后运行ROM中固化的一段程序,其中ROM中的程序是厂家写进去的,所以具体功能可能根据厂家芯片而有所不同.功能如下: 初始化系统时钟 ...

  8. 基于vue实现搜索高亮关键字

    有一个需求是在已有列表中搜索关键词,然后在列表中展示含有相关关键字的数据项并且对关键字进行高亮显示,所以该需求需要解决的就两个问题: 1.搜索关键词过滤列表数据 2.每个列表高亮关键字 ps: 此问题 ...

  9. video.js 使用中抛出异常:DOMException: "'#1098942864706113536' is not a valid selector"

    原因:video.js 在获取页面元素时使用的是querySelector方法,由于querySelector是按css规范来实现的,所以它传入的字符串中第一个字符不能是数字. 解决:元素Id在赋值时 ...

  10. Java 8 时间日期使用

    一.日期时间 Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理.java.util.Date和SimpleDateFormatter都不是线程安全的 ...