使用构建部署到生产的最简单方法

sha*_*unc 20 deployment tomcat maven

我必须承认,在多年生活在极好的debuild/ant/makefile嵌合构造的世界中,我对maven世界不熟悉.我只是没有那种帮助经验丰富的开发人员选择正确决定的感觉,而且看起来maven有很多不同的方式.

所以,我有一个包含web-app的简单项目.我基本上想要跟随:

  • 部署到开发Tomcat(我使用的是tomcat:deploy),然后什么都不做.
  • 部署到生产Tomcat,但在部署更新git repo 之前,添加标记提交和升级构建版本.

为了区分开发和生产,我创建了配置文件,dev以及prod.该dev配置文件默认激活.当我想将某些东西部署到生产中时,我只需输入mvn -P prod tomcat:deploy

我已经阅读了关于发布插件以及buildnumber插件的内容.但我只是不确定我是否正确行事.

所以,问题是 - 解决我正在询问的任务的最简单,自足和"少年"方式是什么.

Jea*_*evy 22

Shabunk,正如我所评论的那样,Maven正在推动你做最好的方式来做你想做的事情,继承了多年的开发经验.

我会解释我会做什么(以及我自己真正做过的).

所以你正确使用Maven Release Plugin,再加上另一个(例如货物)你正试图做两件不同的事情:

  • 识别唯一版本,即标记它,并更新新版本的pom
  • 部署您的应用程序(无论它是哪个环境)

Maven Release插件

考虑一下你自己的流程可能比其他开发团队习惯的更轻松.我的意思是大型团队的单元测试和生产部署之间有更多的步骤(问答,用户接受,非回归支持).您似乎可以创建一个链接标记和生产部署的快捷方式.如果您想在不同的环境(集成,用户接受,性能,preprod等)上部署您的webapp,您必须识别您的版本并且必须能够再次构建它(确定并且"可重复").

maven-release-plugin的目的是什么.它可以帮助您验证源代码是否干净(源代码管理下的所有文件,无需修改),可以编译并通过所有测试阶段.然后,它处理pom版本和标记,并通过存储它以供以后在Maven企业存储库中使用来完成.

您有许多配置要设置(ditributionManagement,SCM,maven插件发布配置).但是一旦它到位,在一个简单的命令行中释放版本:

mvn release:prepare release:perform
Run Code Online (Sandbox Code Playgroud)

如果你想要一些例子,我可以给你一些.

<scm>
    <!-- Base URL repository -->
    <url>scm:svn:http://svn.myorg.corp/svn/repository/</url>
    <!-- Developper URL (from trunk or branche) -->
        <developerConnection>scm:svn:http://svn.myorg.corp/svn/repository/trunk/project1</developerConnection>
  <connection>scm:svn:http://svn.myorg.corp/svn/repository/trunk/project1</connection>


</scm>
<build>
    <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-scm-plugin</artifactId>
                <version>1.6</version>
                <configuration>
            <username>${from.settings.xml.user}</username>
            <password>${from.settings.xml.password}</password>
                </configuration>
    </plugin>

    <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.2.2</version>
                <configuration>
                <tagBase>http://svn.myorg.corp/svn/repository/tags/</tagBase>
            <scmCommentPrefix>[DEV#SCM]</scmCommentPrefix>
        </configuration>
    </plugin>
</plugins>
    [...]
</build>
<distributionManagement>
    <repository>
        <id>enterprise_repo</id>
        <name>Enteprise Repository on Artifactory - Stable versions</name>      <url>http://repo.corp:8080/artifactory/prj-xxx-releases</url>
    </repository>
    <snapshotRepository>
        <id>enterprise_repo</id>
        <name>Enteprise Repository on Artifactory - DEV versions</name>
        <url>http://repo.corp:8080/artifactory/prj-xxx-snapshots</url>
    </snapshotRepository>
    <site>
        <id>corporate_site</id>
        <name>Corporate public site</name>
        <!-- must add wagon plugin that support this protocol -->
        <url>ftp://...</url>

    </site>
</distributionManagement>
Run Code Online (Sandbox Code Playgroud)

Deployement

再一次,您可能需要多个环境来测试您的应用程序.有许多插件可以让你发送和部署你的战争:一般货物插件,或更具体的tomcat-plugin,glassfish-plugin,...插件让你无法做你想做的事.然后,可以以多种方式执行配置.

Full Maven方式:Maven 的完全集成方式是使用Profile和Filters.正如您所知,简档描述了适当性和行为.过滤器是一种.properties,它将一组变量分组,用于将xml配置文件中的模式替换为war(例如,db connection).它不是我使用的那个,因为我发现它不如外化文件灵活.但是不要紧

Maven及其生态系统: 我更喜欢的方式是使用Maven和Jenkins(或Continous Integration工具)构建我的应用程序.这就是为什么我同意Aaron说他必须克服你的工具的局限性.使用Jenkins,我每小时/每天运行我的应用程序对抗单元测试,生成问答报告,文档,......我有一个发布版本,可以帮助我生成我想要的所有内容(给我的测试团队或我的客户),我为我的工作提供了一些信息,以便将其部署到不同的环境中(使用maven配置文件或jenkins内置配置).

它对我来说真的很好,我很确定这是正确的方法.

[编辑]


部署

再一次,部署意味着生命周期的不同阶段.

本地/开发环境

我永远不会使用tomcat:部署到现在,但仅仅因为我更喜欢使用jetty作为轻型Web容器(并且与maven集成).但我很确定每个配置都适合您的需求.

持续集成环境 在持续集成环境中,我通常直接使用Jenkins复制战争(在所需的机器上导出*.war).我的方式取决于很多事情:

  • 如果CI软件与您的应用服务器(Tomcat,Jboss,Weblogic,Glassfish等)相同(物理|虚拟)服务器,或远程服务器=>复制时间将超出服务器刷新时间并将产生不安全的部署(通常损坏的档案)
  • 如果服务器支持热重新加载(在Tomcat的web-apps中爆炸的战争)或者至少知道文件系统修改(JBoss的/ deploy中的完整战争)
  • 如果您之前需要停止服务器,...

大多数时候,这是一个简单的副本.如果我不能,我会使用一些集成的maven插件(比如jahia:为着名的CMS部署插件:www.jahia.com),或者只是货物插件:http://cargo.codehaus.org/Maven2+plugin .我没有任何例子,但在互联网上找到一些很容易,因为这种配置经常被推荐.

问答/验收/生产环境

对于那些经常(就我在工作中看到的那样)处理服务水平协议的环境,我们(我或管理团队)编写了一些特定的脚本.我相信你会变得沮丧,但正如我所提到的,我并不依赖于Maven的一切,尤其是部署.恕我直言,这是这个工具的一个限制.您可以依赖货物插件或特定货物插件,但是发布版本或构建版本与实际部署不匹配(按时间顺序).更重要的是,我没有找到任何允许我轻松部署在多个实例上的插件......甚至值得你不得不按特定顺序关闭实例(SLA的需求).也就是说,我没有提到外部属性,SQL脚本或其他任何东西.它们是依赖专用工具的其他原因.

所以,通常,我们编写了自己的ant/sell脚本.如果其他人有更好的解决方案,我显然对此感兴趣!

我希望我很清楚.

问候.