Docker+Jenkins+Tomcat(保姆级教学)

为了防止文档发了没人看,我在文档里偷偷埋了几个雷 ?

1**、简介**

什么是持续集成( Continuous integration )?
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一
次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测
试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够
更快的开发内聚的软件。
如果没有持续集成

  1. 项目做模块集成的时候,发现很多接口都不通 ==> 浪费大量时间
  2. 需要手动去编译打包最新的代码 ==> 构建过程不透明
  3. 发布代码,上线,基本靠手工 ==> 脚本乱飞
    持续集成的好处
  4. 降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少;
  5. 对系统健康持续检查,减少发布风险带来的问题;
  6. 减少重复性工作;
  7. 持续部署,提供可部署单元包;
  8. 持续交付可供使用的版本;
  9. 增强团队信心;
    所以为了实现项目的持续集成,我们需要自动化部署;
    Jenkins 介绍
    Jenkins 是一款流行的开源持续集成( Continuous Integration )工具,广泛用于项目开发,具有自动
    化构建、测试和部署等功能。 我们需要知道的是, Jenkins 只是一个平台,真正运作的都是插件;这就
    是 Jenkins 流行的原因,因为 Jenkins 什么插件都有。
    Jenkins 的优势
    1 、开源的 Java 语言开发持续集成工具,支持持续集成,持续部署。
    2 、易于安装部署配置:可通过 yum 安装 , 或下载 war 包以及通过 docker 容器等快速实现安装部署,可方
    便 web 界面配置管理。
    3 、消息通知及测试报告:集成 RSS/E-mail 通过 RSS 发布构建结果或当构建完成时通过 e-mail 通知,生成
    JUnit/TestNG 测试报告。
    4 、分布式构建:支持 Jenkins 能够让多台计算机一起构建 / 测试。
    5 、文件识别: Jenkins 能够跟踪哪次构建生成哪些 jar ,哪次构建使用哪个版本的 jar 等。
    6 、丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如 git , svn , maven ,
    docker 等。
    Jenkins 自动化部署实现原理
    如下图:
  10. 代码管理: Jenkins 可以集成多种源代码管理系统(如 Git 、 SVN 等),从中获取最新的代码。
  11. 触发构建: Jenkins 可以基于预设的触发条件(如定时、代码提交等)触发构建过程。
  12. 构建过程: Jenkins 会执行预设的构建脚本,包括编译代码、生成可执行文件、打包等操作。
  13. 单元测试: Jenkins 会执行预设的单元测试脚本,对构建的软件进行测试。
  14. 静态代码分析: Jenkins 可以执行静态代码分析工具,检查代码质量,如检查代码风格、代码覆盖
    率等。
  15. 部署过程:根据预设的部署配置, Jenkins 会将构建好的软件部署到目标环境中。
  16. 集成测试: Jenkins 可以执行预设的集成测试脚本,将不同模块的软件进行集成测试。
  17. 验收测试: Jenkins 可以执行预设的验收测试脚本,验证软件是否符合用户需求。
  18. 反馈结果:

2**、如何配置**

1**、Jenkins安装**

1. 创建 Jenkins 挂载目录并授予权限
// 创建目录
mkdir -p /usr/local/docker/jenkins_home
// 授权权限
chmod 777 /usr/local/docker/jenkins_home

2.安装Maven

切换到要安装的文件夹

cd /opt

解压

tar -xzvf apache-maven-3.9.6-bin.tar.gz

配置 apache-maven-3.8.5/conf/settings.xml ,添加阿里云 maven 镜像仓库

vim apache-maven-3.9.6/conf/settings.xml

在 <mirrors> 标签中添加以下配置

<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/\</url>
<mirrorOf>central</mirrorOf>
</mirror>

添加环境变量

vi /etc/profile

在文件底部加上

export M2_HOME = /opt/apache-maven-3.8.5
export PATH = $PATH : ${M2_HOME} /bin

保存并退出编辑,使用下面的命令让修改生效

source /etc/profile

验证 Maven 安装

mvn -version

注意:你有可能会报错
这是因为你没有安装 Java, 建议安装 JDK11 ,因为 Jenkins 的版本最好是 2.440 以上,这样很多插件可以直
接安装,不用再费事手动安装了, 2.440 版本的 Jenkins 最低支持 JKD11 。

3.启动Jenkins****容器

最好先去 dockerhub 上找到最新版本,拉取指定版本号,否则容易出现插件安装失败的问题

