五.docker+jenkins自动部署项目

一.敏捷开发相关概念

1.微服务的痛点

再来看一下我们的微服务架构 , 每个组件都需要服务器去部署,加起来可能需要几十个甚至上百个服务器。这样的微服务项目在部署上会遇到什么问题?

  • 需要很多很多的服务器,服务器的采购安装,布线都很麻烦
  • 每个服务都需要:编译,构建,打包,测试,发布,运维重复的工作量重复做
  • 操作麻烦(编译,打包,测试,发布,上线等等都很麻烦)
2.什么是DevOps

问题:软件的迭代过程包括,设计,编码,编译,构建,测试,发布,运维等等流程,早期的软件开发模式为瀑布式开发,这种开发模式迭代更新太慢,每个环境都需要耗费大量人力和时间成本。往往很长时间才迭代一次。如今企业追求的都是敏捷开发:快速开发快速迭代,尽可能的缩短软件的开发生命周期。
DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。
DevOps是一种方法或理念,它涵盖开发、测试、运维的整个过程。DevOps是提高软件开发、测试、运维、运营 等各部门的沟通与协作质量的方法和过程,DevOps强调软件开发人员与软件测试、软件运维、质量保障(QA)部 门之间有效的沟通与协作,强调通过自动化的方法去管理软件变更、软件集成,使软件从构建到测试、发布更加快 捷、可靠,最终按时交付软件。

DevOps是一套项目从开发到运维的解决方案,而不是具体的一个技术,DevOps需要整合一些列的技术来实现,比如:通过Git拉取代码,通过Mavn的命令进行项目的清理,编译,打包,测试等,通过Docker命令进行镜像构建…。
DevOps使用到的技术如:GitHub、Git/SVN、Docker、Jenkins、 Hudson、Ant/Maven/Gradle(编译,打包)、Selenium(自动化测试)、QUnit、JMeter(性能测试)等

下面普及2个概念

  • CI : Continuous Intergration : 持续集成 ,持续交付的核心意义:尽快的将最终的产品发布到线上环境,给用户使用。持续交付是每个企业追求的目标,我们常说的CI/CD里的CD一般指的就是持续交付
  • CD:Continuous Deployment :持续部署就是在持续交付的基础上,将编译、测试、打包部署到生产环境的过程做成自动化。
3.什么是敏捷开发

传统的瀑布式开发模型要求一个项目版本的所有功能都开发完成才会进行版本地迭代,这种开发模式不仅项目版本迭代速度慢,没法尽早的发现软件的质量问题,和持续的项目交付。
而敏捷开发最重要的目标是通过及早和持续不断地交付有价值的软件使客户满意;要达到这一目的就需要更高频率的版本迭代,包括:编译,打包,测试,运维。且应该自动化的完成,才有可能达到更快的软件开发生命周期。
敏捷与 DevOps 之间的主要区别在于:敏捷是关于如何开发和交付软件的哲学,而 DevOps 则描述了如何通过使用现代工具和自动化流程来持续部署代码。

4.什么是云原生

云原生的定义最早也是由 Pivotal 公司的 Matt Stine 于 2013 年提出的,云原生是基于分布部署和统一运管的分布式云 [1] ,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。 它具有:**DevOps、持续交付、微服务、容器、**等特点 。
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统做出频繁和可预测的重大变更。

5.什么是jenkins

Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。
起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。
允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。
它可以在代码上传仓库(如github,gitee,gitlab)后,在jenkins(一个网站界面)中通过获取代码仓库中最新代码,进行自动化部署,而省去手动打包、上传服务器、部署这一系列步骤,非常方便。

Jenkins的特性

  • 开源的java语言开发持续集成工具,支持CI,CD;
  • 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理;
  • 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告;
  • 分布式构建:支持Jenkins能够让多台计算机一起构建/测试;
  • 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;
  • 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。

二.Jenkins安装

1.方案设计

现在我们已经有docker的环境了,可以用来部署项目,现在我们只需要使用Jenkins实现一键部署即可,整体方案如下
image.png

  • 在和安装了docker的服务器上安装好jenkins
  • 程序员把代码提交到远程 git 仓库,jenkins可以自动从git仓库拉取代码到本地
  • jenkins安装好maven和jdk,然后执行 package 对代码进行打包如:app.jar
  • jenkins执行事先准备好的Dockerfile脚本构建docker镜像
  • jenkins执行shell脚本,根据镜像启动容器

