2009-04-08 133 views

回答

25

馬庫斯力士的想法也可以應用於具有的Maven2解決方案,配置文件管理:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.cargo</groupId> 
      <artifactId>cargo-maven2-plugin</artifactId> 
     </plugin> 
    </plugins> 
    ... 
</build> 
<profiles> 
    <profile> 
     <id>env-foo1</id> 
     <!-- Activated when -Denv=foo1 is given as parameter. --> 
     <activation> 
      <property> 
       <name>env</name> 
       <value>foo1</value> 
      </property> 
     </activation> 
     <properties> 
      <deploy.env>xxx</deploy.env> 
      <tomcat.manager>http://foo1/manager</tomcat.manager> 
      <tomcat.manager.username>foo</tomcat.manager.username> 
      <tomcat.manager.password>bar</tomcat.manager.password> 
     </properties> 
    </profile> 
    <profile> 
     <id>env-foo2</id> 
     <!-- Activated when -Denv=foo2 is given as parameter. --> 
     <activation> 
      <property> 
       <name>env</name> 
       <value>foo2</value> 
      </property> 
     </activation> 
     <properties> 
      <deploy.env>dev</deploy.env> 
      <tomcat.manager>http://foo2/manager</tomcat.manager> 
      <tomcat.manager.username>foo</tomcat.manager.username> 
      <tomcat.manager.password>bar</tomcat.manager.password> 
     </properties> 
    </profile> 
    ... 
</profiles>  

然後,你只需要運行X倍MVN命令,用適當的參數(-Denv = foo1-Denv = foo2的 ...)


除此之外,您可以通過提升我們這個解決方案連續集成服務器的Hudson的Matrix功能。我對這個功能here做了簡短的解釋。

基本上,您只需在Hudson中定義一個「正常」Maven2作業,並使用Matrix功能,您可以讓Hudson多次運行此作業,每個環境一個。在別人的話,您將創建哈德遜工作,然後你的ENV參數的所有可能值定義 「環境軸」:

  • foo1
  • foo2的
  • foo3
  • .. 。

哈德森然後將建立與MVN命令和與該參數-De應用NV = foo1。一旦這個構建完成後,將建立在相同的應用程序,但與參數-Denv = foo2的,等等...

這樣,哈德森將部署在每一個環境中應用程序。 ..

我希望我的解決方案將幫助你達到你的目標......

+1

哇靠,這是潛在的巨大有用的,因爲哈德森正是我在.... – cgp 2009-04-21 16:01:09

+0

有趣的是,這是類似於我給的鏈接是在暗示用這個目標,但它不是準確清晰。迫不及待地嘗試。 – cgp 2009-04-21 16:02:54

+2

有沒有辦法做到這一點,而不必調用Maven X次?在我看來,再次構建僅僅是部署是耗時的,而且如果在這些構建過程中發生了一些新的更改提交給代碼,它可能會導致在集羣中無法部署 – maverick 2012-08-01 20:11:38

1

在示例中定義的某處服務器(帶有樣品的用戶名/密碼)也許「最最小」的解決方案是不最小的。如果你在maven本身做這些事情時遇到問題,請嘗試使用ant:創建兩個不同的部署任務(每個服務器一個)以及另一個任務,將它們作爲依賴關係。有幾個例子說明如何使用ant部署到tomcat服務器。 Just google them。 做到這一點,您需要將新的ant任務整合到maven中,使用antrun插件並不困難。

+0

果然,我希望有一個例子。 – cgp 2009-04-20 21:38:10

0

這個答案是Jetty和一個稍微不同的情況,但你可能會發現它有用反正。

在以前的項目中,我們使用的碼頭,所以我寫了一個簡單的碼頭部署模塊會定期掃描Maven倉庫和下載,一旦他們成爲可部署新的文物。這在一個小型的分段和開發機器上運行良好。

您可以在谷歌代碼在Polar Rose Jetty Maven Deployer項目中的代碼。

請注意,我們只能這樣做是爲了發展和分期服務器。在我看來,生產應用永遠不應該自動升級。

8

至於使用多個配置文件,生命週期似乎重複某些步驟 - 例如使用由變量激活的配置文件時,測試次數增加了一倍。我們發現使用catalina-ant庫會更有效;)和更「最小」的。使用「executions」元素將「運行」目標附加到生命週期階段以簡化它,或者在包後運行:mvn package antrun:run

