手把手教你使用Jenkins+Docker+Tomcat自动化部署项目(2022最新)
持续集成
持续集成的好处
- 降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少;
- 对系统健康持续检查,减少发布风险带来的问题;
- 减少重复性工作;
- 持续部署,提供可部署单元包;
- 持续交付可供使用的版本;
- 增强团队信心;
Jenkins 介绍
Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。官网:Jenkins 官网。
Jenkins的特征
- 开源的Java语言开发持续集成工具,支持持续集成,持续部署。
- 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理。
- 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告。
- 分布式构建:支持Jenkins能够让多台计算机一起构建/测试。
- 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
- 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。
Jenkins 自动化部署实现原理

Jenkins 安装和持续集成环境配置
Jenkins 安装
1. 创建 Jenkins 挂载目录并授予权限
//创建目录
mkdir -p /usr/local/docker/jenkins_home
//授权权限
chmod 777 /usr/local/docker/jenkins_home
2. 安装Maven
因为用到的docker镜像中不包含maven,所以要在宿主机中安装,通过文件挂载的方式提供调用 从官网下载maven,并放到宿主机/opt目录下

切换到要安装的文件夹
cd /opt
解压
tar -xzvf apache-maven-3.8.5-bin.tar.gz
配置 apache-maven-3.8.5/conf/settings.xml,添加阿里云maven镜像仓库
vim apache-maven-3.8.5/conf/settings.xml
在标签中添加以下配置
aliyunmaven
*
阿里云公共仓库
https://maven.aliyun.com/repository/public
添加环境变量
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,则如下图所示:

2. 启动 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.341-jdk8
3. 打开浏览器访问
4. 获取并输入admin账户密码
vim /usr/local/docker/jenkins_home/secrets/initialAdminPassword
在 Docker 容器中更新 Jenkins 版本
如果jenkins版本太老,可以在不影响jenkins项目的情况下,更新jenkins版本
1.以root用户进入jenkins容器
docker exec -it -u root jenkins /bin/bash
2.在容器中下载jenkins的最新war包,],如果嫌下载太慢也可以从官网(https://www.jenkins.io/download/)下载war包然后拷贝到挂载目录中
wget http://mirrors.jenkins.io/war/latest/jenkins.war
3.查看容器中jenkins war包的位置,并备份原来的war包
whereis jenkins
cd /usr/share/jenkins
cp jenkins.war jenkinsBAK.war
4.将/var/jenkins_home的包cp到/usr/share/jenkins下覆盖
cp /var/jenkins_home/jenkins.war /usr/share/jenkins/
5.退出容器并重启
exit
docker restart jenkins
Jenkins 配置
插件管理
1. 跳过插件安装
因为Jenkins插件需要连接默认官网下载,速度非常慢,而且经过会失败,所以我们暂时先跳过插件安装。


2. 创建管理员用户



3. 修改 Jenkins 插件下载源
Jenkins->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
格式为部署的地址后加/restart
修改 Update Site
在Manage Plugins点击Advanced,把Update Site改为国内插件下载地址:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
然后点击submit

重启 Jenkins
访问
http://192.168.159.100:8081/restart
,地址为部署的地址后加/restart
4. 下载中文汉化插件

用户权限管理
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工具。

使用linux安装jenkins,需要jenkins所在的服务器安装git,docker 版的容器已经安装,所以不需要再安装
yum install git -y
使用 Git 用户密码拉取代码
1.添加凭据
Manage Credentials -> Jenkins -> 全局凭据 -> 添加凭据,填入git仓库的账号和密码即可





2. 测试凭证是否可用
回到主页,新建任务 -> 构建一个自由风格的的软件项目(FreeStyle Project)-> 输入任务名称 -> 确定

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

选择立即构建(Build Now)。

点击控制台输出,可以看到项目保存位置。


使用 Git SSH 密钥拉取代码
1. 生成SSH密钥
使用docker部署的需使用docker exec -it jenkins bin/bash命令进入容器内生成密钥
输入以下命令后,连着按三次回车键,生成秘钥
ssh-keygen -t rsa
获取公钥
cat ~/.ssh/id_rsa.pub
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构建项目时才下载下来,加上使用国外镜像仓库,会导致构建项目时间过长。

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,如果不在意的话可以不改
创建本地仓库目录,docker安装的需要进入容器内部创建
mkdir /root/repo
进入配置文件
vi /opt/maven/conf/settings.xml
修改中的内容
/root/repo
5. 测试Maven是否配置成功
构建一个maven项目。

配置源码地址。

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


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,让所以ip都可以访问tomcat,还需要修改以下配置
vi /usr/local/docker/tomcat/webapps/manager/META-INF/context.xml
注释这段配置
重启Tomcat
docker restart tomcat
2. 添加Tomcat用户凭证

把war包部署到 tomcat 中
1. 安装Deploy to container插件
Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container插件实现。

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


正如我在第一篇博客以及 JEP-300 中所讨论的 Jenkins Evergreen 的前两大支柱是我们关注的要点.
自动更新的发行版
不出所料, 实现安全、自动地更新Jenkins发行版(包括核心和插件)所需的机制需要很多的工作。在 Baptiste 的演讲中他将讨论如何使 Evergreen 走起来,而我会讨论为何自动更新的发行版很重要。
持续集成和持续交付变得越来越普遍,并且是现代软件工程的基础 ,在不同的组织当中有两种不同的方式使用 Jenkins 。在一些组织当中,Jenkins 通过 Chef ,Puppet 等自动化工具有条不紊的被管理和部署着。然而在许多其他组织当中, Jenkins 更像是一个设备,与办公室的无线路由器不同。当安装完毕,只要它能继续完成工作,人们就不会太多的关注这个设备。
Jenkins Evergreen 发行版通过确保最新的功能更新,bug 修复以及安全性修复始终能安装到 Jenkins 当中,让 Jenkins 更像是一个设备。
除此之外, 我相信 Evergreen 能够向一些我们现在没有完全服务的团队提供良好的服务:这些团体希望能够以服务的形式使用 Jenkins 。我们暂时没有考虑提供公有云版本的 Jenkins 。我们意识到了自动接收增量更新,使用户可以在无需考虑更新 Jenkins 的情况下进行持续开发的好处。
我相信 Jenkins Evergreen 可以并且可以提供相同的体验。
自动配置默认值
Jenkins 平台真正强大的地方是可以为不同的组织提供不同的模式和做法。对于很多新用户来说,或一些只希望使用通用案例的用户来说, Jenkins 的灵活性与让用户做出合适的选择形成了悖论。使用 Jenkins Evergreen,很多常用的配置将自动配置,使 Jenkins 变成开箱即用的工具。
默认情况下将包括 Jenkins 流水线和 Jenkins Blue Ocean,我们也删除了一些 Jenkins 的遗留功能。
我们同样在使用非常棒的 Configuration as Code 进行工作, Configuration as Code 现在已经完成了1.0版本的发布, 我们通过它实现自动进行默认配置。
现状
迄今为止,这个项目取得了重大的进展,我们非常高兴有用户开始尝试 Jenkins Evergreen,现在 Jenkins Evergreen 已经可以被早期使用者尝试. 不过我们现在不推荐在生产环境中使用 Jenkins Evergreen 。
自动更新、易于使用的Jenkins
本文转载自:Jenkins中文社区https://jenkins-zh.cn
Jenkins master位于k8s集群外,实现jenkins slave的动态构建、k8s+jenkins中使用自定义maven镜像两篇文章实现了K8S+Jenkins+Maven基础环境,通过此环境我们进一步实现SpringBoot项目的CI/CD。
K8S+Jenkins+Maven基础环境目前能够实现:
- Jenkins slave在K8S集群内的动态构建;
- Maven实现编译、打包、构建镜像并push到远程docker仓库;
剩下的工作需在Jenkins流水线中调用kubectl 命令实现SpringBoot项目在K8S中部署了。
要想Jenkins能够调用kubectl命令,需要安装相关插件,下面我们来介绍下。
Kuberntes相关插件
Jenkins中有两个插件可以实现与Kubernetes进行交互。
一、Kubernetes CLI
此插件允许在Jenkins Job中通过kubectl与k8s集群进行交互,主要是通过kubectl执行各种命令。
1.安装Kubernetes CLI插件
2.通过"Snippet Generator"生成指令
通过"withKubeConfig: Configure Kubernetes CLI"来使用插件:
- Credentials:使用前面文章在devops命令空间中的sa--jenkins
- Kubernetes server endpoint:k8s api server;
- Namespace:需要执行命令的命名空间;
3.添加需要执行的命令
withKubeConfig(caCertificate:, clusterName:, contextName:, credentialsId:k8s-jenkins-slave,namespace:
K8S+Jenkins实现SpringBoot项目CI—CD