五.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.hqwc.cn/news/127133.html

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

相关文章

【iOS】——仿写计算器

文章目录 一、实现思路二、实现方法三、判错处理 一、实现思路 先搭建好MVC框架&#xff0c;接着在各个模块中实现各自的任务。首先要创建好UI界面&#xff0c;接着根据UI界面的元素来与数据进行互动&#xff0c;其中创建UI界面需要用到Masonry布局。 二、实现方法 在calcu…

【C++面向对象侯捷下】4. pointer-like classes,关于智能指针 | 5. function-like classes,所谓仿函数

文章目录 4. pointer-like classes,关于智能指针pointer-like classes,关于智能指针 shared_ptrpointer-like classes,关于迭代器5. function-like classes&#xff0c;所谓仿函数【不懂&#xff0c;跳过】 4. pointer-like classes,关于智能指针 pointer-like classes,关于智…

win11系统下,将WSL2从系统盘(C盘)迁移到迁移到数据盘(D盘)

WSL2迁移磁盘 网上的一些方法 今天希望把WSL迁移到D盘&#xff0c;原因就是C盘剩余空间太少了&#xff0c;系统有一点卡顿&#xff0c;然后百度了一下迁移的方法&#xff0c;发现真的是八仙过海&#xff0c;各显神通啊&#xff0c;改注册表、exclude为.tar然后重新导入等等&a…

阿里云轻量应用服务器有月流量限制吗?

阿里云轻量应用服务器限制流量吗&#xff1f;部分限制&#xff0c;2核2G3M和2核4G4M这两款轻量应用服务器不限制月流量&#xff0c;其他的轻量服务器套餐有月流量限制。 腾讯云轻量应用服务器价格便宜&#xff0c;活动页面&#xff1a;aliyunbaike.com/go/tencent 细心的同学看…

Eclipse iceoryx™ - 真正的零拷贝进程间通信

1 序言 通过一个快速的背景教程&#xff0c;介绍项目范围和安装所需的所有内容以及第一个运行示例。 首先&#xff1a;什么是冰羚&#xff1f; iceoryx是一个用于各种操作系统的进程间通信&#xff08;IPC&#xff09;中间件&#xff08;目前我们支持Linux、macOS、QNX、FreeBS…

掌握 BERT:自然语言处理 (NLP) 从初级到高级的综合指南(1)

简介 BERT&#xff08;来自 Transformers 的双向编码器表示&#xff09;是 Google 开发的革命性自然语言处理 (NLP) 模型。它改变了语言理解任务的格局&#xff0c;使机器能够理解语言的上下文和细微差别。在本文[1]中&#xff0c;我们将带您踏上从 BERT 基础知识到高级概念的旅…

【单元测试】如何使用 JUnit5 框架?

JUnit5 单元测试框架使用教程 一、Junit5 是什么&#xff1f; Junit5是一个用于在Java平台上进行单元测试的框架。JUnit 5 框架主要由三部分组成&#xff1a;JUnit Platform、JUnit Jupiter 和 JUnit Vintage。 JUnit Platform&#xff1a;定义了测试引擎的 API&#xff0c;是…

No168.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【Python从入门到进阶】38、selenium关于Chrome handless的基本使用

接上篇《37、selenium关于phantomjs的基本使用》 上一篇我们介绍了有关phantomjs的相关知识&#xff0c;但由于selenium已经放弃PhantomJS&#xff0c;本篇我们来学习Chrome的无头版浏览器Chrome Handless的使用。 一、Chrome Headless简介 Chrome Headless是一个无界面的浏览…

基于支持向量机SVM和MLP多层感知神经网络的数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 一、支持向量机&#xff08;SVM&#xff09; 二、多层感知器&#xff08;MLP&#xff09; 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .…

mysql面试题25:数据库自增主键可能会遇到什么问题?应该怎么解决呢?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:数据库自增主键可能会遇到什么问题? 数据库自增主键可能遇到的问题: 冲突问题:自增主键是通过自动递增生成的唯一标识符,但在某些情况下可能会…

AI产品经理-能力模型

一、概况 AI产品经理/助理&#xff08;需求工程师&#xff09;&#xff1a;大多数入门的AI产品经理应该都在这里&#xff0c;顾名思义&#xff0c;就是在整体产品规划中帮助大PD实现部分产品功能的助理或者需求工程师&#xff0c;需要具备比较强的AI知识框架与理解能力以保障各…