您可能會更喜歡ant-contrib庫,並創建一個帶有服務器列表的for循環,但是這裏有一個針對2個硬編碼服務器url的靜態配置。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.6</version> 
    <configuration> 
     <target> 
      <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"/> 
      <deploy url="http://tc-app-01:8080/manager" username="manager" password="pass" 
        path="/app-path" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/> 

      <deploy url="http://tc-app-02:8080/manager" username="manager" password="pass" 
        path="/app-path" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/> 
     </target> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>tomcat</groupId> 
      <artifactId>catalina-ant</artifactId> 
      <version>6.0.29</version> 
     </dependency> 
    </dependencies> 
</plugin> 

上面使用手動部署到我們的分佈式Maven倉庫卡特琳娜 - 螞蟻的特定版本,它可以在Tomcat中分佈的lib目錄中找到。

2

這是一個相當晚的答案一個老問題,但我敢肯定人們會感興趣。我剛剛實現了使用maven和ant任務運行多個部署。祕訣是使用macrodef(或2對我來說,因爲我熱在碼頭部署我的應用程序和需要轉移戰爭和XML文件),並使用ant屬性文件:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.7</version> 
    <executions> 
     <execution> 
      <phase>install</phase> 
      <configuration> 
       <tasks> 
        <taskdef name="scp" 
         classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp" 
         classpath="/usr/local/java/ant/lib/ant-jsch.jar:/usr/local/java/ant/lib/jsch-0.1.45.jar" /> 
        <macrodef name="deploy"> 
         <attribute name="server" default="NOT SET" /> 
         <attribute name="file" default="NOT SET" /> 
         <attribute name="todir" default="NOT SET" /> 
         <attribute name="port" default="NOT SET" /> 
         <attribute name="passphrase" default="NOT SET" /> 
         <attribute name="keyfile" default="NOT SET" /> 
         <sequential> 
          <echo message="Deploying to @{server}" /> 
          <echo message="Deploying @{file} to @{todir}" /> 
          <scp 
           file="@{file}" todir="@{todir}" 
           port="@{port}" passphrase="@{passphrase}" 
           keyfile="@{keyfile}" /> 
         </sequential> 
        </macrodef> 
        <macrodef name="deploy-app"> 
         <attribute name="config" default="NOT SET" /> 
         <sequential> 
          <property file="deploy.properties"/> 
          <echo message="Deploying to @{config}" /> 
          <deploy server="${@{config}.jetty.server.host}" 
            file="${project.build.directory}/${project.build.finalName}.${project.packaging}" 
            todir="${@{config}.jetty.server.user}@${@{config}.jetty.server.host}:${@{config}.jetty.server.baseDir}/${@{config}.jetty.server.webappsDir}" 
            port="${@{config}.jetty.server.port}" 
            passphrase="${@{config}.jetty.server.passphrase}" 
            keyfile="/home/steff/.ssh/id_rsa"/> 
          <deploy server="${@{config}.jetty.server.host}" 
            file="${project.build.finalName}.xml" 
            todir="${@{config}.jetty.server.user}@${@{config}.jetty.server.host}:${@{config}.jetty.server.baseDir}/${@{config}.jetty.server.contextDir}" 
            port="${@{config}.jetty.server.port}" 
            passphrase="${@{config}.jetty.server.passphrase}" 
            keyfile="/home/steff/.ssh/id_rsa"/>          
         </sequential> 
        </macrodef>        
        <deploy-app config="home"/>  
        <deploy-app config="wap"/> 
       </tasks> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

那你的屬性文件的需要是這樣的:

home.jetty.server.user= 
home.jetty.server.port= 
home.jetty.server.host= 
home.jetty.server.baseDir= 
home.jetty.server.webappsDir= 
home.jetty.server.contextDir= 
home.jetty.server.passphrase= 
wap.jetty.server.user= 
wap.jetty.server.port= 
wap.jetty.server.host= 
wap.jetty.server.baseDir= 
wap.jetty.server.webappsDir= 
wap.jetty.server.contextDir= 
wap.jetty.server.passphrase= 

等等......通過

<deploy-app config="<config>"/> 

訣竅使用每臺服務器配置選項的塊是使用@ {}作爲優先macrodef屬性在屬性評價$ { }在螞蟻中。