当前位置: 首页 > 面试题库 >

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

逄兴昌
2023-03-14
问题内容

我必须承认在生活在巨大的debuild / ant /
makefile嵌合结构世界中多年后,我还是Maven世界的新手。我只是还没有那种感觉,可以帮助经验丰富的开发人员选择正确的决策,而且看来Maven中有很多不同的方法。

因此,我有一个包含web-app的简单项目。我基本上想要以下内容:

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

为了区分开发和生产,我创建了配置文件devproddev默认情况下,配置文件是激活的。当我想将某些东西部署到生产中时,我只需输入mvn -P prod tomcat:deploy

我已经阅读了有关发行插件以及buildnumber插件的信息。但是我不确定我是否会正确。

因此,问题是-解决我要问的任务的最简洁,自成体系和“保守”的方法是什么?


问题答案:

正如我被评论过的,Shabunk继承了多年开发人员的经验,Maven正在驱动您以最佳方式完成您想要的事情。

我会解释我会做的事情(以及我本人真正要做的事情)。

因此,您正确使用Maven Release Plugin,再加上一个(例如,货运),您正在尝试做两种不同的事情:

  • 识别唯一的版本,这意味着对其进行标记,并为新版本更新pom
  • 部署您的应用程序(无论是哪个环境)

Maven发布插件

考虑到您自己的流程可能比其他开发团队所习惯的更加清晰。我的意思是,在较大的团队中,单元测试和生产部署之间需要采取更多步骤(Q&A,用户接受度,非回归标准)。看来您做了链接标签和生产部署的快捷方式。如果要在不同的环境(集成,用户接受度,性能,预生产等)上部署Web应用程序,则必须标识您的版本并必须能够再次构建它(确定并“可重复”)。

那就是maven-release-
plugin的目的。它可以帮助您验证源代码是否干净(所有文件均在源代码控制下,且无修改),可以编译并通过所有测试阶段。然后,它处理pom版本和标记,最后将其存储以供以后在Maven企业存储库中使用。

您需要设置许多配置(ditributionManagement,SCM,maven插件发行版配置)。但是一旦安装到位,发布版本就可以放在一个简单的命令行中:

mvn release:prepare release:perform

如果您需要一些示例,我可以给您一些示例。

<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>

部署

同样,您可能要在多个环境中测试您的应用程序。有许多插件可让您发送和部署战争:一般的货物插件,或更具体的tomcat插件,glassfish插件,…插件使您能够做自己想做的事情。然后,可以以多种方式执行配置。

完整的Maven方式:
与Maven的完整集成方式是使用Profile或Filters。如您所知,配置文件可以描述特性和行为。过滤器是.properties的一种,它对一组变量进行分组,这些变量将用于将xml配置文件中的模式替换为war(例如db连接)。它不是我使用的那个,因为我发现它不如外部化文件灵活。但是不要紧

Maven及其生态系统: 我更喜欢用Maven和Jenkins(或Continuous
Integration工具)构建应用程序。这就是为什么我同意亚伦说您必须了解您的工具的局限性的原因。使用Jenkins,我每天/每个小时都要针对单元测试,生成的问答报告,文档等等运行我的应用程序……我有一个发行版,可以帮助我制作出想要交付给我的所有内容(交付给我的测试团队或客户),我为工作提供了一些信息,以将其部署到不同的环境中(使用maven配置文件或jenkins内置配置)。

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

[编辑]

部署方式

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

本地/开发环境

到目前为止,我永远不会使用tomcat:deploy,只是因为我更喜欢将码头用作轻型Web容器(并与maven很好地集成在一起)。但是我很确定每种配置都可以满足您的需求。

连续集成环境 在连续集成环境中,我通常直接与Jenkins复制战争(在所需的计算机上导出* .war)。我的工作方式取决于很多事情:

  • 如果CI soft与您的应用程序服务器(Tomcat,Jboss,Weblogic,Glassfish等)位于同一台(物理)服务器上,或者远程服务器=>复制时间将浪费服务器刷新时间,并且会产生不安全的部署(通常是损坏的档案)
  • 服务器是否支持热重载(对于Tomcat,Web应用程序中发生了爆炸式战争)或至少知道文件系统修改(对于JBoss,在/ deploy中进行了全面战争)
  • 如果您需要先停止服务器,…

