很多时候打包发布是一件繁琐而重复的事情,这个时候一键自动打包自动发布的需求就出来了。
当然,jenkins出来也不是一天两天了,网上也有很多配置方案,下面是本文方案:
首先:跟传统的方式不同,这里引入了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 项目就可以全自动完成发布)
测试机系统:Ubuntu 20.04
Jenkins版本:2.235.1
Nexus版本:3.29.2-02
当然如果网速太慢下载超时阔以用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 访问你的服务
# 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
三步勾完,拉到低保存即可。
添加访问权限,从《参考文献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 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 '用户表';
# 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服务器地址。
根据数据库生成代码
简单编写一波测试代码
/**
*
* 用户表 前端控制器
*
*
* @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-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
前情提要
# 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
全局的一些配置
Manage Plugin (插件管理) 这里去把该装的插件装了,什么GitLab啊 Git啊 Gradle Plugin 啊 Pipeline啊 Publish Over SSH啊
就两地方,选完保存完事。
# 注意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,如果你配置了单个项目的,请删除,在到全局那里去配置。
当然,ID 描述 UserName 什么的你随便填下不赘述
到此可以说配置全部完成了,很多小白白兴奋滴点击了 Build Now ,只扩系。。。各种蹦
根据我们的流程
第一步从代码仓库拉取代码(把公钥+私钥配置好基本没问题)
第二步执行 ./gradlew clean build 构建Jar项目(这部你可以在你的IDEA的Terminal命令框中测试)
要是这里可以正常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的防火墙,导致外部主机无法访问你数据库。
老板别急……仍在努力编写中……^ ^