上面的问题是安装docker和安装jenkins的服务器是同一个服务器,或者这样:
image.png

  • 在服务器上安装好jenkins
  • 程序员把代码提交到远程 git 仓库,jenkins可以自动从git仓库拉取代码到本地
  • jenkins安装好maven和jdk,然后执行 package 对代码进行打包如:app.jar
  • jenkins执行事先准备好的Dockerfile脚本构建docker镜像
  • jenkins把docker镜像推送到镜像仓库
  • 安装了k8s的服务器,从docker镜像仓库中拉取镜像然后启动容器
2.安装jenkins

准备jenkins映射的目录

#创建jenkins文件映射目录
mkdir /var/jenkins_home#给目录设置权限
chmod 777 /var/jenkins_home   

执行下面命令启动jenkins容器

docker run --privileged -d --name jenkins -p 9999:8080 -p 8888:8888 -p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home  \
-v /var/run/docker.sock:/var/run/docker.sock  \
-v $(which docker):/bin/docker jenkins/jenkins:latest-jdk17
  • -d : 后台运行
  • -p 8088:8080 : 将容器的8080端口映射到宿主的8088端口
  • -v /var/jenkins_home:/var/jenkins_home : 将容器中/var/jenkins_home的目录挂载到宿主的/mnt/jenkins_home
  • -v $(which docker):/bin/docker : 将宿主的docker目录映射到容器内,以便在容器中能使用docker对应的命令完成自动化部署

上面的操作已经将docker相互映射,但在jenkins容器中直接执行docker的命令时,可能会报权限不足。这个问题是容器中的docker是通过docker.sock的方式与宿主的docker通信的,其对应的可执行用户为root。此时我们可以将 /var/run/docker.sock 的权限放开来解决此问题

chmod 777 /var/run/docker.sock

然后在linux机器的 /usr/local/src/jdk 目录安装好JDK, 以及在 /usr/local/src/maven 目录安装好maven 请注意版本

3.jenkins初始化

更改jenkins插件下载地址,因为默认是去国外网站下载插件比较慢,而且容易下载失败,我们修改插件下载地址为国内地址

cd /var/jenkins_homevi hudson.model.UpdateCenter.xml修改地址为下面的地址https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

然后重启jenkins : docker restart jenkins

浏览器访问:http://服务IP:9999/ ,进入jenkins初始化页面
image.png
可以通过:docker logs jenkins 来查看密码 ,输入密码后,选择:安装推荐的插件

image.png

耐心等待安装完成进入下面界面,你可以创建一个新的管理员,或者使用admin账户继续
image.png
后面就一直下一步就可以了,安装完成后界面如下

4.安装插件

根据推荐安装好插件后,还需安装一个maven 插件,登录jenkins,找到插件管理
image.png
然后在可用插件一栏中,搜索:Maven Integration 插件进行安装
image.png

5.全局工具配置

接下来我们对maven做配置,找到 manager jenkins - tools
image.png
进去后,找到最下边的maven ,选择自动安装,如下
image.png
注意:如果采用jenkins自动安装方式可能会安装不上,我们可以自己解压一个maven到 -v 的目录中,然后设置好权限,比如:我上传了一个maven到linux中,然后他会自动同步到容器中去image.png
然后设置权限

chmod -R 777 /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.9.4

然后在全局工具设置出不要使用自动安装,而是指向上传的maven home.
image.png
然后保存退出即可

三.构建项目

1.项目导入插件

给要部署的项目安装好打包插件,并指定项目的名字如:

  • 打包后项目名为: app.jar
<build><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--docker的maven插件,官网: https://github.com/spotify/docker‐maven‐plugin--></plugins>
</build>

同时在项目根目录准备一个Dockerfile文件,内容如下

  • 大概的意思是就是基于Dockerfile把项目打包成docker镜像,并随着容器启动自动启动项目
FROM meddream/jdk17:latest
VOLUME /tmp
ADD ./target/app.jar /app.jar
ENV TZ=Asia/Shanghai
EXPOSE 10010
#CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar
ENTRYPOINT ["java", "-jar ", "/app.jar","--spring.profiles.active=prod"]
2.代码推送到远程

然后需要准备一个远程Git仓库,企业内部可能会选择搭建自己的Git私服,我这里就直接使用Gitee,把代码提送上去,如:
image.png

3.构建项目

回到jenkins的最外层 - 点击 新建 item
image.png
选择构建一个自由软件 - 指定构建的项目名 ,拉后确定
image.png
进去之后,找到 源码管理 - 指定你的代码仓库地址 ,以及添加账号
image.png
填好之后往下滚动,找到构建环境 - 选择调用顶层Maven目标
image.png
然后指定maven版本和目标: clean install -Dmaven.test.skip=true 该命令是对项目进行打包
image.png
点击保存退出,然后点击立即构建 - 查看构建日志
image.png
日志如下 - jenkins从尝试安装maven,然后从git下载代码后,进行 : clean install -Dmaven.test.skip=true 命令执行
image.png