docker run -d -p 8081 :8080 -p 50000 :50000 --restart = always \
-v /usr/local/docker/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime -v /opt/apache-maven-3.8.5:/usr/local/maven \
-e TZ = "Asia/Shanghai" --name jenkins jenkins/jenkins:2.440-jdk11

**4.**打开浏览器访问

http://IP : 端口

5.获取并输入admin****账户密码

vim /usr/local/docker/jenkins_home/secrets/initialAdminPassword
2 Jenkins 配置

插件管理

**1.**跳过插件安装

因为 Jenkins 插件需要连接默认官网下载,速度非常慢,而且经过会失败,所以我们暂时先跳过插件安
装。

**2.**创建管理员用户

3.修改Jenkins****插件下载源

enkins->Manage Jenkins->Manage Plugins ,点击 Available ,这样做是为了把 Jenkins 官方的插件列表
下载到本地。

修改地址文件,替换为国内插件地址。

docker 安装,因为做了映射,直接在宿主机挂载的 jenkins_home 中修改

cd /usr/local/docker/jenkins_home/updates

换成清华镜像库

使用 docker 安装的 jenkins ,如没有 "default.json" 文件,则访

问 "http://localhost:8081/restart" 后再执行以下步骤
sed -i 's/http:\/\/updates.jenkins
ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
&& sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

重启 Jenkins
http://192.168.159.100:8081/restart
在 Manage Plugins 点击 Advanced ,把 Update Site 改为国内插件下载地址:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
然后点击 submit

重启 Jenkins

**4.**下载中文汉化插件 (选做,因为你的Jenkins版本可能太低导致不能安装)

用户权限管理

1.安装Role-based Authorization Strategy****插件

2.授权策略切换为"Role-Based Strategy"

**3.**创建角色(不用创建也能用,主要我没看懂这块儿)

系统管理 -> Manage and Assign Roles -> Manage Roles
Global roles (全局角色):管理员等高级用户可以创建基于全局的角色
Project roles (项目角色):针对某个或者某些项目的角色,最新版已改名为 "Item roles"
Slave roles (节点角色):节点相关的权限,最新版已改名为 "Node roles"

**4.**创建用户(不用创建也能用,主要我没看懂这块儿)

系统管理 -> Manage Users -> 新建用户

**5.**给用户分配角色(不用创建也能用,主要我没看懂这块儿)

系统管理 -> Manage and Assign Roles -> Assign Roles
在 User/group to add 中输入需要分配角色的用户,勾选相应角色,保存。
凭证管理
凭据可以用来存储需要密文保护的数据库密码、 Gitlab 密码信息、 Docker 私有仓库密码等,以便
Jenkins 可以和这些第三方的应用进行交互
安装 Credentials Binding 插件

可以添加的凭证有 5 种:(我用的第一种,其他不知道为啥四种都失败了)
Username with password :用户名和密码
SSH Username with private key : 使用 SSH 用户和密钥
Secret file :需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径
设置到一个变量中,等构建结束后,所复制的 Secret file 就会被删除。
Secret text :需要保存的一个加密的文本串,如钉钉机器人或 Github 的 api token
Certificate :通过上传证书文件的方式

安装Git插件和Git工具

为了让 Jenkins 支持从 Gitlab 拉取源码,需要安装 Git 插件以及在 jenkins 服务器上安装 Git 工具。

1. 使用Git用户密码拉取代码

**2.**测试凭证是否可用

回到主页,新建任务 -> 构建一个自由风格的的软件项目(FreeStyle Project)-> 输入任务名称 -> 确定

在源码管理中选择 Git,填入仓库的http连接,并选择刚才添加的凭据,点击保存。


Repository URL: 填写你 Git 仓库的 Http 地址
Credentials :选择账号密码那个授权
选择立即构建( Build Now )。

如果成功也可以在项目空间里看到你的项目,项目失败 点击控制台输出可以看到进行到哪一步失败了;

