2008-12-02 25 views
7

Chúng tôi đang trong quá trình chuyển đổi quy trình xây dựng chính từ kiến ​​thành maven. Chúng tôi sử dụng TeamCity cho máy chủ Continuous Integration (CI) của chúng tôi.Làm cách nào để có thể sử dụng maven trong tình huống tích hợp liên tục để cài đặt các tạo tác phiên bản trong kho lưu trữ?

Chúng tôi muốn sử dụng máy chủ CI để khởi động (hàng đêm) bản dựng có phiên bản chứa số bản dựng, như trong 1.0.0.build #. Các bản dựng này sẽ được cài đặt trong kho lưu trữ maven cục bộ của chúng ta để các dự án khác sử dụng. Vì vậy, máy chủ CI sẽ quản lý các phiên bản, maven sẽ xây dựng dự án và kho lưu trữ maven sẽ làm cho các bản dựng có thể truy cập được vào các dự án khác.

tôi dự định để bắt đầu xây dựng từ máy chủ CI bằng cách sử dụng lệnh sau:

mvn -Dversion=1.0.0.25 install 

pom của dự án sẽ có một số phiên bản giả mạo, và cờ -D sẽ ghi đè lên nó, như trong:

<version>0.0.0.0</version> 

Vấn đề với phương pháp này là plugin cài đặt maven chỉ sử dụng phiên bản trong tệp pom chứ không sử dụng phiên bản được truyền trên dòng lệnh. Điều này được ghi nhận trong this maven issue.

Vì sự cố này đã tồn tại kể từ tháng 08/2006 và chưa được khắc phục, tôi cho rằng đây không phải là 'cách quạ'. Vì vậy, câu hỏi của tôi là, làm thế nào có thể quạ được sử dụng trong một tình huống tích hợp liên tục để cài đặt các tạo tác phiên bản trong kho lưu trữ?

Trả lời

6

Có vẻ như bạn muốn xây dựng các phiên bản SNAPSHOT với các phiên bản duy nhất.

Vì vậy, trong POM của bạn tuyên bố phiên bản như:

<version>#.#.#-SNAPSHOT</version> 

Sau đó, trong distributionManagement phần của POM của bạn, cho phép các phiên bản duy nhất cho snapshotRepository qua (xem Maven POM reference về vấn đề này):

<snapshotRepository> 
    <uniqueVersion>true</uniqueVersion> 
    <id>your-snapshot-repo-id</id> 
    <name>Your Snapshots</name> 
    <url>http://your-snapshot-repo-url/maven</url> 
</snapshotRepository> 

FYI, lưu ý rằng Maven conventions đề xuất phiên bản được khai báo là major.minor.revision. Vì vậy, 1.0.25 thay vì 1.0.0.25. Nếu bạn có thể sử dụng lược đồ phiên bản này, mọi thứ sẽ hoạt động trơn tru hơn trong thế giới Maven.

4

Câu trả lời của Shek có lẽ là 'cách quạ', vì vậy tôi sẽ chấp nhận câu trả lời đó là câu trả lời đúng. Tuy nhiên, chúng tôi chưa sẵn sàng thay đổi các quy ước của mình, vì vậy, đây là giải pháp mà chúng tôi đang sử dụng.

Bằng cách sử dụng mức độ gián tiếp, bạn có thể chuyển số phiên bản vào pom tại thời điểm xây dựng và cài đặt và triển khai plugin sử dụng chúng. Ví dụ:

<project xmlns="..." xmlns:xsi="..." xsi:schemaLocation="..."> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.stackoverflow</groupId> 
    <artifactId>stackoverflow</artifactId> 
    <version>${ciVersion}</version> 
    <packaging>jar</packaging> 
    <name>StackOverflow</name> 

    <properties> 
    <ciVersion>0.0.0.0</ciVersion> 
    </properties> 

    ... 

</project> 

Chúng tôi không thể ghi đè trực tiếp $ {project.version}. Vì vậy, thay vào đó, chúng tôi thêm thuộc tính thứ hai được gọi là 'ciVersion' và đặt giá trị mặc định là '0.0.0.0' trong phần thuộc tính. Bây giờ máy chủ CI có thể chỉ định một số phiên bản bằng cách ghi đè thuộc tính ciVersion trên dòng lệnh. Như trong:

mvn -DciVersion=1.0.0.25 install 

Các cài đặt và triển khai các plugin sẽ sử dụng giá trị của tài sản ciVersion đã được thông qua vào bất cứ khi nào $ {} project.version được tham chiếu, như mong đợi, và giá trị mặc định sẽ được sử dụng khi không có phiên bản được cung cấp trên dòng lệnh.Điều này cho phép chúng tôi chuyển sang maven với tác động tối thiểu đến quy trình của chúng tôi. Ngoài ra, cách giải quyết này không phô trương, cho phép dễ dàng chuyển sang chức năng SNAPSHOT khi muốn.

5

Matthew's answer cung cấp giải pháp trong đó lưu trữ được tải lên kho lưu trữ cục bộ và từ xa có số phiên bản mong muốn, tức là đường dẫn bên trong kho chứa số phiên bản chính xác, tuy nhiên, Maven cài đặt và triển khai luôn tệp POM nguồn vẫn sẽ chứa ${ciVersion} trong phần tử phiên bản.

Nếu bạn có một đa mô-đun với cha mẹ thường gặp như thế này:

<project xmlns="..." xmlns:xsi="..." xsi:schemaLocation="..."> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <artifactId>myParent</artifactId> 
    <groupId>com.stackoverflow</groupId> 
    <version>${ciVersion}</version> 
    </parent> 
    <artifactId>myChild</artifactId> 
    ... 
</project> 

bạn sẽ không có thể tham khảo một phiên bản chuyên dụng của các module myChild, như độ phân giải phụ thuộc sẽ tồn tại với một lỗi rằng nó không thể tìm thấy mô-đun myParent với phiên bản ${ciVersion}.

Tuy nhiên, bạn có thể sử dụng resolve-pom-maven-plugin để tải POM vào kho lưu trữ cục bộ và từ xa nơi tất cả các biến bên trong POM được thay thế bằng giá trị thực của chúng. Để thực hiện việc này, bạn phải thêm đoạn mã sau vào (cha mẹ) của bạn POM:

... 
<build> 
    <plugins> 
    <plugin> 
     <groupId>com.sap.prd.mobile.ios.maven.plugins</groupId> 
     <artifactId>resolve-pom-maven-plugin</artifactId> 
     <version>1.0</version> 
     <executions> 
     <execution> 
      <id>resolve-pom-props</id> 
      <goals> 
      <goal>resolve-pom-props</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 
... 
Các vấn đề liên quan