4.启动项目容器

启动项目的原理是通过Dockerfile构建项目镜像,并自动启动容器 ,因为我们项目和jenkins在同一台服务器,所以我们用shell脚本运行项目,原理既是通过dockerfile 打包镜像,然后docker运行即可。接下来我们,修改jenkins任务配置 -
image.png
shell脚本如下:

  • 注意: 这个 install 目录和构建jenins项目时取的名字保持一样
cd /var/jenkins_home/workspace/gateway/it-drive-service-gateway
docker stop drive-gateway || true
docker rm drive-gateway || true
docker rmi drive-gateway || true
docker build -t drive-gateway .
docker run -id -p 10010:10010 --name drive-gateway drive-gateway:latest

解释:

  1. /var/jenkins_home/workspace/gateway/it-drive-service-gateway :是jenkins拉取的代码目录
  2. 当执行jenins项目构建,jenkins会执行install把我们的代码打包为jar
  3. 然后执行上面脚本,脚本通过docker file 来构建镜像并启动容器

image.png
然后执行构建,效果如下
image.png
然后回到docker,执行:docker ps 查看容器

为了方便理解,下面整理了一个流程图
image.png

  1. 程序员吧IDEA的代码推送到GIT远程仓库
  2. Jenkins通过Git客户端从Git仓库中拉取最新的代码
  3. Jenkins执行maven命令打包项目:clean install
  4. Jenkins执行脚本,cd到代码目录,执行docker build,根据Dockerfile 构建镜像
  5. 执行脚本 docker run 启动容器

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

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

相关文章

Day-06 基于 Docker 安装 Nginx 镜像

1.去官方公有仓库查询nginx镜像 docker search nginx 2.拉取该镜像 docker pull nginx 3. 启动镜像&#xff0c;使用nginx服务&#xff0c;代理本机8080端口(测试是不是好使) docker run -d -p 8080:80 --name nginx-8080 nginx docker ps curl 127.0.0.1:8080

微服务保护(Sentinel)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

云安全之等级保护详解

等级保护概念 网络安全等级保护&#xff0c;是对信息系统分等级实行安全保护&#xff0c;对信息系统中使用的安全产品实行按等级管理&#xff0c;对信息系统中发生的信息安全事件分等级进行响应、处置。 网络安全等级保护的核心内容是&#xff1a;国家制定统一的政策、标准&a…

横向AlGaN/GaN基SBD结构及物理模型数据库的开发

GaN基功率器件凭借其临界电场高、电子饱和漂移速度大、热导率高等优良性能在大功率快充、充电桩、新能源汽车等领域具备广泛应用空间。为进一步助推半导体高频、高功率微电子器件的发展进程&#xff0c;天津赛米卡尔科技有限公司技术团队依托先进的半导体TCAD仿真平台成功开发出…

计算机网络八股

1、请你说说TCP和UDP的区别 TCP提供面向连接的可靠传输&#xff0c;UDP提供面向无连接的不可靠传输。UDP在很多实时性要求高的场景有很好的表现&#xff0c;而TCP在要求数据准确、对速度没有硬件要求的场景有很好的表现。TCP和UDP都是传输层协议&#xff0c;都是为应用层程序服…

【Java 进阶篇】深入了解JDBCTemplate:简化Java数据库操作

数据库操作是几乎所有现代应用程序的一部分。从存储和检索数据到管理业务逻辑&#xff0c;数据库操作是不可或缺的。在Java应用程序中&#xff0c;JDBCTemplate是一种强大的工具&#xff0c;可帮助开发人员轻松进行数据库操作。本文将深入探讨JDBCTemplate&#xff0c;了解它的…

最新Uniapp软件社区-全新带勋章源码

测试环境&#xff1a;php7.1。ng1.2&#xff0c;MySQL 5.6 常见问题&#xff1a; 配置好登录后转圈圈&#xff0c;检查环境及伪静态以及后台创建好应用 上传图片不了&#xff0c;检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图&#xff0c;在前端uitl文件夹里面…

string类的使用方式的介绍

目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类&#xff1f; 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象…

2023年中国资产数字化监控运维管理系统行业分析:产品应用领域不断拓展[图]

