基于maven自动构建和部署工具-JDeploy
2019独角兽企业重金招聘Python工程师标准>>>
1.主要功能
A.自动化编译和构建指定工程,并且将制品发布到maven私服
B.自动化更新工程版本号(开发版本号以及release版本号)
C.自动打release tag
D.根据指定的项目配置(profile), 自动分发部署项目到所有服务器
2.技术实现
2.1 准备
我会根据一个项目从头到尾搭建,来阐述使用方法
2.2 POM配置
必须采用maven构建,其中项目的pom.xml配置必须包含如下关键配置:
2.2.1 scm相关配置
主要用来让maven可以完成自动从svn下载代码并打tag使用
<scm> <connection>scm:svn:svn://scm.domain:18080/svn/AppDemo/trunk</connection> <developerConnection>scm:svn:svn://scm.domain:18080/svn/AppDemo/trunk</developerConnection>
</scm>
2.3 maven-release-plugin配置
使用maven-release-plugin主要完成项目的自动打tag和创建branch
<build>
<finalName>AppDemo</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.2.2</version>
<configuration>
<tagBase>svn://scm.domain:18080/svn/AppDemo/tags</tagBase>
<branchBase>svn://scm.domain:18080/svn/AppDemo/branches</branchBase>
<mavenExecutorId>forked-path</mavenExecutorId>
</configuration>
</plugin>
</plugins> 吧
</build>
2.3 profile配置
为了项目适应不同环境配置,maven提供了profile的概念,每个项目可以有多个不同的profile, 可以针对每个profile有不同的参数配置,比较常用的就是测试环境和线上环境
会采用不同的配置参数,那么就可以在pom.xml中增加test和production 2个profile, 具体配置如下:
<!-- 针对不同运行环境的配置-->
<profiles><profile><id>test</id><activation><activeByDefault>true</activeByDefault></activation><properties><active.profile.id>test</active.profile.id><db.url>jdbc:mysql://xx.xx.xx.xxx:3306/cms2</db.url><db.user>test</db.user><db.password>test</db.password><mq.address>xx.x.xx.x:61616</mq.address><cms.url>http://10.1.30.225/cms2/compile.action</cms.url></properties></profile><profile><id>product</id><activation><activeByDefault>false</activeByDefault></activation><properties><active.profile.id>product</active.profile.id><db.url>jdbc:mysql://host/cms</db.url><db.user>production</db.user><db.password>production</db.password><mq.address>xx.xx.xxx:61616</mq.address><cms.url>http://xx.xx.xxx/compile.action</cms.url></properties></profile></profiles>
然后配置POM文件中resources配置
<resources><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource>
</resources>
3.构建部署脚本
3.1 自动构建脚本
完成主要功能的1、2、3功能点,主要调用maven的2个主要命令: mvn release:prepare和mvn release:perform来完成,具体脚本内容如下:
#!bin/bash
if [ "$1" == 'help' ];thenecho "Usage: $0 tag(optional) releaseVersion(optional) developmentVersion(optional)"echo "examples: "echo "$0"echo "$0 vis-1.1.25 1.1.25 1.1.26-SNAPSHOT"echo "$0 vis-1.1.25"echo "$0 vis-1.1.25 1.1.25"exit 0
fi
#项目目录
JDEPLOY_HOME=`dirname $(cd "$(dirname "$0")"; pwd)`
#构建工程名称
PROJECT_NAME=AppDemo
#构建目录
BUILD_HOME=$JDEPLOY_HOME/data/build
#SVN_URL
SVN_URL=https://scm.domain:18080/svn/AppDemo/trunk#CHECKOUT项目
BUILD_PROJECT_PATH=$BUILD_HOME/$PROJECT_NAME
rm -rf $BUILD_PROJECT_PATH
svn checkout $SVN_URL $BUILD_PROJECT_PATH
cd $BUILD_PROJECT_PATHTAG_VERSION=$1
RELEASE_VERSION=$2
DEV_VERSION=$3
MVN_RELEASE_COMMAND="mvn -B release:prepare "
if [ "$TAG_VERSION" != "" ];thenMVN_RELEASE_COMMAND="${MVN_RELEASE_COMMAND} -Dtag=${TAG_VERSION}"
fi
if [ "$RELEASE_VERSION" != "" ];thenMVN_RELEASE_COMMAND="${MVN_RELEASE_COMMAND} -DreleaseVersion=${RELEASE_VERSION}"
fi
if [ "$DEV_VERSION" != "" ];thenMVN_RELEASE_COMMAND="${MVN_RELEASE_COMMAND} -DdevelopmentVersion=${DEV_VERSION}"
fi
echo ${MVN_RELEASE_COMMAND}
eval ${MVN_RELEASE_COMMAND}
##这里只想release:perform命令
mvn release:perform
3.2 自动部署脚本
#!/bin/sh
if [ $# -lt 1 ];thenecho "Usage: $0 tagName profile(optional)"exit 1
fi
#项目目录
JDEPLOY_HOME=`dirname $(cd "$(dirname "$0")"; pwd)`#构建项目名称
PROJECT_NAME=AppDemo
#构建目录
BUILD_HOME=$JDEPLOY_HOME/data/build
echo $BUILD_HOME
#部署目录
DEPLOY_HOME="/data/java"
#项目版本
SVN_TAG=$1
#目标IP
IP=10.121.49.131
#SVN资源库地址
SVN_PRO=https://scm.domain:18080/svn/AppDemo/tags/$PROJECT_NAME-${SVN_TAG}#CHEK OUT项目
BUILD_PROJECT_PATH=$BUILD_HOME/$PROJECT_NAME
rm -rf $BUILD_PROJECT_PATH
svn checkout $SVN_PRO $BUILD_PROJECT_PATH
cd $BUILD_PROJECT_PATH
MAVEN_PROFILE=${2:-test}
echo $MAVEN_PROFILE
echo Maven构建$PROJECT_HOME项目
mvn clean package -Dmaven.test.skip=true -P ${MAVEN_PROFILE}
#远程部署
DEPLOY_PROJECT_PATH=$DEPLOY_HOME/$PROJECT_NAME
ssh root@$IP "rm -rf $DEPLOY_PROJECT_PATH/* && mkdir -p $DEPLOY_PROJECT_PATH"
scp $BUILD_PROJECT_PATH/target/$PROJECT_NAME.war root@${IP}:$DEPLOY_PROJECT_PATH/$PROJECT_NAME.war
ssh root@${IP} "mkdir -p $DEPLOY_PROJECT_PATH; cd $DEPLOY_PROJECT_PATH; unzip $PROJECT_NAME.war && rm -f $PROJECT_NAME.war"
ssh root@${IP} "/usr/local/tomcat/bin/restart.sh"
3.3 tomcat 重启脚本
#!/bin/sh
TOMCAT_PATH=`dirname "$0"`echo "TOMCAT_PATH is $TOMCAT_PATH"PID=`ps aux | grep tomca[t] | grep jav[a] | awk '{print $2}'`if [ -n "$PID" ]; thenecho "Will kill tomcat: $PID"sh "$TOMCAT_PATH/shutdown.sh"sleep 6
else echo "No Tomcat Process $PID"
fiPID=`ps aux | grep tomca[t] | grep jav[a] | awk '{print $2}'`while [ -n "$PID" ]; dokill $PID && sleep 1echo "Try to kill $PID"PID=`ps aux | grep tomca[t] | grep jav[a] | awk '{print $2}'`
done
#test -n $PID && kill $PID && sleep 1sh "$TOMCAT_PATH/startup.sh"
sleep 3PID=`ps aux | grep tomca[t] | grep jav[a] | awk '{print $2}'`
if [ -n "$PID" ]; thenecho "\nRestart tomcat successfully!"
elseecho "\nFail to startup tomcat"exit 1
fi
4.案例演示
4.1.创建web项目
mvn archetype:create -DgroupId=com.bswan -DartifactId=AppDemo -DarchetypeArtifactId=maven-archetype-webapp
4.2 调整POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.bswan</groupId><artifactId>AppDemo</artifactId><packaging>war</packaging><version>1.5-SNAPSHOT</version><name>AppDemo Maven Webapp</name><url>http://maven.apache.org</url><scm><connection>scm:svn:https://scm.domain:18080/svn/AppDemo/trunk</connection><developerConnection>scm:svn:https://scm.domain:18080/svn/AppDemo/trunk</developerConnection></scm><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies><profiles><profile><id>test</id><activation><activeByDefault>true</activeByDefault></activation><properties><active.profile.id>test</active.profile.id><db.url>jdbc:mysql://xx.xx.xx.xxx:3306/cms2?useUnicode=true&autoReconnect=true&characterEncoding=UTF8</db.url><db.user>test</db.user><db.password>test</db.password><mq.address>xx.x.xx.x:61616</mq.address><cms.resource.compile.url>http://10.1.30.225/cms2/compile.action</cms.resource.compile.url></properties></profile><profile><id>product</id><activation><activeByDefault>false</activeByDefault></activation><properties><active.profile.id>product</active.profile.id><db.url>jdbc:mysql://:6080/cms2?useUnicode=true&autoReconnect=true&characterEncoding=UTF8</db.url><db.user>production</db.user><db.password>production</db.password><mq.address>xx.xx.xxx:61616</mq.address><cms.resource.compile.url>http://xx.xx.xxx/compile.action</cms.resource.compile.url></properties></profile></profiles><build><finalName>AppDemo</finalName><resources><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource></resources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-release-plugin</artifactId><version>2.2.2</version><configuration><tagBase>https://scm.domain:18080/svn//AppDemo/tags</tagBase><branchBase>https://scm.domain:18080/svn//AppDemo/branches</branchBase><mavenExecutorId>forked-path</mavenExecutorId></configuration></plugin></plugins></build></project>
4.3 增加配置文件
在src/main/resources 下创建jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
db.url=${db.url}
db.user=${db.user}
db.password=${db.password}
mq.address=${mq.address}
cms.url=${cms.url}
4.4 上传SVN
svn import -m "AppDemo init" AppDemo https://scm.domain :18080/svn/AppDemo/trunk
4.5 构建
4.5.1 配置
进入构建工具JDeploy/bin目录,初始pom.xml记录项目版本是 1.5-SNAPSHOT,目前该工具完善中,使用它可能需要手动修改这些配置
#构建工程名称
PROJECT_NAME=AppDemo
#构建目录
BUILD_HOME=$JDEPLOY_HOME/data/build
#SVN资源库地质
SVN_URL=https://scm.domain:18080/svn/AppDemo/trunk
4.5.2 执行
该执行自动发布版本
sh jrelease.sh
或者
sh jrelease.sh AppDemo-1.0 1.0 1.1-SNAPSHOT
参数说明:
AppDemo-1.0: 表示发布到tags版本名称
1.0 表示发布版本
1.1-SNPSHOT 表示下一个版本号
4.4 部署
4.4.1 配置
#构建项目名称
PROJECT_NAME=AppDemo
#构建目录
BUILD_HOME=$JDEPLOY_HOME/data/build
#部署目录
DEPLOY_HOME="/data/java"
#项目版本
SVN_TAG=$1
#目标IP
IP=10.121.49.131
#SVN资源库地址
SVN_PRO=https://scm.domain:18080/svn/AppDemo/tags/$PROJECT_NAME-${SVN_TAG}
4.4.2 远程Tomcat配置
Tomcat部署方式有四种,这里采用其中之一,在conf/localhost配置方式.进入 /usr/local/tomcat/conf/Catalina/localhost 目录下 创建一个ROOT.xml配置文件
<?xml version='1.0' encoding='utf-8'?>
<Context path="/ROOT" docBase="/data/java/AppDemo" debug="0" privileged="true"/>
PATH 值要和这个XML文件名称一致
docBase 值是DEPLOY_HOME值
4.4.3 执行
执行部署,会自动将指定的版本工程,下载编译,传到你目标机器上,并通过调用restart.sh 重启tomcat.
sh jdeploy.sh 1.6
5.代码下载
JDeploy 下载地址: https://git.oschina.net/blackswan/JDeploy.git
JDeployDemo下载地址:https://git.oschina.net/blackswan/AppDemo.git
转载于:https://my.oschina.net/guoenzhou/blog/394276
基于maven自动构建和部署工具-JDeploy相关推荐
- 用Ant实现Java项目的自动构建和部署
Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能.在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作. 一. ...
- 构建指定仓库_使用Travis CI自动构建和部署你的GitBook
本文,博主将会介绍利用Travis CI持续集成服务自动化构建和部署GitBook. 首先介绍一下TravisCI,下文摘自维基百科-Travis CI Travis CI是在软件开发领域中的一个在线 ...
- 怎么把项目推到gitlab上_Gitlab利用Webhook+jenkins实现自动构建与部署
之前部署了Gitlab的代码托管平台和Jenkins的代码发布平台.通常是开发后的代码先推到Gitlab上管理,然后在Jenkins里通过脚本构建代码发布. 这种方式每次在发版的时候,需要人工去执行j ...
- 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s
前言 在日常开发中,经常会有发布的需求,而且经常会碰到各种环境,比如:开发环境.测试环境.生产环境.虽然可以使用手动构建.上传服务器部署的方式,但在微服务架构下一个项目经常包含多个微服务的部署,如果用 ...
- gitlab 自动推送代码到gitee_Gitlab 利用 Webhook+jenkins 实现自动构建与部署
之前部署了Gitlab的代码托管平台和Jenkins的代码发布平台.通常是开发后的代码先推到Gitlab上管理,然后在Jenkins里通过脚本构建代码发布. 这种方式每次在发版的时候,需要人工去执行j ...
- linux maven自动构建,Centos7.3+Jenkins+Git+Maven 自动化构建部署项目
第一步 禁止 SELINUX 访问控制 修改配置之前先备份(良好习惯) sudo cp /etc/selinux/config /etc/selinux/config.bak 备份后,修改selinu ...
- Maven自动FTP远程部署
参照官网文档: https://maven.apache.org/plugins/maven-deploy-plugin/examples/deploy-ftp.html 1.在pom.xml中加入: ...
- 基于maven自动发布-Maven Wagon
发布方式 手工方式:需要做一系列的工作,上传到服务器,停止服务,删除旧文件,移动文件,启动服务等. 自动方式:一条命令完成以上所有过程 pom.xml <extensions><ex ...
- 【手把手教学】基于Maven构建方式使用Mybatis generator自动生成
简介 Mybatis generator是一种代码生成器, 可以基于数据库表的字段与类型,自动生成Java代码中对应的entity类.dao类.mapper映射文件. 实现Mybatis genera ...
- 使用Docker+Jenkins自动构建部署
转载自 https://segmentfault.com/a/1190000012921606 环境 阿里云ESC,宿主机服务器安装Docker,在安全规则中确认8080端口开启. 客户端mac 运行 ...
最新文章
- 微软亚洲研究院王井东:下一代视觉识别的通用网络结构是什么样的?
- Oracle Exadata 一体机关机过程(虚拟机环境)
- 未来经济 数字优先 | 大数据专场
- es6新增的html标签,javascript – 如何导入已在html中的标签中定义的es6模块?
- python还是java好找工作_你觉得学 Python 还是 Java 更好找工作?
- ELK下钉钉邮件告警通知
- ie下使用frameset布局导致跨域cookie丢失问题解决
- DJANGO输出HIGHCHARTS数据的样例
- 神经系统的肿瘤有哪些,脑神经肿瘤最常见的是
- 基于原语的千兆以太网RGMII接口设计
- 用C语言打印菱形图案
- php 汉字、字母验证码 例子
- python爬取北京租房信息
- 开源中国源码学习UI篇(一)之FragmentTabHost的使用分析
- 附件 计算机 丢失,Win10系统开始菜单中没有附件解决方法
- 记一次mysql数据库转储sql文件到另外一台电脑运行失败的解决办法
- dreamware选择HTML4类型,第十一章 dreamware数据源设计.docx
- 供应链中的安全库存(二)——Z值在安全库存中的应用
- 【SSL_P1502】校门外的树
- kaldi的egs/sitw实验调试过程(ssh.pl并行两台机器)