之前是jenkins发现gitlab代码更新了就自动获取直接部署到服务器
现在是jenkins自动获取Code之后打包成镜像上传到仓库然后通知docker去拉取更新的镜像
分析
旧∶
代码发布环境提前准备,以主机为颗粒度·静态
新:
代码发布环境多套,以容器为颗粒度·编译
git+gitlab+jenkins+tomcat+maven+harbor+docker
工作流程
1.开发人员提交代码至GitLab代码仓库
2. jenkins手动或自动触发项目构建
3.jenkins 拉取代码、代码编码、打包镜像、推送镜像至镜像仓库
4. Jenkins在Docker主机创建容器并发布应用
一、环境准备
主机规划
准备5台主机
修改主机名称、ip、域名解析/etc/hosts添加五台主机ip 主机名称
关闭防火墙和selinux
查看时间同步服务,每小时同步一次时间是通过脚本实现的
如果没有时间同步服务器,可以直接使用ntpdate 百度一个ntp服务器的ip
每小时运行一次ntpdate 命令
二、应用软件安装
2.1 jdk
通过ssh远程管理工具把安装包上传到服务器
在jenkins服务器上解压jdk安装包并配置环境变量
vim /etc/profile 添加环境变量 tail -2 查看日志的最后两行
最后source /etc/profile 配置立即生效 再查看jdk的版本
2.2 jenkins
配置官方yum源,参考官方文档,如果yum源中的gpgcheck=1 开启了检测,就必须import导入密钥
yum -y install jenkins
修改jenkins使用java
vim /etc/rc.d/init.d/jenkins 83行添加一行 /usr/local/jdk/bin/java
vim /etc/sysconfig/jenkins 19行加上/usr/local/jdk/bin/java
设置开机自启
chkconfig --list 列出7种启动方式
只能使用chkconfig jenkins on 设置 enable不行
启动jenkins
systemclt start jenkins 再访问jenkins服务的ip:8080端口
直接cat查看管理员密码之后复制粘贴
选择自动安装插件,如果网络不行一定要一次性安装好,离线安装会报错
最后用admin登录就行 密码就是开始复制粘贴的那个,建议修改
2.3 git
开发人员主机安装git
下载项目及上传代码至代码仓库
yum install git -y
2.4 gitlab
在gitlab服务器配置gitlab的清华源
安装gitlab到gitlab服务器
yum install gitlab-ce -y
修改gitlab配置文件 在13行把http://改成自己gitlab服务器的ip地址
vim /etc/gitlab/gitlab.rb
初始化并启动gitlab
访问gitlab的web页面
2.5 maven
Maven是一个java项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Maven的核心功能是合理叙述项目间的依赖关系,通俗点 就是通过pom.xml文件的配置获取jar包不用手动的去添加jar包
maven的tar包可以去apache官网下载
jenkins里面也需要安装git来获取项目代码
yum -y install jenkins
2.6 docker
docker-ce需要通过官方文档安装到jenkins服务器、harbor服务器和web服务器
都需要修改删除docker.service文件
添加daemon.json文件之前千万注意必须开启docker,不然无法保持修改
2.7 harbor
最好systemctl restart docker 重启docker
再验证harbor是否可用
docker login ip
密码:Harbor12345
如果需要在harbor-server主机上打包容器应用镜像并上传,需要修改docker daemon
本例修改,请参照docker部署部分
docker安装直接复制粘贴官方文档
修改daemon.json文件,配置harbor为docker的本地仓库
主要目的是为了jenkins可以自动获取harbor仓库打包的应用镜像发布给web服务器
如果不配置daemon.json文件,web服务器是找不到harbor仓库的
2.8 web 服务器
安装docker-ce参考官方文档
三、配置ssh免密登录
3.1 添加开发者主机密钥到gitlab仓库
生成密钥对,公钥是加密的,私钥是解密验证的
添加公钥到gitlab仓库
3.2 添加jenkins服务器的公钥和凭据到gitlab
添加公钥很简单,就是在服务生成密钥对ssh-keygen -t rsa /root/.ssh/id_rsa -C "标识" -P " "
复制jenkins服务器公钥粘贴到gitlab
主要是添加凭据访问gitlab,凭据就是私钥。
因为jenkins不能通过公钥访问gitlab,只能通过凭据或者用户名密码等
点击凭据之后点击系统再点击全局凭据
复制jenkins服务器的私钥到jenkins作为凭据访问gitlab
3.3 配置jenkins使用docker
验证系统中是否有jenkins用户,发现有,但是无法登录系统
验证系统中是否有docker用户及用户组
添加jenkins用户到docker用户组
就是给docker用户组添加一个jenkins附加组
3.4 安装jenkins插件
需要安装的插件:
ssh用于jenkins-server对web-server进行操作
git parameter(参数)用于git版本提交进行参数构建
gitlab用于jenkins-server拉取项目
gitlab hook用于项目自动构建
maven integration用于编译java项目
安装ssh,点击jenkins系统管理里面的插件管理然后搜索可用的插件 ssh
勾选之后点击直接安装就行
安装git parameter插件
安装gitlab和gitlab hook 插件
按照maven integration(集成)
3.5 jenkins全局配置
jenkins全局工具配置
一共就配置三个工具:jdk git maven
docker不配置是因为jenkins用户已经添加到了docker组的附加组
JDK配置需要把自动安装取消
Git配置如果不加git,jenkins就无法使用git参数
配置之前先在jenkins查看是否安装git
git version
Maven 配置
首先要确定系统中是否有maven
mvn -v 就能查看maven家目录
3.6 jenkins系统配置
主要配置ssh插件,用于jenkins操作web-server,web-server执行命令。
jenkins需要ssh免密登录web服务器才能实现自动发布项目
所以jenkins还需要添加一个连接web服务器的凭据
如果web服务器比较少就可用用户名和密码作为凭据
注意:用户名root是web服务器的root用户 密码也是web服务器的密码
点击系统设置
实际工作中可以点击新增添加多台web服务器
四、项目发布
4.1 项目代码获取
--recurse 相当于 -R 递归 -submodules 子项目
https://gitee.com/dl88250/solo.git 是一个java编写的博客项目,子项目就是皮肤
注意:获取项目代码是是开发人员的主机
4.2 项目代码修改
主要修改项目如何连接数据库
克隆项目到本地之后查看src源码目录下的main目录下的resources下的
local.properties文件
通过jdbc连接数据库,数据库安装在web服务器上,所以mysql通过jdbc连接web服务器的ip
注意:真实工作中一个项目单独一个数据库,而且处于删库跑路的安全考虑是不可能用root用户通过jdbc连接数据库的,一个项目一个库,数据库授予普通用户权限就行
solo就是项目数据库名称
注意:web服务器上创建的数据库字符编码必须和配置文件一致是utf-8
4.3 安装项目数据库
在web-server安装mariadb数据库也可安装mysql数据库
启动mariadb数据库,mysqladmin -uroot password "123456" 登录数据库
创建solo项目数据库默认字符集utf8 排序规则不指定
utf8mb4_bin 是区分大小写的,也区分 e 和 é 这类字符的
utf8_genera_ci 是不区分大小写的,也不区分 e 和 é 这类字符
注:utf8_general_ci 是区分大小写的,但不区分 e 和 é 这类字符
如果需要区分带有音节的字符,又不想要区分大小写,可在 sql 查询对应字段时用 LOWER () 函数
授权root用户访问solo数据库的所有表
4.4 项目代码上传到gitlab-server
创建项目的gitlab仓库
上传项目代码
必须在开发者主机设置全局配置用户名和email,才能知道项目是谁上传的。
仓库里面有对应命令,可复制粘贴
进入solo项目目录移除原来的远程项目地址,因为gitlab仓库里面创建的这个solo项目是空的
但是之前获取的项目代码是从网络获取的(保险起见不管是从哪里获取的最好都移除重新添加本地主机为推送地址),所以必须移除网络推送地址才能成功上传项目到仓库
添加开发者的主机作为本地仓库 推送地址就变成了开发者主机
git add -A . 把当前项目代码放入暂存区 git 2.0版本支持git add .暂存删除的文件到暂存区
git commit -m "事务标识" 提交事务
git tag 版本号 给项目打版本号标签
git push origin master 指定远程仓库名和分支名。(这里只配置了本地仓库)
git push origin 版本号 指定上传打标签的版本1.0.0到本地开发者主机的仓库
项目代码已经传送到了gitlab仓库中,可登录gitlab网页查看历史push events
4.5 创建项目运行的基础应用镜像
主要是tomcat容器应用镜像
第一步:创建一个项目目录
mkdir tomcatdir
第二步:在项目目录中创建Dockerfile文件 用来自动创建容器镜像
容器镜像越小越好,一定要把tomcat默认的访问页面删掉
重新创建一个项目目录ROOT可自定义
编辑Dockerfile文件的前提是当前目录必须有jdk
所以把/usr/local/jdk 文件cp到项目目录
第三步:构建tomcat容器镜像工程
自动下载Dockerfile中的文件
第四步:上传容器镜像到harbor仓库
上传容器镜像之前先确定镜像是否存在docker images
登录harbor之后上传打包好的镜像
验证就很简单
先查看harbor项目镜像仓库是否存在上传的镜像
再用web服务器直接运行就🆗
后台运行就会直接下载tomcat容器镜像到web服务器并运行
可用用docker inspect 容器id 查看容器的ip之后curl http://容器ip8080
其实看不到什么
4.6 创建jenkins工程任务
第一步: jenkins获取项目代码
第二步: jenkins对项目代码编译,由maven完成
第三步:jenkins使用docker对编译完成的项目代码进行打包,打包成容器应用镜像
第四步: jenkins把打包的容器应用镜像上传到harbor
第五步:jenkins通过ssh插件完成对web-server运行容器应用镜像的操作
在jenkins网页点击新建任务,再点击构建一个maven项目
任务构建时勾选参数化构建过程,Git Parameter
填写tag标签 版本号
选择git 然后粘贴克隆命令到url 添加凭据 最后要构建的分支填写$Tag版本参数
git 版本替换时确实要指定分支的,只不过这里的分支是版本号参数,为了实现自动更新版本
如果项目中有子模块,必须新增sub-modules模块
如果项目中有子模块必须勾选更新子模块选项,使用凭据是为了自动下载gitlab中的代码
Build构建项目 配置pom.xml文件和清除之前 构建的包 跳过预构建测试
jenkins服务器的数据存放目录/var/lib/jenkins
添加一个本地执行shell
再添加一个远程执行shell
maven 会把代码编译成war包,war是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。以Tomcat来说,将war包放置在其\webapps\目录下,然后启动Tomcat,这个包就会自动解压,就相当于发布了。
jenkins在本地完成了镜像的打包并上传到了harbor仓库
web服务器要利用ssh远程的shell命令实现自动获取并运行项目镜像
docker run -d --name blog-solo -v /usr/local/jdk/:/usr/local/jdk -p 80:8080 $REPOSITORY
运行容器 并挂载jdk 如果不想在web服务器安装jdk可以去掉这行挂载命令
4.8 项目发布过程
点击 基于参数构建parameters
构建项目之后点击小三角符号之后点控制台输出
控制台输出就会自动创建一个jenkins的workspace工作空间
/var/lib/jenkins/workspace/任务名称 这个workspace其实就是项目存放的位置
可以看到workspace工作空间有上传到gitlab代码仓库的代码 src 是源码目录
等jenkins把项目构建完成之后 就会出现target 里面有maven编译过的java代码的war包
war包是一种web代码格式,可在tomcat中自动解压并运行
skins目录就是放皮肤的
docker rm 删除容器 docker rmi 删除镜像
更换版本可以在开发者主机上的项目目录打标签 版本号 之后push上传到jenkins就行
如果docker start 之后 docker ps --all 多次发现容器没有启动
第一步:查看message日志
less /var/log/message
第二步: 进入数据库目录查看数据库log
第三步:查看docker logs 容器id
一定会发现容器172.17.0.2 不允许连接到数据库
因为之前授权的时候就授权了一个web主机的ip
必须登录数据库把授权改成% 允许所有主机登录项目数据库
如果发布项目需要到测试环境的话,可添加一台测试主机和jenkins测试节点