JAVA项目持续集成发布

标签(空格分隔): java jenkins


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

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

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

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

整个流程图如下:

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

# Tomcat
server:
tomcat:
uri-encoding: UTF-8
max-threads: 1000
min-spare-threads: 30
port: 8090
connection-timeout: 5000ms
servlet:
context-path: /

spring:
# 环境 dev|test|prod
profiles:
active: test #### 指明环境 push到测试就指向test / push到生产就指向master
# Tomcat
server:
tomcat:
uri-encoding: UTF-8
max-threads: 1000
min-spare-threads: 30
port: 8090
connection-timeout: 5000ms
servlet:
context-path: /

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

#配置日志文件路径
logging:
path: /data/wwwlogs/xxx
#https签名
server:
ssl:
key-store: /data/wwwroot/java/my.keystore
key-store-password: 1234567890
#druid数据库连接
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
druid:
datasource1: #数据源1
url: jdbc:mysql://127.0.0.1:3366/xxx
username: root
password: o0o0oo0
datasource2: #数据源2
url: jdbc:mysql://127.0.0.1:3366/xxx
username: root
password: o0o0oo0
datasource3: #数据源3
url: jdbc:mysql://xxxx:3306/xxxx?characterEncoding=utf8&useSSL=true
username: evan
password: evan
initial-size: 10
max-active: 100
min-idle: 10
max-wait: 60000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-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
    权限管理插件
系统设置

配置图,重点是邮件配置

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

发件人邮箱认证中的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的笔记中会详细说明

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

整个页面配置如图

整个配置过程逻辑很清晰

参数化构建过程

这里采用的是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; then
docker rm -f fblserver
fi

docker 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的使用,文中提到的都是最基础的命令和参数,如果实际生产中有成百上千台机器,十几个项目同时进行,那才是最大的考验,文中所述只是流程走通
还有权限控制,级联操作都是很重要的技能,后期有涉及也会写博客发表

jenkins+maven+docker集成java发布(一)自动发布的更多相关文章

  1. jenkins+maven+docker集成java发布(二)#远程发布

    jenkins+maven+docker集成java发布(一)中写了在Jenkins服务器自动部署业务,那需要将java项目部署到其他服务器怎么操作 这里需要依赖插件Publish Over SSH ...

  2. [ jenkins ] git+jenkins+maven + ansible 部署java程序

    1. 工具介绍 git:版本控制,一般都是托管到代码仓库的.如 github.coding.gitlab (本文以 coding 为例) jenkins:持续集成工具之一,也是最常用的工具,主要工作就 ...

  3. Jenkins 基于 Docker git JAVA CI/CD

    准备两台机器 192.168.31.200 centos7  docker harbor git 192.168.31.201 centos7  docker jenkins maven git Ha ...

  4. windows server 服务器安装jenkins 并通过git拉取代码实现自动发布到IIS

    Jenkins是一个开源软件,可以通过一定的配置进行自动构建,测试,部署等功能. 首先,服务器应安装好 .NET Core环境和JDK, 下载Jenkins安装包 https://www.jenkin ...

  5. 【适合公司业务】全网最详细的IDEA里如何正确新建【普通或者Maven】的Java web项目并发布到Tomcat上运行成功【博主强烈推荐】(类似eclipse里同一个workspace下【多个子项目】并存)(图文详解)

    不多说,直接上干货! 首先,大家要明确,IDEA.Eclipse和MyEclipse等编辑器之间的新建和运行手法是不一样的. 如果是在Myeclipse里,则是File -> new -> ...

  6. Jenkins+Maven+Github+Springboot实现可持续自动部署(非常详细)

    目前公司开发的项目已经部署到服务器上,部署项目的测试环境和生产环境,加上每个项目n个服务,于是我就 , 骚就是骚,但是就是太累了,于是花点时间研究了一下Jenkins. Jenkins的作用和它的lo ...

  7. Jenkins和Gitblit集成实现提交后自动构建

    Gitblit是一个纯Java基于git的解决方案.它属于Apache Allura等伪造软件之一,它将票务系统与web ui结合在一起.我经历了一个设置过程,我想我可以帮助新用户避免痛点. 使用场景 ...

  8. Jenkins02:Jenkins+maven+svn集成

    1.安装Maven并配置环境变量 下载maven(windows下载zip包,linux下载tar.gz包),然后配置环境变量 在项目中使用maven,可以从java中央仓库中获取到项目所依赖的jar ...

  9. Jenkins+maven+SVN构建java项目中遇到的问题及解决

    [ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a g ...

随机推荐

  1. maven---Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4

    Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4 Failure to transfer or ...

  2. SolidWorks二次开发的研究

    三维机械设计软件SolidWorks是一套基于Windows的CAD/CAE/CAM/PDM桌面集成系统,是由美国SolidWorks公司在总结和继承大型机械CAD软件的基础上,在Windows环境下 ...

  3. Python——追加学习笔记(四)

    函数 1.python里的函数可以返回一个值或者对象,知识在返回一个容器对象的时候有点不同,看起来像是能返回多个对象. >>> def bar(): ... return 'abc' ...

  4. 2.Zabbix 3.0 部署

    请查看我的有道云笔记地址: http://note.youdao.com/noteshare?id=0db90549f9f347faf928b781087b28c9&sub=AAA6CE2FA ...

  5. March 24 2017 Week 12 Friday

    Our lives are brief, that is why it's important to search for meaning. 人生短暂,所以才要寻找它的意义. What can we ...

  6. 如何使用Kubernetes里的NetworkPolicy

    创建一个类型为NetworkPolicy的Kubernetes对象的yaml文件. 第九行的podSelector指定这个NetworkPolicy施加在哪些pod上,通过label来做pod的过滤. ...

  7. 2018.11.17 Struts2框架入门

    Struts2 框架学习 一.struts2是什么? (1)概念 (2)struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 (3)st ...

  8. 2018.10.2 Eclipse中如何测地修改一个we项目步骤

    找到项目的web.xml文件 大概的路径如下: 修改xml文件中的display-name 节点的值 下一步就是切换工作目录 显示的效果 打开最后一个文件修改 接下来找到这个文件 是部署的时候用的 运 ...

  9. React.js 中文文档

    转自http://react-china.org/t/react-js/398的jsgeeker 中文文档地址 http://reactjs.cn GitHub地址 https://github.co ...

  10. Tomcat+Oracle配置连接池的例子

    我这有一个Tomcat+Oracle连接池的例子,放上来和大家分享一下. Tomcat +Oracle  连接池配置   Author: Kenneth.Leaf@GalaxySoft Date: / ...