首页 技术 正文
技术 2022年11月15日
0 收藏 902 点赞 3,850 浏览 6516 个字

JAVA项目持续集成发布

标签(空格分隔): java jenkins


微服务中持续集成自动发布是很重要的一个环节,将不同的模块应用自动部署到一台或者N台服务器中如果采用人工部署的方式不太现实

git+jenkins+maven+docker的组合可以将繁琐的集成发布流程缩减到git push一个命令来解决所有问题

整个流程你只会感受到push代码到分支上,然后享用构建后的成果两个过程

集成的过程不仅仅是指java打包,ios以及Android都可在服务器上集成,大大降低了对本地电脑的配置要求,也解决了开发人员的双手,你负责专心撸代码,我帮你集成部署

整个流程图如下:

jenkins+maven+docker集成java发布(一)自动发布

git+jenkins+maven+docker 是如何分工的?

Git

git 版本控制,是CI/CD中开始的部分,也是整个规范操作的开始,当你push到master分支时,数据库,redis,rabbitmq等的连接地址就需要是生产环境的相关配置,push到test分支,亦是如此

下面是java开发代码中环境隔离部分,可以参考

目录结构,前四个文件分别是不同分支的环境配置文件  └── resources│   │   ├── application-dev.yml│   │   ├── application-evan.yml│   │   ├── application-prod.yml│   │   ├── application-test.yml│   │   ├── application.yml│   │   ├── logback-spring.xml│   │   ├── mapper│   │   │   ├── api

application-test.yml中配置内容,隐私部分已用xxx代替

[root@VM_12_50_centos fblserver]# vim src/main/resources/application.yml# Tomcatserver:tomcat:uri-encoding: UTF-8max-threads: 1000min-spare-threads: 30port: 8090connection-timeout: 5000msservlet:context-path: /spring:# 环境 dev|test|prodprofiles:active: test #### 指明环境 push到测试就指向test / push到生产就指向master# Tomcatserver:tomcat:uri-encoding: UTF-8max-threads: 1000min-spare-threads: 30port: 8090connection-timeout: 5000msservlet:context-path: /

application-test.yml测试环境参数配置:

#配置日志文件路径logging:path: /data/wwwlogs/xxx#https签名server:ssl:key-store: /data/wwwroot/java/my.keystorekey-store-password: 1234567890#druid数据库连接spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverdruid:datasource1: #数据源1url: jdbc:mysql://127.0.0.1:3366/xxxusername: rootpassword: o0o0oo0datasource2: #数据源2url: jdbc:mysql://127.0.0.1:3366/xxxusername: rootpassword: o0o0oo0datasource3: #数据源3url: jdbc:mysql://xxxx:3306/xxxx?characterEncoding=utf8&useSSL=trueusername: evanpassword: evaninitial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: false

Jenkins

构建发布过程中,jenkins提供触发构建,权限管理,节点管理等等功能,社区插件也是非常强大

jenkins可以使用docker镜像直接运行在容器中,也可以在本地使用tomcat运行;
但是在此推荐tomcat运行,因为使用docker会遇到很多意想不到的坑,比如环境变量的配置,DinD的问题;
如果你docker玩的很顺溜,可以试试,jenkins的镜像建议使用https://hub.docker.com/r/jenkinsci/blueocean/

jenkins使用tomcat运行非常简单,可以自行百度

使用jenkins前需要安装一些插件才能满足java项目的构建发布

需要安装的插件
  1. Git Parameter Plug-In
    构建时进行分支选择
  2. Git plugin
    关联git仓库
  3. Maven Integration plugin
    maven插件
  4. Pipeline
    新版本功能,流水线,需要写pipeline语法,相当于docker中的dickerfile
  5. SSH Slaves plugin
    从节点命令工具
  6. Email Extension Template Plugin
    邮件拓展插件,可以自定义邮件样式
  7. Active Choices Plug-in(可不安装,建议了解)
    级联操作必备插件,本项目中未用到,适用于将一个或者多个项目同时发布不同的多台服务器上
  8. Role-based Authorization Strategy
    权限管理插件
系统设置

配置图,重点是邮件配置
jenkins+maven+docker集成java发布(一)自动发布

系统管理员邮件地址,填写发件人地址

发件人邮箱认证中的password是适用于登录以下服务: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV的授权密码

default content type 邮件正文类型,这就是这个插件的好处

default content 默认收信正文

default triggers 选择success 代表构建成功后发送邮件到收信人

邮件正文代码如下:

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title></head><body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"offset="0"><table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif"><tr><td>${PROJECT_NAME }项目构建信息</td></tr><tr><td><br /><b><font color="#0B610B">构建信息</font></b><hr size="2" width="100%" align="center" /></td></tr><tr><td><ul><li>项目名称 : ${PROJECT_NAME}</li><li>构建编号 : 第${BUILD_NUMBER}次构建</li><li>触发原因: ${CAUSE}</li><li>构建状态: ${BUILD_STATUS}</li><li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li><li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li><li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li><li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li></ul></td></tr></table></body></html>
全局工具配置

系统设置中的一项设置,主要设置工具环境,比如你本机安装了maven,jdk分别在哪个目录下,就是在这里指定。
也就是说你在jenkins中执行mvn命令的前提是你在本机安装了maven;运行java项目,也是需要在本地安装jdk才行;jenkin只是一个自动化工具,而不是一个啥都已经集成的工具;但是jenkins拥有很丰富的插件库,集成这些插件后对整个构建过程会有很大的帮助,不用再去输入繁琐的命令,复杂的判断,这也是下文会提到的为啥在集成java的时候不使用自由风格构建项目而是构建一个maven项目的原因

