当前位置: 首页 > news >正文

代码自动发布系统

 之前是jenkins发现gitlab代码更新了就自动获取直接部署到服务器

现在是jenkins自动获取Code之后打包成镜像上传到仓库然后通知docker去拉取更新的镜像

分析

旧∶
代码发布环境提前准备,以主机为颗粒度·静态
新:
代码发布环境多套,以容器为颗粒度·编译
 

git+gitlab+jenkins+tomcat+maven+harbor+docker

工作流程
1.开发人员提交代码至GitLab代码仓库

2. jenkins手动或自动触发项目构建
3.jenkins 拉取代码、代码编码、打包镜像、推送镜像至镜像仓库

4. Jenkins在Docker主机创建容器并发布应用
 

一、环境准备

主机规划

 准备5台主机

修改主机名称、ip、域名解析/etc/hosts添加五台主机ip  主机名称

关闭防火墙和selinux 

 查看时间同步服务,每小时同步一次时间是通过脚本实现的

如果没有时间同步服务器,可以直接使用ntpdate 百度一个ntp服务器的ip

 每小时运行一次ntpdate 命令

二、应用软件安装

2.1 jdk

通过ssh远程管理工具把安装包上传到服务器

在jenkins服务器上解压jdk安装包并配置环境变量

vim /etc/profile   添加环境变量   tail -2  查看日志的最后两行

   最后source /etc/profile  配置立即生效  再查看jdk的版本

2.2 jenkins

配置官方yum源,参考官方文档,如果yum源中的gpgcheck=1 开启了检测,就必须import导入密钥

 yum -y install jenkins

修改jenkins使用java

 vim /etc/rc.d/init.d/jenkins  83行添加一行 /usr/local/jdk/bin/java

 vim /etc/sysconfig/jenkins   19行加上/usr/local/jdk/bin/java

 设置开机自启

chkconfig --list  列出7种启动方式

只能使用chkconfig jenkins on 设置  enable不行

 启动jenkins

systemclt start jenkins   再访问jenkins服务的ip:8080端口

 

 直接cat查看管理员密码之后复制粘贴

 选择自动安装插件,如果网络不行一定要一次性安装好,离线安装会报错

最后用admin登录就行  密码就是开始复制粘贴的那个,建议修改

 

2.3 git

开发人员主机安装git
下载项目及上传代码至代码仓库

yum install git -y


2.4 gitlab

在gitlab服务器配置gitlab的清华源

 安装gitlab到gitlab服务器

yum install gitlab-ce -y

 修改gitlab配置文件 在13行把http://改成自己gitlab服务器的ip地址

vim /etc/gitlab/gitlab.rb

初始化并启动gitlab

 访问gitlab的web页面

 2.5 maven

Maven是一个java项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Maven的核心功能是合理叙述项目间的依赖关系,通俗点 就是通过pom.xml文件的配置获取jar包不用手动的去添加jar包

maven的tar包可以去apache官网下载

 jenkins里面也需要安装git来获取项目代码

yum -y install jenkins

2.6 docker

docker-ce需要通过官方文档安装到jenkins服务器、harbor服务器和web服务器

都需要修改删除docker.service文件

 添加daemon.json文件之前千万注意必须开启docker,不然无法保持修改

 

2.7 harbor

 

 最好systemctl restart docker 重启docker 

再验证harbor是否可用

docker login ip

密码:Harbor12345

 

 如果需要在harbor-server主机上打包容器应用镜像并上传,需要修改docker daemon

本例修改,请参照docker部署部分

docker安装直接复制粘贴官方文档

 修改daemon.json文件,配置harbor为docker的本地仓库

主要目的是为了jenkins可以自动获取harbor仓库打包的应用镜像发布给web服务器

如果不配置daemon.json文件,web服务器是找不到harbor仓库的

 

 2.8 web 服务器

安装docker-ce参考官方文档

 

 

三、配置ssh免密登录

3.1 添加开发者主机密钥到gitlab仓库

生成密钥对,公钥是加密的,私钥是解密验证的

 

 

 添加公钥到gitlab仓库

 

3.2 添加jenkins服务器的公钥和凭据到gitlab

添加公钥很简单,就是在服务生成密钥对ssh-keygen -t rsa /root/.ssh/id_rsa -C "标识" -P " "

复制jenkins服务器公钥粘贴到gitlab

主要是添加凭据访问gitlab,凭据就是私钥。

因为jenkins不能通过公钥访问gitlab,只能通过凭据或者用户名密码等

 点击凭据之后点击系统再点击全局凭据

复制jenkins服务器的私钥到jenkins作为凭据访问gitlab

 

 3.3 配置jenkins使用docker

验证系统中是否有jenkins用户,发现有,但是无法登录系统

 验证系统中是否有docker用户及用户组

 添加jenkins用户到docker用户组

