基于maven自动构建和部署工具-JDeploy

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' ];then
    echo "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_PATH

TAG_VERSION=$1
RELEASE_VERSION=$2
DEV_VERSION=$3
MVN_RELEASE_COMMAND="mvn -B release:prepare "
if [ "$TAG_VERSION" != "" ];then
    MVN_RELEASE_COMMAND="${MVN_RELEASE_COMMAND} -Dtag=${TAG_VERSION}"
fi
if [ "$RELEASE_VERSION" != "" ];then
    MVN_RELEASE_COMMAND="${MVN_RELEASE_COMMAND} -DreleaseVersion=${RELEASE_VERSION}"
fi
if [ "$DEV_VERSION" != "" ];then
    MVN_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 ];then
    echo "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" ]; then
        echo "Will kill tomcat: $PID"
        sh "$TOMCAT_PATH/shutdown.sh"
        sleep 6
else echo "No Tomcat Process $PID"
fi

PID=`ps aux | grep tomca[t] | grep jav[a] | awk '{print $2}'`

while [ -n "$PID" ]; do
        kill  $PID && sleep 1
        echo "Try to kill $PID"
        PID=`ps aux | grep tomca[t] | grep jav[a] | awk '{print $2}'`
done
#test -n $PID && kill $PID && sleep 1

sh "$TOMCAT_PATH/startup.sh"
sleep 3

PID=`ps aux | grep tomca[t] | grep jav[a] | awk '{print $2}'`
if [ -n "$PID" ]; then
        echo "\nRestart tomcat successfully!"
else
        echo "\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&amp;autoReconnect=true&amp;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&amp;autoReconnect=true&amp;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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值