如果这里你使用docker运行官方jenkins镜像,最头疼的问题来了,你如何去解决这些环境配置的问题?基于jenkins镜像创建新的dockerfile集成jdk,maven?或者挂载相关目录?不是不可以,两种方法都能解决!那如果需要配置不在同一环境的其他jenkin节点咋办?又涉及到docker网络问题了

个人docker还在学习过程中,感觉jenkins部署在本地服务器上还是会省力很多

系统日志设置

在日志级别设置中添加 javax.jmdns OFF

question: [DNSQuestion@1446063419 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]question: [DNSQuestion@1395874330 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]...

为防止jenkins突然产生大量日志,内容如上;不知道原因,分分钟爆满磁盘
知道原因的大佬请告诉我下,点击右下角的信息按钮就可以联系到我,感谢!

管理节点

多节点的目的是为了防止一台机器构建项目占用大量IO,如果同时构建多个项目可以分布到不同的节点构建
配置比较简单
并发构建数:代表这台机器上能同时构建几个项目,根据机器配置设置

远程工作目录:master机器如果未更改配置,工作目录是在用户家目录下的.jenkins目录中;代表的是jenkins的工作目录workspace

标签: 在创建的新任务中有一个选项 “限制项目的运行节点”,这里可以使用标签或者节点名称

启动方式: 选择 Launch slave agents via SSH 就像配置远程SSH服务器一样简单,这里就需要用到SSH Slaves plugin插件

点击启动就可以运行了,在主界面可以看到你所有的节点

开始创建一个任务

如果是java项目发布,建议选择“构建一个maven项目”,会少些很多命令;如果不采用maven构建一个项目,那么就需要在上图中的shell栏输入打包的命令mvn clean install -Dmaven.test.skip=true,或者触发额外的构建等流程,这个插件都能很好的辅助我们,后面在maven的笔记中会详细说明

在项目命名上建议使用 项目名-版本环境的方式,因为项目如果需要用到权限管理会根据项目名称来管理

整个页面配置如图

jenkins+maven+docker集成java发布(一)自动发布

整个配置过程逻辑很清晰

jenkins+maven+docker集成java发布(一)自动发布

参数化构建过程

这里采用的是Git Parameter插件,插件能自动识别git仓库中的分支,不用插件可以使用文本参数构建,比较繁琐,采用的是value:key方式来设置;

Throttle builds是对构建进行限制,最长构建多久

限制项目的运行节点 就是设置这项任务在哪个节点上构建,这里的标签表达式就是上文在管理节点中输入的标签

源码管理和构建触发设置

源码管理 就是git账户的设置

构建触发器 这里的选择很多,一般只会用定时构建和触发远程构建,触发远程构建就是结合webhooks(码云)使用,每次push代码后触发整个构建发布流程

构建环境 还没弄懂,弄懂了更新补上

Pre Steps 设置发布前执行的命令,也就是下面的执行shell ,也可以选择别的

Build设置

build 主要就是设置maven相关的参数了,图中Root POM 指明pom.xml文件位置,默认pom.xml

Goals and options 执行的构建命令 这里应该填写 mvn clean install -Dmaven.test.skip=true

最主要的是settings.xml 可以灵活选择自己设置好的文件

发布前的操作

执行shell里面内容的解释

cp $WORKSPACE/target/fblserver*.jar /data/java/if docker ps -a | grep -i fblserver; thendocker rm -f fblserverfidocker run -d -p 8090:8090 -v /data/java/:/data/java -v /data/wwwroot/java/my.keystore:/data/wwwroot/java/my.keystore -v /data/wwwlogs/java/fblserver/:/data/wwwlogs/fblserver --name fblserver java:8u111 java -jar /data/java/fblserver*.jar

流程被触发后,上面的过程已经可以将项目打包成jar包,剩下的就是发布了

jenkins的工作目录的环境变量为$WORKSPACE,打包完成的文件位于$WORKSPACE/target目录下
cp $WORKSPACE/target/fblserver*.jar /data/java/ 只是为了将文件放在固定的目录便于管理,个人习惯

因为使用java的镜像运行容器,if判断就可以将前一次构建好的容器删除,然后运行新的容器,从而实现版本迭代。

docker run 命令中,几个挂载卷说明一下
-v /data/java/:/data/java上面cp命令将jar包复制到了/data/java/目录中,这个挂载是将包映射到容器中

-v /data/wwwroot/java/my.keystore:/data/wwwroot/java/my.keystore 证书,因为小程序需要证书,springboot框架中使用内置tomcat运行项目,并且配置证书就是个神坑,这个证书的转换都可以写篇文档

-v /data/wwwlogs/java/fblserver/:/data/wwwlogs/fblserver 日志的映射,文中开始代码中细心的朋友会看见log的路径

logging:path: /data/wwwlogs/xxx

将容器中的日志映射到本地的/data/wwwlogs/java/fblserver/目录中

构建后的操作

我在这里只设置了构建成功后的钉钉邮件通知
和zabbix配置邮件差不多的道理,这里使用了文中提到的Email Extension Template Plugin插件
配置参考上文中的系统设置项中的邮件配置

总结

以上只是讲了大概的配置过程,其实还有很多细节,我也在努力学习中
还有没有讲到的 pipeline 真的很强大,可以将上面所有的步骤以流水线的形式展现出来
包括docker的使用,文中提到的都是最基础的命令和参数,如果实际生产中有成百上千台机器,十几个项目同时进行,那才是最大的考验,文中所述只是流程走通
还有权限控制,级联操作都是很重要的技能,后期有涉及也会写博客发表

上一篇: Laravel -- Blade模板
下一篇: OpenGL杂七杂八
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,297