就是给docker用户组添加一个jenkins附加组

 

3.4 安装jenkins插件

需要安装的插件:

ssh用于jenkins-server对web-server进行操作

git parameter(参数)用于git版本提交进行参数构建

gitlab用于jenkins-server拉取项目
gitlab hook用于项目自动构建

maven integration用于编译java项目


安装ssh,点击jenkins系统管理里面的插件管理然后搜索可用的插件 ssh

勾选之后点击直接安装就行

 安装git parameter插件

 安装gitlab和gitlab hook 插件

 

按照maven integration(集成)

 

3.5 jenkins全局配置

jenkins全局工具配置

一共就配置三个工具:jdk git  maven  

docker不配置是因为jenkins用户已经添加到了docker组的附加组

 JDK配置需要把自动安装取消

 Git配置如果不加git,jenkins就无法使用git参数

配置之前先在jenkins查看是否安装git 

git version

 Maven 配置

首先要确定系统中是否有maven

mvn -v 就能查看maven家目录

 3.6 jenkins系统配置

主要配置ssh插件,用于jenkins操作web-server,web-server执行命令。

jenkins需要ssh免密登录web服务器才能实现自动发布项目

所以jenkins还需要添加一个连接web服务器的凭据

如果web服务器比较少就可用用户名和密码作为凭据

注意:用户名root是web服务器的root用户  密码也是web服务器的密码 

点击系统设置

 

 实际工作中可以点击新增添加多台web服务器

四、项目发布

4.1 项目代码获取

--recurse 相当于 -R 递归   -submodules 子项目

https://gitee.com/dl88250/solo.git  是一个java编写的博客项目,子项目就是皮肤

注意:获取项目代码是是开发人员的主机

4.2 项目代码修改

主要修改项目如何连接数据库

克隆项目到本地之后查看src源码目录下的main目录下的resources下的

local.properties文件

 通过jdbc连接数据库,数据库安装在web服务器上,所以mysql通过jdbc连接web服务器的ip

注意:真实工作中一个项目单独一个数据库,而且处于删库跑路的安全考虑是不可能用root用户通过jdbc连接数据库的,一个项目一个库,数据库授予普通用户权限就行

solo就是项目数据库名称

 注意:web服务器上创建的数据库字符编码必须和配置文件一致是utf-8

4.3 安装项目数据库

在web-server安装mariadb数据库也可安装mysql数据库

 启动mariadb数据库,mysqladmin -uroot password "123456"  登录数据库

 创建solo项目数据库默认字符集utf8  排序规则不指定

utf8mb4_bin 是区分大小写的,也区分 e 和 é 这类字符的
utf8_genera_ci 是不区分大小写的,也不区分 e 和 é 这类字符
注:utf8_general_ci 是区分大小写的,但不区分 e 和 é 这类字符
如果需要区分带有音节的字符,又不想要区分大小写,可在 sql 查询对应字段时用 LOWER () 函数

 授权root用户访问solo数据库的所有表

 


4.4 项目代码上传到gitlab-server
 

创建项目的gitlab仓库

 

 上传项目代码

必须在开发者主机设置全局配置用户名和email,才能知道项目是谁上传的。

仓库里面有对应命令,可复制粘贴

进入solo项目目录移除原来的远程项目地址,因为gitlab仓库里面创建的这个solo项目是空的

但是之前获取的项目代码是从网络获取的(保险起见不管是从哪里获取的最好都移除重新添加本地主机为推送地址),所以必须移除网络推送地址才能成功上传项目到仓库

 添加开发者的主机作为本地仓库  推送地址就变成了开发者主机

 git add -A . 把当前项目代码放入暂存区  git 2.0版本支持git add .暂存删除的文件到暂存区

git commit -m "事务标识"  提交事务

git tag  版本号  给项目打版本号标签

git push origin master 指定远程仓库名和分支名。(这里只配置了本地仓库)

git push origin 版本号  指定上传打标签的版本1.0.0到本地开发者主机的仓库

 项目代码已经传送到了gitlab仓库中,可登录gitlab网页查看历史push events

4.5 创建项目运行的基础应用镜像

主要是tomcat容器应用镜像
第一步:创建一个项目目录

mkdir tomcatdir

第二步:在项目目录中创建Dockerfile文件 用来自动创建容器镜像

容器镜像越小越好,一定要把tomcat默认的访问页面删掉

重新创建一个项目目录ROOT可自定义

 编辑Dockerfile文件的前提是当前目录必须有jdk

所以把/usr/local/jdk 文件cp到项目目录

 第三步:构建tomcat容器镜像工程

自动下载Dockerfile中的文件

 第四步:上传容器镜像到harbor仓库

上传容器镜像之前先确定镜像是否存在docker images 

