代码自动发布系统

news2024/10/7 6:45:38

 之前是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测试节点

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Typora设置修改字体颜色快捷键

目录 1.typora如何设置修改字体颜色快捷键 2. AutoHotKey软件安装 3.typora关于AutoHotKey的具体操作 1.typora如何设置修改字体颜色快捷键 typora本身是不能直接修改字体颜色的,不过若是想修改还是可以用一些代码去改变的,但是每次都修改一次实在麻烦…

mysql常用的基础命令

通过学习mysql命令提高数据处理和工作效率 基础命令 1.登录MySQL mysql -u root -p 2.查看当前系统所有数据库 show databases; 3.切换数据库 use 数据库名称 4.查看数据库下的所有表 show tables; 5.查看表结构; desc 表名; 6.创建数据库 crea…

MAC OS(M1)安装配置miniconda

一、下载安装miniconda miniconde官网:Miniconda — Conda documentation M1最低只能适配到python3.8 打开终端,进入安装包所在文件夹,使用命令进行安装 bash Miniconda3-latest-MacOSX-arm64.sh一路回车 二、配置环境 安装完成后重启终端&#xf…

Unity ads广告插件的使用

介绍 Unity Ads SDK 由领先的移动游戏引擎创建,无论您在 Unity、Xcode 还是 Android Studio 中进行开发,都能为您的游戏提供全面的货币化框架。 使用 Unity Ads 将各种广告格式合并到游戏中的自然呈现点中。例如,您可以实施激励视频广告来构建更强大的游戏经济,同时为您的…

[C++笔记]vector

vector vector的说明文档 vector是表示可变大小数组的序列容器(动态顺序表)。就像数组一样,vector也采用连续的存储空间来储存元素。这就意味着可以用下标对vector的元素进行访问,和数组一样高效。与数组不同的是,它的大小可以动态改变——…

1700页,卷S人的 Java《八股文》PDF手册,涨薪跳槽拿高薪就靠它了

大家好,最近有不少小伙伴在后台留言,又得准备面试了,不知道从何下手! 不论是跳槽涨薪,还是学习提升!先给自己定一个小目标,然后再朝着目标去努力就完事儿了! 为了帮大家节约时间&a…

Mybatis一级缓存和二级缓存(带测试方法)

目录 一、什么是缓存 二、Mabtis一级缓存 (1)测试一级缓存 (2)清空一级缓存 三、Mybatis二级缓存 (1)开启二级缓存 (2)测试二级缓存 一、什么是缓存 缓存是内存当中一块存储数…

蓝桥杯嵌入式第十一届省赛题目解析

写完第十一届蓝桥杯嵌入式省赛题目,拿出来给大家参考参考,也是让大家一起测试看看有什么问题还需要改进,代码在最后喔。 目录 客观题: 程序设计题 : 题目解析: CubeMX配置 代码演示 : 客观…

Windows环境下实现设计模式——职责链模式(JAVA版)

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现职责链模式(设计模式)。 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式&#xff…

spring boot Websocket(使用笔记)

使用websocket有两种方式:1是使用sockjs,2是使用h5的标准。使用Html5标准自然更方便简单,所以记录的是配合h5的使用方法。 1、pom 核心是ServerEndpoint这个注解。这个注解是Javaee标准里的注解,tomcat7以上已经对其进行了实现&a…

学内核之十八:纸上得来终觉浅,绝知此事要躬行

目录 0 前言 1 ioremap、vmalloc与原子上下文 2 copy_to_user与进程上下文 3 fasync与指针初始化 4 wait_event_interruptible与条件变量 0 前言 大家都知道,内核开发跟应用开发,体验是完全不同的,尤其是驱动。一方面要掌握扎实的语言基…

MySQL 基本轮廓

目录 什么是数据库 主流数据库 基本使用 连接服务器 服务器管理 使用案例 创建数据库 使用数据库 创建数据库表 表中插入数据 查询表中的数据 服务器,数据库,表关系 MySQL架构 什么是数据库 存储数据用文件就可以了,为什么还要弄…

每日一问-ChapGPT-20230409-中医基础-四诊之望诊

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230409-中医基础-四诊之望诊中医中的望闻问切介绍,以及对应的名家望诊的具体细节望诊拓展当日总结每日一问-ChapGPT系列起因 近来看了新闻,看了各种媒体,抖音,官媒&#xff…

【数据库原理 • 四】数据库设计和规范化理论

前言 数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前…

jvm调优一:从源码级别了解jvm类加载机制

目录 一、类加载运行全过程 类加载器加载类的过程 二、类加载器和双亲委派机制 类加载器类型 类加载器初始化过程 双亲委派机制 为什么要设计双亲委派机制? 全盘负责委托机制 一、类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c…

Kube-proxy 使用 iptables 模式时,通过 Service 服务发布入口如何到达 Pod ?

写在前面 被问到这个问题,整理相关的笔记当 kube-proxy 模式设置为 iptables 的时候,通过 SVC 服务发布入口如何到达 Pod?博文内容涉及: 问题简单介绍三种常用的服务发布方式到Pod报文路径解析 当前集群为版本为v1.25.1Demo 演示使…

linux内核结构以及内核模块编程

1、linux内核结构 1.1、单内核与微内核结构 1.1.1、什么是单内核结构和微内核结构 linux操作系统是一个单内核的结构,它的各个子系统之间可以直接调用 比如说文件系统、内存管理、进程管理以及网络系统和进程间通信它们互相之间可以直接调用只有一些核心的代码它…

记录npm的安装过程

一、访问官网(https://nodejs.org/en),下载nodejs并安装: 然后一路点击next直到安装完成,环境变量已经自动添加好了: 通过设置环境变量,改变本地仓库地址: 可以看到,…

一条更新语句的执行流程又是怎样的呢?

当一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表T上所有缓存结果都清空。这也就是我们一般不建议使用查询缓存的原因。 接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用ID这个索引。然…

LNMP网站框架搭建(yum方式安装)

1. nginx 的yum安装 1.1 搭建nginx相关的yum源 注意:本次安装所获得的软件包都是来源于httpd源(都是由该软件包厂商提供)。所以切记不能像往常一样直接使用本地源去安装一切包 vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx…