Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解

前言

很多时候打包发布是一件繁琐而重复的事情,这个时候一键自动打包自动发布的需求就出来了。

当然,jenkins出来也不是一天两天了,网上也有很多配置方案,下面是本文方案:

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第1张图片

首先:跟传统的方式不同,这里引入了docker(什么是Docker?),这是官网,可以去了解一下:https://www.docker.com/

原理:jenkins从代码服务器拉取最新代码,用gradle完成打包生成jar,接着用docker把运行这个jar所需的环境(java8)以及jar打成一个镜像文件,那么拿着这个镜像文件到任何安装了docker的linux系统都能正常运行不考虑系统的任何环境问题。

做到最终目的:目标主机上只要运行一条代码如:[ docker-compose -f tommy-compose.yml up -d ] 就能完成项目的部署。(什么是docker-compose?)

中间键:Nexus(什么是Nexus?)作为一个私有仓库,它很完美,开发中你封装的一些好的共用库都可以放上面,供其他人依赖,而且还支持docker的镜像,我们只要把封装好的服务镜像传到Nexus,然后在目标主机上面执行一条代码,就可以自动的从Nexus拉取镜像并运行达到项目部署的目的。

流程实现:程序员提交代码——Git——Jenkins拉取代码(主动触发)——Gradle打包成Jar包——docker把Jar+java8(环境)封装成一个镜像——把打包好的镜像推送到Nexus私有仓库——目标主机执行命令全自动拉取镜像并运行——完成

jenkins实操效果图:(只需要点击一下 Build Now 项目就可以全自动完成发布)

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第2张图片

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第3张图片

步骤

环境:

测试机系统:Ubuntu 20.04

Jenkins版本:2.235.1

Nexus版本:3.29.2-02

安装Jenkins:参考文献1  参考文献2  参考文献3

当然如果网速太慢下载超时阔以用deb包直接安装,方便一点。

安装方式2:链接: https://pan.baidu.com/s/1nrdAziHlJ5F74TW5I-kf1g  密码: 2cgn

# 到下载Dowloads目录下,右键运行命令框
sudo dpkg -i jenkins_2.235.1_all.deb

# 一波跑完之后,如果没有报错,浏览器 http://localhost:8080 回车,页面就出来了,后续的安装请依照上面的参考文献步骤安装。

OK,安装完成Jenkins之后捏,我们来修改下端口号,毕竟8080端口还是很容易就那啥的。

# 首先了解下jenkins的目录结构
jenkins安装目录:/var/lib/jenkins 
jenkins日志目录:/var/log/jenkins/jenkins.log
jenkins默认配置:/etc/default/jenkins

# 然后来到默认配置文件目录下面
cd /etc/default/

# 打开jenkins配置文件观摩观摩
# 当然这里不推荐用 gedit 命令,不专业 推荐 vi vim
# sudo vi jenkins
# sudo vim jenkins
sudo gedit jenkins

# 把HTTP_PORT=8080 修改成 9090 或者你喜欢滴端口
# 然后重启jenkins
service jenkins restart

# 重启完成之后,网页 http://localhost:9090 访问你的服务

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第4张图片

安装Docker 参考文献

安装Nexus3 参考文献1

# nexus3在docker官网的镜像池里就有,在docker中查找nexus项目
docker search nexus

# 拉取第一个
docker pull sonatype/nexus3

# 拉取完了用docker跑起来
docker run -d --name nexus3 --restart=always -p 8081:8081 -p 8082:8082 --mount src=nexus-data,target=/nexus-data sonatype/nexus3

# 查看运行中的镜像
docker ps

# 运行起来之后,浏览器打开 http://localhost:8081
# 运行起来之后捏,你的密码需要到镜像目录里面去拿,由于nexus运行在独立的容器中,你在你的机器中是访问不了的,需要先进入到nexus运行的容器中。

# 进入到nexus容器中
# 从上一步 docker ps 查看的镜像列表找找到 nexus3 的 CONTAINER ID
# 进入镜像
# docker exec -it a0730023ad0b /bin/bash
docker exec -it <你的ID> /bin/bash

# 然后cd到目录
cd nexus-data/

# 查看admin密码
vi admin.password

# 把密码复制出去登录,登录进去会要求你修改密码,自行修改好
# 退出nexus容器
exit

配置Nexus3 参考文献1 参考文献2

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第5张图片

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第6张图片

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第7张图片

三步勾完,拉到低保存即可。

添加访问权限,从《参考文献1》中摘录下来的

菜单 Security->Realms 把 Docker Bearer Token Realm 移到右边的框中保存。

添加用户规则:菜单 Security->Roles->Create role 在 Privlleges 选项搜索 docker 把相应的规则移动到右边的框中然后保存。

添加用户:菜单 Security->Users->Create local user 在 Roles 选项中选中刚才创建的规则移动到右边的窗口保存。

设置完成之后捏,就去配置下docker的访问路径,用于访问这个仓库

# 值得说明的是,任何想要访问你Nexus3的服务器里的docker都是需要设置的
cd /etc/docker

# 加入 "insecure-registries": ["domain:8082"] 指向配置的nexus3服务器
# domain 换成你的nexus3服务器地址,本机写localhost
# sudo vim daemon.json
# sudo vi daemon.json
sudo gedit daemon.json
等等。。。

# 我加入完之后长这样
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "insecure-registries":["localhost:8082"]
}
# 保存退出
# 重启docker
systemctl restart docker

# 登录测试,如果提示登录成功说明你当前设备的当前<帐号>可以访问nexus3了
# 多一句嘴,这里的帐号是你的帐号,但不是jenkins帐号,所以后面配置jenkins的时候你还得用jenkins帐号登录一次。
docker login localhost:8082

Username: admin
Password:

Login Succeeded

安装mysql数据库 参考文献1

我安装的是mysql 8.0.12  修改数据库密码

数据库修改密码
# 访问数据库 debian-sys-maint 哪里来?请看上面《修改数据库密码》
mysql -u debian-sys-maint -p

# 输入密码回车(o6TEO3wCsRofSaEM)

# 查看数据库表
show databases;

# 切换到mysql表
use mysql;

# 查看当前表中的用户列表
select host, user, authentication_string, plugin from user;

# 让root用户可以不仅仅在这台机子去访问(当然还需要在系统的配置文件中看看访问设置)
update user set host = ’%’ where user = ’root’;

# 修改你的root密码
alter user 'root'@'localhost' identified with mysql_native_password BY 't123456';

# 修改成功,刷新
flush privileges;

# 退出
exit;

# 开放数据库远程访问权限
# 到mysql目录下面
cd /etc/mysql/mysql.conf.d

# 打开配置文件查看
vi mysqld.cnf

# 发现 需要注释掉 没有注释掉说明 mysql绑定你这台电脑,只有本机可以访问,别的机子访问不了
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1


# 重启mysql
service mysql restart



## 关闭Ubuntu系统下的防火墙(当然可以先不管,后面掉坑了我会说到)
# 查看防火墙状态
sudo ufw status
# 查看防火墙命令
ufw -h
# 关闭防火墙(关闭之后立即会生效)
sudo ufw disable

创建数据库表,这里大家随意,我springboot集成了mybatisplus可以根据你的表生成代码

-- auto-generated definition
create table user
(
    id            int          not null
        primary key,
    user_name     varchar(10)  null,
    user_phone    varchar(15)  null,
    user_location varchar(250) null
)
    comment '用户表';

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第8张图片

springboot项目创建  参考文献1 参考文献2

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第9张图片

# application.yml 配置文件下面的数据库配置地址说明下

server:
  port: 8099

spring:
  datasource:
    url: jdbc:mysql://192.168.120.103:3306/tommy?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false
    username: root
    password: t123456
    driver-class-name: com.mysql.jdbc.Driver
    tomcat:
      max-wait: 10000
      initial-size: 10
      max-active: 1000
      max-idle: 1000
      min-idle: 10
      suspect-timeout: 60
      time-between-eviction-runs-millis: 30000
      min-evictable-idle-time-millis: 60000
      test-while-idle: true
      test-on-borrow: false
      validation-interval: 30000

# 192.168.120.103 是我的本机地址,为什么不能写 localhost? 因为这个项目打成了(jar+java8)镜像,这个 image 运行到docker创建出来的容器中,容器他就是一个环境,他有自己的ip,所以地址不能写本机了,需要写你mysql服务器地址。 

根据数据库生成代码

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第10张图片

简单编写一波测试代码

/**
 * 

* 用户表 前端控制器 *

* * @author tommy * @since 2021-03-05 */ @RestController @RequestMapping("/user") public class UserController { @Resource private UserService userService; @ResponseBody @RequestMapping("/list") public String getUserList() { return new Gson().toJson(userService.list()); } @RequestMapping("/test") public String test() { return "UserControllerTest For Tommy"; } }

我编写好的项目 下载地址

了解docker构建镜像image 参考文献1

了解docker-compose 参考文献1 参考文献2 官网安装

# 安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 安装完成之后测试下
sudo docker-compose

Jenkins自动化配置 

前情提要

# 1.拉取代码需要你的ubuntu得有git
sudo apt-get install git

# 验证下
git --version

# 2.拉取了代码需要打包java项目,我们用的是gradle所以你得gradlew
sudo apt-get install gradle

# 验证下
gradle --version

# 3.jdk项目基于jdk运行,所以捏需要jdk(当然上面安装jenkins的文章中也有提示要装了)
sudo apt install openjdk-11-jdk

# 验证下
java --version

全局的一些配置

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第11张图片

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第12张图片

Manage Plugin (插件管理) 这里去把该装的插件装了,什么GitLab啊 Git啊 Gradle Plugin 啊 Pipeline啊 Publish Over SSH啊

创建项目

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第13张图片

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第14张图片

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第15张图片

就两地方,选完保存完事。

# 注意1:git的代码的拉取需要配置SSH免密获取
# 注意2:Build Configuration 下默认就行,读取的是你通过git拉取下来的项目代码里面配置好的jenkinsfile文件,代码写在这文件里面,jenkins通过 pipeline 去执行文件里面写好的代码,完成打包及部署的流水线操作。

SSH_KEY的配置,懂的直接继续下滑  

生成SSHKEY 参考文献1

# Git SSH KEY 配置 For Ubuntu
# 生成一波ssh文件,连续三个回车,生成三个文件
ssh-keygen -t rsa -C "[email protected]"

# 添加密钥
ssh-add ~/.ssh/id_rsa

# 如果执行ssh-add时出现 Could not open a connection to your authentication agent

# 执行如下命令 
ssh-agent bash

# 然后再执行 
ssh-add ~/.ssh/id_ras


# 然后到目录中去找  id_rsa.pub 文件进行打开,复制里面所有东西到gitlab SSHKey下面  AddKey 就完了
sudo gedit id_rsa.pub

# id_rsa.pub 在哪里?    home/tommy/.ssh/   文件夹下面
# 为什么你看不到? 因为.ssh文件夹是隐藏文件
# 我怎么找?
cd 回车 这就是 tommy 用户下的目录

# 查看目录下所有文件包括隐藏的文件
ls -a 

# 切换到.ssh目录下面
cd .ssh

# 查看文件
ls
# 三个文件 id_rsa  id_rsa.pub  known_hosts
# id_rsa是私钥 id_rsa.pub是公钥 
# id_rsa 里面的东西要放到 jenkins 里面配置
# id_rsa.pub 里面的东西放到 码云 github gitlab 等仓库配置
# 因为我用码云测试,码云有个小坑,就是他可以全局配置sshkey 也可以针对单个项目配置sshkey,我们必须配置全局的sshkey,如果你配置了单个项目的,请删除,在到全局那里去配置。

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第16张图片

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第17张图片

当然,ID 描述 UserName 什么的你随便填下不赘述

到此可以说配置全部完成了,很多小白白兴奋滴点击了 Build Now ,只扩系。。。各种蹦

根据我们的流程

第一步从代码仓库拉取代码(把公钥+私钥配置好基本没问题)

第二步执行 ./gradlew clean build 构建Jar项目(这部你可以在你的IDEA的Terminal命令框中测试)

Jenkins+docker+nexus3+springboot+gradle 全自动打包部署详解_第18张图片

要是这里可以正常build出来,那么也没啥大问题

第三步docker build 构建一个镜像

# 如果你是一步一步跟着我走下来,这里肯定就报错了(错误提示:没有权限)
# 为啥没有权限 有的同学已经在本机上 docker build 了镜像,而且还能跑的很稳,为啥到这就没权限了?
# 值得注意的是jenkins安装完成之后,会创建jenkins用户组,所以jenkins跑的是jenkins的用户组,这个用户组肯定是没有权限的

# 查看jenkins权限
id jenkins
# 用户id=130(jenkins) 组id=137(jenkins) 组=137(jenkins)
# 怎办?加入超级用户组不就行了?恩想法很好。。。。

# 坑1:网上很多人说要么就 chmod 777 把所有要用到的文件 777 掉,只阔系只说777,并没有说777掉哪些文件
# 坑2:把jenkins提权到root用户组-->
# 1.将jenkins账号分别加入到root组中
# gpasswd -a jenkins root
# 2.修改/etc/sysconfig/jenkins文件中
# user id to be invoked as (otherwise will run as root; not wise!)
JENKINS_USER=root
JENKINS_GROUP=root
# 可以修改为root权限运行
# 重启服务,搞定。
service jenkins restart

# 只可惜想法很好,不知道为啥到我这就不行,改了文件要么是 build now 没反应 要么就是连jenkins都启动不了了,因为你改了jenkins的用户跟用户组配置之后,需要修改jenkins的文件路径到root下面去,很多新手小白就蒙蔽了,当然我也尝试过,依旧不行。

##### 正解 #### 把jenkins加入到 docker 的用户组中即可
# 添加jenkins到docker用户组
sudo usermod -a -G docker jenkins

# 查看一下
id jenkins
# 用户id=130(jenkins) 组id=137(jenkins) 组=137(jenkins),998(docker)
# ok 加进去了


第四步把第三步构建的镜像推送到nexus3服务器 docker push(又提示没有权限?what?!!说是需要登录,老子前面不是登录了吗?不,你没有……

# 切换到jenkins帐号
sudo su jenkins

# 登录下
docker login localhost:8082

# 一波帐号密码登录成功
# 登录成功就切换回原来帐号把
sudo su tommy

第五步远程执行docker-compose从nexus3拉取刚才创建并且上传好的新的项目镜像

前面没啥问题的话,这步基本也没啥问题了。

第六步删除掉多余的镜像0

最后项目运行起来了,接口访问http://localhost:8099/user/test 可以访问,但是http://localhost:8099/user/list提示接口访问不了数据库,那是因为上面你没有关闭Ubuntu的防火墙,导致外部主机无法访问你数据库。

老板别急……仍在努力编写中……^  ^

 

你可能感兴趣的:(Linux,docker,linux,java,运维,springboot)