2009-04-08 52 views
19

Ví dụ tối thiểu nhất về việc triển khai một cuộc chiến cho nhiều máy chủ tomcat bằng cách sử dụng maven có thể được viết là gì?Maven triển khai nhiều máy chủ Tomcat

Tôi đã thử các URL sau và yêu cầu danh sách gửi thư nhưng không tìm ra bất kỳ thứ gì ngắn và chỉ hoạt động.

Ví dụ nên có các máy chủ được định nghĩa trong ví dụ ở đâu đó (với tên người dùng mẫu/mật khẩu)

Trả lời

25

Ý tưởng của Markus Lux cũng có thể được áp dụng với một giải pháp Maven2, với các cấu hình quản lý:

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

Sau đó, bạn sẽ chỉ cần chạy X lần so với lệnh mvn, với tham số đầy đủ (-Denv = foo1, -Denv = foo2 ...)


Bên cạnh đó, bạn có thể nâng cao giải pháp này bởi chúng tôi nhập tính năng Ma trận của máy chủ Hudson Tích hợp liên tục. Tôi đã đưa ra một giải thích ngắn về tính năng này here.

Về cơ bản, bạn chỉ cần xác định công việc "bình thường" Maven2 ở Hudson và với tính năng Ma trận, bạn có thể yêu cầu Hudson chạy công việc này nhiều lần, mỗi lần một môi trường. Nói cách khác, bạn tạo việc Hudson của bạn, và sau đó bạn xác định "trục môi trường" với tất cả các giá trị có thể cho env tham số:

  • foo1
  • foo2
  • foo3
  • .. .

Hudson sau đó sẽ xây dựng ứng dụng với lệnh mvn và với tham số -de nv = foo1 .Sau khi xây dựng này được hoàn thành, nó sẽ xây dựng ứng dụng tương tự nhưng với tham số -Denv = foo2, và vân vân ...

Bằng cách này, Hudson sẽ triển khai ứng dụng của bạn trong mọi môi trường. ..

tôi hy vọng giải pháp của tôi sẽ giúp bạn đạt được mục tiêu của mình ...

+1

Holy crap, điều này có khả năng cực kỳ hữu ích, vì Hudson chính xác là những gì tôi đang nhắm mục tiêu bằng cách sử dụng ... – cgp

+0

Điều thú vị là, điều này tương tự như liên kết mà tôi đưa ra là gợi ý, nhưng nó không rõ ràng. Cant chờ đợi để thử nó. – cgp

+2

Có cách nào để làm điều này mà không cần phải gọi maven X lần? dường như với tôi rằng việc xây dựng lại chỉ để triển khai là tốn thời gian, cộng với nó có thể dẫn đến vô tình triển khai trên một cụm nếu có thay đổi mới cam kết với mã trong các bản dựng này – maverick

1

Có lẽ "nhất tối thiểu" giải pháp không phải là tối thiểu ở tất cả. Nếu bạn có vấn đề với việc làm điều đó trong chính maven, hãy thử sử dụng ant: tạo hai nhiệm vụ triển khai khác nhau (một cho mỗi máy chủ) và một nhiệm vụ khác có chúng làm phụ thuộc. Có một số ví dụ làm thế nào để triển khai đến một máy chủ tomcat sử dụng ant. Just google them. Thực hiện việc này, bạn cần tích hợp các tác vụ kiến ​​mới vào con quạ vốn không khó chút nào bằng cách sử dụng plugin antrun.

+0

Đúng, tôi đã hy vọng một ví dụ. – cgp

0

câu trả lời này là dành cho Jetty và cho một tình huống hơi khác nhau, nhưng bạn có thể tìm thấy nó hữu ích anyway.Trong một dự án trước đây, chúng tôi đã sử dụng Jetty, vì vậy tôi đã viết một mô-đun triển khai Jetty đơn giản để định kỳ quét kho lưu trữ maven và tải xuống và triển khai các tạo phẩm mới ngay sau khi chúng có sẵn. Điều này chạy tốt trên một cụm nhỏ các máy dàn dựng và phát triển.

Bạn có thể tìm mã tại Mã Google trong dự án Polar Rose Jetty Maven Deployer.

Lưu ý rằng chúng tôi chỉ thực hiện việc này cho các máy chủ phát triển và dàn dựng. Trong các ứng dụng sản xuất ý kiến ​​của tôi sẽ không bao giờ được nâng cấp tự động.

8

Liên quan đến việc sử dụng nhiều cấu hình, vòng đời dường như lặp lại các bước nhất định - ví dụ: số lượng các bài kiểm tra tăng gấp đôi khi sử dụng các cấu hình được kích hoạt bởi các biến. Chúng tôi thấy rằng việc sử dụng thư viện catalina-ant hiệu quả hơn nhiều;) và nó càng "tối thiểu". Sử dụng phần tử "executions" để đính kèm mục tiêu "chạy" vào một vòng đời để sắp xếp nó, hoặc chạy sau gói: mvn package antrun: chạy

Bạn có thể thích thú hơn với thư viện ant-contrib, và tạo một vòng lặp for với danh sách máy chủ, nhưng đây là cấu hình tĩnh cho 2 url máy chủ được mã hóa cứng.

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

Phiên bản cụ thể của catalina-ant sử dụng trên được tự triển khai tới kho maven phân phối của chúng tôi, nó có thể được tìm thấy trong thư mục lib của phân phối tomcat.

2

Đây là câu trả lời khá muộn cho một câu hỏi cũ, nhưng tôi khá chắc chắn mọi người sẽ quan tâm đến nó. Tôi chỉ đạt được để chạy nhiều triển khai bằng cách sử dụng các nhiệm vụ maven và ant. Bí quyết là sử dụng một macrodef (hoặc 2 đối với tôi như tôi nóng triển khai ứng dụng của tôi ở cầu cảng và cần phải chuyển một cuộc chiến tranh và một tập tin xml) và sử dụng một tập tin bất động sản kiến:

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

Sau đó, bạn tập tin bất động sản nhu cầu là một cái gì đó như:

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= 

vv ... trên một khối tùy chọn trên mỗi máy chủ cấu hình được sử dụng bởi

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

Bí quyết là thuộc tính macrodef sử dụng @ {} như được ưu tiên hơn việc đánh giá tài sản $ { } trong ant.

Các vấn đề liên quan