大多数时候,它是一个简单的副本。如果不能,我将使用一些集成的M​​aven插件(例如著名的CMS的jahia:deploy插件:www.jahia.com),或者仅使用cargo插件:http
://cargo.codehaus.org/Maven2+plugin
。我没有任何示例,但是在Internet上找到一些示例确实很容易,因为通常建议使用此配置。

问答/验收/生产环境

对于那些经常(据我在工作中所见)处理服务水平协议的环境,我们(我或管理团队)编写了一些特定的脚本。我敢肯定您会失望的,但是正如我提到的,我并不依赖Maven来完成所有事情,尤其是部署。恕我直言,这是此工具的一个限制。您也许可以依靠货运插件,也可以依靠特定的插件,但可以发布一个版本,或者构建一个与实际部署不匹配(按时间顺序)的版本。更重要的是,我找不到任何可以轻松在多个实例上进行部署的插件……甚至值得您以特定顺序关闭实例(SLA的需要)。就是说,我没有提到外部属性,SQL脚本或其他任何内容。它们是依赖专用工具的其他原因。

因此,通常,我们编写了自己的ant / sell脚本。如果其他人有更好的解决方案,那么我显然很困惑!

我希望我足够清楚。

问候。



 类似资料:
  • 问题内容: 我是ReactJS的新手,正在尝试了解什么是将代码部署到生产中的最佳方法。按照下面的链接,我正在使用babel作为下面的代码进行构建,但是我想知道 这是否很好,或者是否有 将ReactJS部署到生产中的 其他最佳实践 : http://www.sitepoint.com/getting-started-react- jsx/ 这是我的index.html和main.js文件: inde

  • 也许有一些我看不到的非常简单的东西。我正在尝试从某个API调用一个方法,这个方法要求PendingIntent异步向我发送一些值。我已经阅读了半小时的文档和示例,无法理解简单的方法。 更准确地说,我想调用ActivityRecognitionApi。为了举例说明,我是如何从类似的api接收位置的: 所以我想做同样的事情来接收认可的活动: 那么,创建一个PendingEvent来获取价值的简单方法是

  • 删除警告 为了减少文件大小,Vue 精简独立版本已经删除了所有警告,但是当你使用 Webpack 或 Browserify 等工具时,你需要一些额外的配置实现这点。 Webpack 使用 Webpack 的 DefinePlugin 来指定生产环境,以便在压缩时可以让 UglifyJS 自动删除代码块内的警告语句。例如配置: var webpack = require('webpack') mo

  • 本文向大家介绍Django + Uwsgi + Nginx 实现生产环境部署的方法,包括了Django + Uwsgi + Nginx 实现生产环境部署的方法的使用技巧和注意事项,需要的朋友参考一下 如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。 uwsgi介绍 uWSGI是一个Web服务器,它实现了WSGI协议、uws

  • 我有一个应用程序,其中前端部署到Netlify,Strapi后端部署到Heroku。我最近将Strapi从v3.0.6升级到了v3.1.3。我以前在生产中使用PostgresQL,所以随着Strapi的升级,我也在尝试转移到MongoDB。 我正在尝试将我的后端部署到生产环境中,但是我不断收到503错误并且应用程序崩溃。您可以从下面的错误日志中看到连接到Mongo数据库存在问题。 以下是我在Her

  • 有一个springboot项目想部署到阿里云上,需要简化部署流程,需要咨询几个问题: 1.生产上使用docker容器部署还是直接手动安装jdk,打jar包上传服务器? 2.使用宝塔部署安全可靠吗,是否可以简化部署,没使用过宝塔? 3.项目用到了MySQL和Redis,单独购买云数据库还是在运行springboot的服务器里自己安装MySQL和Redis服务? 4.项目是前后端分离的,是要单独再购买

  • 我是部署新手,我已经将jar文件作为一个包,我应该如何在prod服务器中进行部署? 我的prod服务器基本上是运行在AWS上的EC2机器 我应该运行java-jar“jar文件”吗?这是prod服务器的实践方式吗? 我应该将. jar文件打包到ears/war并部署在tomcat/jboss服务器中吗? 感谢您的帮助!

  • san build是生产环境打包,下面详细说下用法。 使用命令 san build [entry] entry:入口文件,用于编译单一文件,不传入,则从当前工作目录,读取 Config 文件的 pages 配置项。 打包结束之后,build 命令默认会生成产出物报表,效果如下: 参数说明 跟性能相关 --modern 是否使用 modern mode 打包,值为 true 或 false,默认是