登录harbor之后上传打包好的镜像

 验证就很简单

先查看harbor项目镜像仓库是否存在上传的镜像

 再用web服务器直接运行就🆗 

 后台运行就会直接下载tomcat容器镜像到web服务器并运行 

 可用用docker inspect  容器id 查看容器的ip之后curl http://容器ip8080 

其实看不到什么

4.6 创建jenkins工程任务

第一步: jenkins获取项目代码
第二步: jenkins对项目代码编译,由maven完成
第三步:jenkins使用docker对编译完成的项目代码进行打包,打包成容器应用镜像

第四步: jenkins把打包的容器应用镜像上传到harbor
第五步:jenkins通过ssh插件完成对web-server运行容器应用镜像的操作

在jenkins网页点击新建任务,再点击构建一个maven项目

 任务构建时勾选参数化构建过程,Git Parameter

 填写tag标签  版本号

 选择git 然后粘贴克隆命令到url  添加凭据 最后要构建的分支填写$Tag版本参数

git 版本替换时确实要指定分支的,只不过这里的分支是版本号参数,为了实现自动更新版本

 如果项目中有子模块,必须新增sub-modules模块

 如果项目中有子模块必须勾选更新子模块选项,使用凭据是为了自动下载gitlab中的代码

 Build构建项目  配置pom.xml文件和清除之前 构建的包 跳过预构建测试

 jenkins服务器的数据存放目录/var/lib/jenkins 

添加一个本地执行shell 

 再添加一个远程执行shell

 maven  会把代码编译成war包,war是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。以Tomcat来说,将war包放置在其\webapps\目录下,然后启动Tomcat,这个包就会自动解压,就相当于发布了。

 

 jenkins在本地完成了镜像的打包并上传到了harbor仓库

web服务器要利用ssh远程的shell命令实现自动获取并运行项目镜像

 docker run -d --name blog-solo -v /usr/local/jdk/:/usr/local/jdk -p 80:8080 $REPOSITORY

运行容器 并挂载jdk  如果不想在web服务器安装jdk可以去掉这行挂载命令

4.8 项目发布过程

点击   基于参数构建parameters

 构建项目之后点击小三角符号之后点控制台输出

 控制台输出就会自动创建一个jenkins的workspace工作空间

/var/lib/jenkins/workspace/任务名称   这个workspace其实就是项目存放的位置

 可以看到workspace工作空间有上传到gitlab代码仓库的代码 src 是源码目录

 等jenkins把项目构建完成之后 就会出现target 里面有maven编译过的java代码的war包

 war包是一种web代码格式,可在tomcat中自动解压并运行

 skins目录就是放皮肤的

 docker rm 删除容器  docker rmi 删除镜像

 更换版本可以在开发者主机上的项目目录打标签 版本号  之后push上传到jenkins就行

 如果docker start 之后 docker ps --all 多次发现容器没有启动

 第一步:查看message日志

less /var/log/message

 第二步: 进入数据库目录查看数据库log

 第三步:查看docker logs 容器id

 一定会发现容器172.17.0.2 不允许连接到数据库

 因为之前授权的时候就授权了一个web主机的ip

必须登录数据库把授权改成%  允许所有主机登录项目数据库

 如果发布项目需要到测试环境的话,可添加一台测试主机和jenkins测试节点

 

相关文章:

代码自动发布系统

之前是jenkins发现gitlab代码更新了就自动获取直接部署到服务器 现在是jenkins自动获取Code之后打包成镜像上传到仓库然后通知docker去拉取更新的镜像 分析 旧∶ 代码发布环境提前准备,以主机为颗粒度静态 新: 代码发布环境多套,以容器为颗粒度编译 …...

qemu-基础篇(一)——安装

文章目录 env安装查看版本查看支持的开发板查看支持的CPU的型号 env ubuntu 安装 sudo apt-get install qemu sudo apt-get install qemu-system-arm sudo apt-get install qemu-system查看版本 qemu-img -V qemu-system-arm --version qemu-system-aarch64 --version返回结…...

从根本上理解Synchronized的加锁过程

作为一个Java开发,对于Synchronized这个关键字并不会陌生,无论是并发编程,还是与面试官对线,Synchronized可以说是必不可少。 在JDK1.6之前,都认为Synchronized是一个非常笨重的锁,就是在之前的《谈谈Java…...

CANOE入门到精通——CANOE系列教程记录1 第一个仿真工程

本系列以初学者角度记录学习CANOE,以《CANoe开发从入门到精通》参考学习,CANoe16 demo版就可以进行学习 概念 CANoe是一种用于开发、测试和分析汽车电子系统的软件工具。它通过在不同层次上模拟汽车电子系统中的不同部件,如ECU、总线和传感…...

JavaEE——单例模式