使用Git SSH密钥拉取代码**(**不建议使用,因为我用这个方法会报错

( `))

1.生成SSH****密钥

2.SSH****公钥添加到远程仓库中

3.Jenkins****中添加凭据,配置私钥

在凭据中选择 SSH Username with private key ,填写用户名和私钥。

获取私钥

cat ~/.ssh/id_rsa

**4.**测试凭据是否可用

回到主页,新建任务 -> 构建一个自由风格的的软件项目( FreeStyle Project ) -> 输入任务名称 -> 确定

在源码管理中选择 Git,填入仓库的ssh连接,并选择刚才添加的凭据,点击保存。

选择立即构建(Build Now)。

Maven****配置

1.全局工具配置关联JDK**、Git和****Maven**

docker 版自带 JDK 和 git ,可进入容器通过以下命令获取 JDK 和 git 路径,使用 Linux 安装需提前安装好 git
和 JDK

进入 jenkins 容器

docker exec -it jenkins /bin/bash

查看 jdk 版本

java -version

查看 jdk 路径

which java

查看 git 版本

git --version

查看 git 路径

which git

此处不建议直接使用自动安装 maven ,自动安装的 maven 会在首次使用 maven 构建项目时才下载下
来,加上使用国外镜像仓库,会导致构建项目时间过长。
但是我用的是自动安装 maven ,因为我找不到我的 maven 装在哪儿了,只能说 Linux 没人用不是没有道
理的,找个文件要给我找死了; ( ╯▔皿▔ ) ╯

**2.**安装 Maven Integration

插件

**3.**配置环境变量

配置完全局配置后去配置 jenkins 的环境变量 不然 jenkins 运行打包命令会找不到 JAVA_HOME 和 mvn
命令( yum 安装 jenkins 需要配置环境变量, war 包安装方式不用配置, docker 安装的 jenkins 属于用
war 包安装的,所以可以不用配置)
Manage Jenkins->Configure System->Global Properties ,添加三个全局变量: JAVA_HOME 、
M2_HOME 、 PATH+EXTRA

4.修改maven****仓库地址,方便查看

docker 挂载的 maven 默认仓库地址位于 jenkins 挂载目录下: ~/jenkins_home/.m2/repository ,如果
不在意的话可以不改
我不在意,所以我没改,主要确实找不到 maven 装哪里了;

创建本地仓库目录, docker 安装的需要进入容器内部创建

mkdir /root/repo

进入配置文件

vi /opt/maven/conf/settings.xml

修改 <localRepository> 中的内容

<localRepository>/root/repo</localRepository

5.测试Maven****是否配置成功

配置源码地址

填入 clean package,保存后进行构建,如果可以编译打包成功,则说明Maven配置成功。


注意这个 pom.xml ,如果你项目的 pom 文件不在最外层,前面需要加一层路径,反正自己看吧,他构建
完检测不到会提示报错;

看到BUILD SUCCESS表示构建成功,或者你构建成功了那个项目上会有个小对勾;
Tomcat 安装和配置
使用 docker 安装 Tomcat

首先启动一个 tomcat 容器,记得提前打开 8080 端口或关闭防火前

docker run -d -p 8080 :8080 --name = tomcat tomcat:9.0

拷贝配置文件到宿主机

docker cp tomcat:/usr/local/tomcat /usr/local/docker/

可以修改 tomcat 配置文件( server.xml ),自定义端口等

将 webapps.dist 中的文件复制到 webapps 目录下

cp /usr/local/docker/tomcat/webapps.dist/ /usr/local/docker/tomcat/webapps/

删除之前创建的 tomcat

docker rm -f tomcat

启动正式 tomcat

docker run --restart = always --name = tomcat -p 8080 :8080 \
-v /usr/local/docker/tomcat:/usr/local/tomcat \
-d tomcat:9.0
在浏览器的地址栏输入:
http://192.168.159.100:8080/ (服务器的 ip 和 tomcat 默认端口 8080 )
如果出现以下界面,则说明安装成功

配置****Tomcat

1.配置Tomcat****用户角色权限

默认情况下 Tomcat 是没有配置用户角色权限的,后续 Jenkins 部署项目到 Tomcat 服务器,需要用到
Tomcat 的用户,所以修改 tomcat 以下配置,添加用户及权限。

修改 tomcat 配置文件,允许 jenkins 访问

vi /usr/local/docker/tomcat/conf/tomcat-users.xml

添加以下配置,管理员密码为 :tomcat/tomcat

<tomcat-users>
<role rolename = "tomcat" />
<role rolename = "role1" />
<role rolename = "manager-script" />
<role rolename = "manager-gui" />
<role rolename = "manager-status" />
<role rolename = "manager-jmx" />
<role rolename = "admin-gui" />
<role rolename = "admin-script" />
<user username = "tomcat" password = "tomcat" roles = "manager-gui,manager
script,tomcat,manager-status,manager-jmx,admin-gui,admin-script" />
</tomcat-users>

为了能够刚才配置的用户登录到 Tomcat ,让所以 ip 都可以访问 tomcat ,还需要修改以下配置

vi /usr/local/docker/tomcat/webapps/manager/META-INF/context.xml

注释这段配置

<!-- <Valve className = "org.apache.catalina.valves.RemoteAddrValve"
allow = "127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -- >

重启 Tomcat

docker restart tomcat

2.添加Tomcat****用户凭证

war包部署到tomcat

1.安装Deploy to container****插件

Jenkins 本身无法实现远程部署到 Tomcat 的功能,需要安装 Deploy to container 插件实现。

**2.**添加构建后操作

在刚才的 maven 项目配置中增加构建后操作步骤,应用并保存,构建成功后访问项
目地址:格式为 http://ip :port/context_path

然后构建项目,如果构建成功则去 tomcat 里的 managerAPP 里查看,看到你的项目即构建并部署成功;
图中 gas 为我部署的项目

最后这里可老难了,可能会出现找不到war包之类的情况


出现这种问题,我建议排查:
1 、你的配置有没有出错
2 、你的项目用 maven 构建完是 jar 包还是 war 包?
3 、你的部署路径是否正确?(大概率是错误的,因为我刚开始部署路径也是错的)
所以需要你:
1 、修改你的项目的 pom 文件,让他构建 war 包;
2 、尝试修改你 Jenkins 的工作空间路径(为什么说是尝试,因为网上说的几种办法我都试了,没用 XD )
3 、重新开一个项目从头配置(我就是这样解决的,我也不知道为啥)
此外,注意你虚拟机的防火墙,建议全关;

3**、为什么选用****Jenkins**

当谈到 CI/CD (持续集成和持续交付) 工具时,我们都会提到 Jenkins 。它是构建和测试项目的超级有
效工具,从而使持续不断的轻松集成成为可能。
但是, Jenkins 并不是唯一的 CI/CD 工具。我们还有其他很多选择!
例如:
1.GitLab
GitLab 它是一个开源的 Web 系统,可用于将持续集成,持续部署应用到你的项目中,而无需任何
第三方应用程序。它提供了友好的用户界面以及分布式版本控制服务。
使它成为 Jenkins 最佳替代品之一的一些主要功能是:
像 Jenkins 一样,它也是一个开源工具。
可以并行测试构建,从而减少时间。
它允许与 docker 集成,并有助于自动化发布和应用程序交付。
它提供了更好的支持。
需要知道的是:
1 、易用性
GitLab 是一个一体化平台 ,它为 CI/CD 、版本控制、项目管理和协作提供全面的解决方案 , 使开
发人员可以轻松设置和配置他们的管道 。而 Jenkins 是一个高度可定制的工具,需要一些技术专长来设
置和配置。它具有陡峭的学习曲线,新用户可能会发现上手具有挑战性。
2 、整合
GitLab 和 Jenkins 支持与各种工具和服务的集成。但是, GitLab 提供与第三方服务的更多原生集
成,包括云提供商、部署平台和监控工具。这使开发人员可以更轻松地设置他们的管道并自动化他们的
工作流程。 Jenkins 也有一个庞大的插件库,支持与各种工具和服务的集成。
3. 性能
GitLab 以其快速可靠的性能而闻名。它具有内置的缓存和并行处理功能,使开发人员能够快速高
效地运行他们的管道。而 Jenkins 在运行大型复杂管道时可能会遇到性能问题。它需要手动优化以确保
它可以处理负载。
4. 安全
GitLab 具有内置的安全功能,可确保代码在每个管道阶段都是安全的。它提供代码扫描、漏洞管
理和容器扫描等功能,可帮助开发人员在将其投入生产之前识别和修复安全问题。 Jenkins 严重依赖插
件来提供安全功能。这会使确保您的管道安全变得具有挑战性,尤其是在您使用第三方插件的情况下。
5. 成本
GitLab 提供免费和付费计划。免费计划包括小型团队 CI/CD 所需的大部分功能。付费计划包括部署
监控、审计和合规性等附加功能。 Jenkins 是一个可以免费使用的开源工具。但是,它需要大量资源来
设置和维护,这会增加使用该工具的总体成本。
2. TeamCity
TeamCity 易于使用和集成,因此也被称为 " Intelligent CI Server" 。它为不同的操作系统提供了不
同的安装包。它是 JetBrains 开发的功能强大的工具,它甚至可以在提交更改之前就构建和运行测试,从
而保持代码的干净。
使它成为 Jenkins 替代产品之一的一些功能是:
易于安装。
它提供了与 Docker , JIRA 等工具的集成。
它提供了可扩展的定义良好的 API 。
需要知道的是:
1 、泛用性
虽然 JetBrains 的 Idea 、 DataGrip 等一系列软件广受好评,但是 TeamCity 用的人是真的少,而说起
CI/CD 大家的第一反应都是 Jenkins ,谁更常用一眼便知;
2. 易用性
与 Jenkins 相比, TeamCity 提供了更好,更清晰的界面。该界面可以根据要求轻松定制。这并不意
味着 Jenkins 不可用,主要的可用性差异在于 Jenkins 更加关注功能而不是可用性。
TeamCity 的主要组件是服务器,而浏览器托管的界面用于管理项目,代理和项目配置。
3 、安装
安装和配置 TeamCity 服务器很容易,因为它只涉及下载适当的 TeamCity 服务器安装并执行安装
(或升级)说明。 TeamCity 官方站点上的大量文档使此任务更加容易。
Jenkins 是一个自包含的 Java 程序,易于安装,并且可以在 OS X , Windows 和基于 Unix 的操作系统中直
接使用。如果已经安装了 Java 和 Apache TomCat ,则需要执行三个安装步骤。总体而言,设置詹金斯的
过程很容易。 Jenkins 的配置是通过 Web 界面执行的,该界面包括内置帮助和即时错误检查。
但是,如果您按照必要的安装步骤进行安装,则 Jenkins 和 TeamCity 都非常简单。
3. 插件生态系统
与 TeamCity 相比, Jenkins 的插件生态系统更加成熟。主要原因是社区参与了詹金斯的发展。
TeamCity 有大约 400 个插件。这些插件可在 TeamCity 的插件页面上下载。插件必须单独安装,因为它们
不一定是商业产品的一部分。通过使用 Open API ,开发人员可以创建用于与版本控制系统,构建工
具, IDE ,通知程序和服务器运行状况报告集成的插件。
相比之下, Jenkins 在社区及其丰富的插件生态系统中蒸蒸日上。在撰写本文时, Jenkins 提供了 1500 多
个受社区支持的插件,并支持项目中的构建,部署和自动化。由于插件的范围从构建工具到特定于语言
的开发工具,它使自定义任务简单且具有成本效益,因为您不需要昂贵的内部自定义。
3.Buddy
Buddy ,也称为 Buddy Works ,是一种具有用户交互界面的持续集成和交付软件,是 Jenkins 的完
美替代方案。它有助于更快地构建,测试和部署应用程序。你可以在几分钟的配置中运行 CI/CD 流水
线。
此外,它还提供以下功能:
它提供本地解决方案。
它提供了对多种语言的支持。
可以根据要求自定义构建和测试环境。
需要知道的是:

  1. 易用性: Buddy 更加简单易用,即使是普通的开发人员也可以快速上手。而 Jenkins 需要具备一定
    的领域知识才能正常使用,通常需要专人进行管理。
  2. 集成能力: Jenkins 具有更强的集成能力,许多插件可以方便地与其集成,支持各种构建、部署和
    测试工具。 Buddy 虽然也提供了丰富的插件支持,但其核心功能更加集中,主要用于构建、测试和
    发布软件。
  3. 适用场景: Buddy 适用于各种规模的项目,特别是对于需要快速迭代和发布的小型项目来说,
    Buddy 可以提供更加灵活和快速的服务。 Jenkins 则更适合大型的、复杂的项目,尤其是一些需要
    高度定制和自动化的企业级项目。
    不过以大伙将来找到的工作来说, Buddy 确实是把 Jenkins 完爆了 🤣 ;
相关推荐
武昌库里写JAVA10 分钟前
React方向:react中5种Dom的操作方式
java·开发语言·spring boot·学习·课程设计
ThetaarSofVenice39 分钟前
一个个顺序挨着来 - 责任链模式(Chain of Responsibility Pattern)
java·设计模式·责任链模式
xqhoj1 小时前
C++学习指南(七)——stack/queue/priority_queue
开发语言·c++
安的列斯凯奇1 小时前
JavaRestClient 客户端初始化+索引库操作
运维·jenkins
淡黄的Cherry1 小时前
EFK采集k8s日志
云原生·容器·kubernetes
数据小小爬虫1 小时前
利用Java爬虫获取义乌购店铺所有商品列表:技术探索与实践
java·开发语言·爬虫
Dong雨1 小时前
Java的Stream流和Option类
java·新特性
!!!5251 小时前
maven的生命周期
java·数据库·maven
NoneCoder2 小时前
JavaScript系列(24)--内存管理机制详解
开发语言·javascript·ecmascript
Pafey2 小时前
c++ 中的容器 vector、deque 和 list 的区别
开发语言·c++