资产监控运维管理是一门紧密结合生产实际的工程科学&#xff0c;是实现资产有效运营维护的重要手段。资产监控运维管理技术起源于美国和欧洲等国家和地区&#xff0c;经过几十年的理论研究和实际应用&#xff0c;资产监控运维管理技术为提高重大设备资产和系统的可靠性和安全性…

java Spring Boot 手动启动热部署

好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂&#xff0c;重启是一件非常麻烦的事 或者你在和前端同事联调&#xff0c;有一点小问题 你改完就要重启 前端还得等你&#xff0c;非常不友好 那…

PbootCMS SQL注入漏洞

漏洞复现 访问漏洞url 数据库是mysql 构造payload&#xff0c;条件为假时&#xff0c;未查到任何数据 http://x.x.x/index.php?search 1select 0页面回显 构造payload&#xff0c;条件为真时&#xff0c;查询到数据 1select1文笔生疏&#xff0c;措辞浅薄&#xff0c;望各…

SpringMVC系列-4 参数解析器

背景&#xff1a; 本文作为SpringMVC系列的第四篇&#xff0c;介绍参数解析器。本文讨论的参数解析表示从HTTP消息中解析出JAVA对象或流对象并传参给Controller接口的过程。 本文内容包括介绍参数解析器工作原理、常见的参数解析器、自定义参数解析器等三部分。其中&#xff0…

【前段基础入门之】=>CSS3的新增特性!

文章目录 CSS3概述CSS3私有前缀常见浏览器私有前缀 新增盒模型相关属性怪异盒模型拖拽调整盒子大小盒子阴影不透明度 新增背景属性background-originbackground-clipbackground-size多背景图backgorund 复合属性 新增边框属性边框圆角边框外轮廓 新增文本属性文本阴影文本换行文…

NPM 常用命令(九)

目录 1、npm link 1.1 使用语法 1.2 描述 2、npm login 2.1 描述 3、npm logout 3.1 描述 4、npm ls 4.1 使用语法 4.2 描述 5、npm org 5.1 使用语法 5.2 示例&#xff1a; 6、npm outdated 6.1 使用语法 6.2 描述 6.3 示例 7、npm owner 7.1 使用语法 7.2…

ipv6跟ipv4如何通讯

IPv6的128位地址通常写成8组&#xff0c;每组为四个十六进制数的形式。比如:AD80:0000:0000:0000:ABAA:0000:00C2:0002 是一个合法的IPv6地址。这个地址比较长&#xff0c;看起来不方便也不易于书写。零压缩法可以用来缩减其长度。如果几个连续段位的值都是0&#xff0c;那么这…

免费 AI 代码生成器 Amazon CodeWhisperer 初体验

文章作者&#xff1a;浪里行舟 简介 随着 ChatGPT 的到来&#xff0c;不由让很多程序员感到恐慌。虽然我们阻止不了 AI 时代到来&#xff0c;但是我们可以跟随 AI 的脚步&#xff0c;近期我发现了一个神仙 AI 代码生产工具 CodeWhisperer &#xff0c;它是一项基于机器学习的服…

众佰诚:抖音开网店新手怎么做才能做起来

抖音作为国内最热门的短视频平台&#xff0c;其商业价值也日渐凸显。许多商家和个体经营者开始在抖音上开设网店&#xff0c;以此为新的销售渠道。那么&#xff0c;对于新手来说&#xff0c;如何才能在抖音上成功运营网店呢? 首先&#xff0c;明确经营定位。每个电商平台都有其…

小谈设计模式(16)—抽象工厂模式

小谈设计模式&#xff08;16&#xff09;—抽象工厂模式 专栏介绍专栏地址专栏介绍 抽象工厂模式结构抽象工厂&#xff08;AbstractFactory&#xff09;具体工厂&#xff08;ConcreteFactory&#xff09;抽象产品&#xff08;AbstractProduct&#xff09;具体产品&#xff08;C…

FPGA project : fifo_sum

实验目标&#xff1a; col(列) 4 &#xff1b;line(行) 5。相邻三行&#xff0c;按列求和。输出新的数据流。 实现方法&#xff1a; 通过rs232通信协议&#xff0c;输入数据流。第一行存进fifo1&#xff0c;第二行存进fifo2.当输入第三行第一个数据的时候&#xff0c;从fif…

Verilog HDL阻塞赋值和非阻塞赋值笔记

1. module test( input wire clk, input wire b, output reg a, output reg c ); always(posedge clk) begin ab; ca; end endmodule 上面的代码在vivado中综合后的电路为&#xff1a; 2. module test( input wire clk, input wire b, outp…