文章目录 一、介绍什么是单例模式二、饿汉模式三、懒汉模式四、讨论两种模式的线程安全问题 一、介绍什么是单例模式 在介绍单例模式之前,我们得先明确一个名词设计模式。 所谓设计模式其实不难理解,就是在计算机这个圈子中,呢些大佬们为了…...

关于数据倾斜

1、数据倾斜表现 1.1 hadoop中的数据倾斜表现 有一个多几个Reduce卡住,卡在99.99%,一直不能结束。各种container报错OOM异常的Reducer读写的数据量极大,至少远远超过其它正常的Reducer伴随着数据倾斜,会出现任务被kill等各种诡异…...

Shell第一次作业

要求: 1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 ​2、判断web服务是否运行(1、查看进程的方式判断该程序是否运行,2、通过查看端口的方式判断…...

实例解读nn.AdaptiveAvgPool2d((1, 1))

nn.AdaptiveAvgPool2d((1, 1))在PyTorch中创建一个AdaptiveAvgPool2d类的实例。该类在输入张量上执行2D自适应平均池化。 自适应平均池化是一种池化操作,它计算每个输入子区域的平均值并产生一个指定大小的输出张量。子区域的大小是根据输入张量的大小和输出张量的…...

泛型编程 之模板(template)

C另一种编程思想称为 泛型编程,主要利用的技术就是模板 目录 C另一种编程思想称为 泛型编程,主要利用的技术就是模板 一、概念 二、函数模板 1、语法与使用: 2、函数模板注意事项 3、普通函数与函数模板的区别 4、普通函数与函数模板的调用规…...

用ChatGPT问DotNet的相关问题,发现DotNet工程师的前景还不错

本人最近费了九牛二虎之力注册了一个ChatGPT账号,现在就给大家分享一下,问一下关于.NET的问题,看看ChatGPT的AI功能具体如何? 一、C#跟其它语言比较的优势 回答: C#是一门编程语言,它是为 Microsoft 的 …...

LeetCode_字符串_简单_415.字符串相加

目录 1.题目2.思路3.代码实现(Java) 1.题目 给定两个字符串形式的非负整数 num1 和num2,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将…...

Insix:面向真实的生成数据增强,用于Nuclei实例分割

文章目录 InsMix: Towards Realistic Generative Data Augmentation for Nuclei Instance Segmentation摘要本文方法数据增强方法具有形态学约束的前景增强提高鲁棒性的背景扰动 实验结果 InsMix: Towards Realistic Generative Data Augmentation for Nuclei Instance Segment…...

CleanMyMac X4.13.2最新版下载

现在cleanmymac x4.13.2中文版是大家首选的优秀mac清理软件。CleanMyMac集合了多种功能,几乎可以满足用户所有的清洁需求。它不仅包含各种清理功能,还具有卸载、维护、扩展、碎纸机等实用功能,可同时替代多种工具。它可以清理、优化、维护和监…...

机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

目录 引言 二、线性回归 三、逻辑回归 四、支持向量机 五、决策树 六、随机森林 七、K-均值聚类 八、主成分分析(PCA) 九、K近邻算法 十、朴素贝叶斯分类器 十一、神经网络 十二、AdaBoost 十三、梯度提升树(Gradient Boosting T…...

Spring Security 6.0系列【32】授权服务器篇之默认过滤器

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 本系列Spring Authorization Server 版本 1.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 前言1. OAuth2Authorizati…...

.NET中比肩System.Text.Json序列化反序列化组件MessagePack

简介 官方定义:MessagePack是一种高效的二进制序列化格式。它允许您像JSON一样在多个语言之间交换数据。但是它更快并且更小。 MessagePack是一种开源的序列化反序列化组件,可支持JAVA,C#等主流语言。在 C# 中使用 MessagePack&#xff0c…...

Oracle删除列操作:逻辑删除和物理删除

概念 逻辑删除:逻辑删除并不是真正的删除,而是将表中列所对应的状态字段(status)做修改操作,实际上并未删除目标列数据或恢复这些列占用的磁盘空间。比如0是未删除,1是删除。在逻辑上数据是被删除了&#…...

找出字符串中第一个匹配项的下标、求解方程----2023/5/2

找出字符串中第一个匹配项的下标、求解方程----2023/5/2 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1…...

23:宁以non-member、non-friend替换member函数

想象有个class用来表示网页浏览器。这样的class可能提供的众多函数中,有一些用来清除下载元素高速缓存区、清除访问过的URLs的历史记录、以及移除系统中的所有cookies: class WebBrowser{ public:void clearCache();void clearHistory();void removeCoo…...

Centos7安装Redis

一、安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装 [rootlocalhost local]# yum install -y gcc 二、下载并解压安装包 [rootlocalhost l…...

云计算——弹性云计算器(ECS)

弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...