2013-02-01 19 views
6

chúng tôi đang duy trì một cơ sở mã có kích thước trung bình được hợp nhất thành một dự án maven đa đa (đa) đơn. Nhìn chung, toàn bộ bản dựng có tối đa mười tạo phẩm đầu ra cho các thành phần hệ thống khác nhau (các ứng dụng web (.war), các tiện ích (.jar), v.v.). Quy trình triển khai của chúng tôi cho đến nay dựa trên các kịch bản lệnh bash đơn giản xây dựng các tạo tác được yêu cầu thông qua maven, gắn thẻ kho lưu trữ scm với thông tin liên quan đến các tạo tác, môi trường đích và dấu thời gian xây dựng hiện tại và sau đó tải các tạo phẩm vào môi trường đã chọn các máy chủ ứng dụng và ra lệnh để khởi động lại các trình tiện ích đang chạy. Cấu hình của các tạo tác được xây dựng xảy ra bằng các phương tiện của tiểu sử maven và lọc tài nguyên. Vì vậy, các bản dựng của chúng tôi dành riêng cho môi trường mục tiêu.Cách thực tiễn để cấu hình, phiên bản và triển khai các ứng dụng java dựa trên Maven là gì?

Quy trình này đã phục vụ tốt cho chúng tôi nhưng vì nhiều lý do khác nhau, tôi muốn tiến tới một cách tiếp cận tinh vi hơn. Đặc biệt tôi muốn loại bỏ các tập lệnh bash.

Vậy các phương pháp hay nhất về cấu hình, phiên bản và triển khai các ứng dụng Java dựa trên Maven là gì?

Các bản dựng của chúng tôi có phải là không thuyết phục về môi trường và cấu hình được thực hiện thông qua các tệp cấu hình trên hệ thống đích không? Nếu vậy, một nhà phát triển sẽ quan tâm đến việc các tùy chọn cấu hình mới được bao gồm trong các tệp cấu hình được triển khai trên các máy chủ ứng dụng khác nhau như thế nào?

Chúng tôi có nên sử dụng plugin phát hành Maven-versioning a.k.a. Maven để gắn thẻ các bản dựng khác nhau không?

Bạn nên định cấu hình máy chủ CI như Jenkins hoặc Teamcity để xây dựng và triển khai tùy chọn các tạo tác của chúng tôi cho chúng tôi?

+0

Tôi nghĩ câu hỏi này sẽ phù hợp hơn với http://programmers.stackexchange.com/ (mặc dù nó có thể quá mở ngay cả khi trang web). –

+0

Tôi sẽ đề nghị đi với Maven phát hành plugin đầu tiên này sẽ đơn giản hóa mọi thứ và tất nhiên đi với giải pháp CI (như Jenkins) để tự động hóa công cụ này. – khmarbaise

+0

Hãy xem https://github.com/sofdes/config-generation-maven-plugin mà bạn có thể sử dụng để tạo cấu hình cho tất cả các môi trường theo cách bảo thủ, sau đó chọn cherry-select đúng thư mục cấu hình cho môi trường của bạn. Đối với cấu hình, hãy đọc bất kỳ tệp văn bản nào - thuộc tính, đường dẫn đến thuộc tính, tập lệnh, tập lệnh được tạo liên quan đến tập lệnh được tạo. Về cơ bản, bạn có thể khởi động toàn bộ môi trường bằng cách sử dụng các tệp nhất quán ngay cả khi các môi trường đó có cấu trúc thư mục cực kỳ khác nhau (hoặc thậm chí là các hệ điều hành). – user1016765

Trả lời

7

Tôi thích nghĩ về đó là hai không gian vấn đề:

  • xây dựng hiện vật (lý tưởng môi trường agnostic như có nghĩa là bảo đảm chất lượng có thể mất một hash của artifact, chạy thử nghiệm của họ trên vật đó và khi nói Nếu xây dựng của bạn tạo ra các hiện vật khác nhau tùy thuộc vào việc cho enA của QA hoặc env dàn, hoặc env sản xuất, sau đó bạn phải làm nhiều việc hơn để đảm bảo tạo tác đi vào sản xuất đã được thử nghiệm bởi QA và được tổ chức trong dàn dựng)

  • các hiện vật vận chuyển vào một n môi trường.Khi môi trường đó yêu cầu cấu hình của các tạo phẩm, quá trình vận chuyển phải bao gồm cấu hình đó, bằng cách đặt các tệp cấu hình thích hợp vào môi trường đích và cho phép các tạo tác chọn lên hoặc bằng cách mở các tạo phẩm, cấu hình chúng và niêm phong chúng lại lên (nhưng trong một thời trang lặp lại và xác định)

Maven được thiết kế cho không gian vấn đề đầu tiên. "Cách Maven" là tất cả về việc tạo ra các tạo phẩm xây dựng giả thuyết về môi trường và xuất bản chúng thành một kho lưu trữ nhị phân. Nếu bạn nhìn vào vòng đời của Maven, bạn sẽ thấy rằng các pha dừng lại sau khi tạo tác là deploy được chỉnh sửa đến kho lưu trữ Maven (một kho lưu trữ nhị phân). Trong ngắn hạn, Maven thấy công việc của mình như được thực hiện tại thời điểm đó. Ngoài ra, có các giai đoạn vòng đời cho đơn vị test ing và integration-test cả hai đều có thể có hiện vật bất khả tri về môi trường, nhưng đó không phải là bộ thử nghiệm đầy đủ mà bạn yêu cầu ... Thay vì hoàn thành thử nghiệm, bạn sẽ cần thực sự triển khai các tạo phẩm được xây dựng thành một môi trường thực tế.

Nhiều người cố gắng chiếm quyền điều khiển Maven để vượt ra ngoài mục tiêu của mình (bao gồm cả bản thân tôi). Ví dụ: bạn có cargo-maven-pluginship-maven-plugin liên lạc trên các khía cạnh ngoài trò chơi kết thúc maven (tức là sau khi tạo phẩm đến kho lưu trữ maven). Trong số này, tôi cảm thấy cá nhân, rằng ship-maven-plugin (mà tôi đã viết, hency trước đây "của tôi bao gồm") là gần nhất để sử dụng "sau khi maven" bởi vì theo mặc định nó được thiết kế để hoạt động, không phải trên -SNAPSHOT phiên bản của dự án mà bạn đã kiểm tra trên đĩa, mà là trên một phiên bản phát hành của dự án tương tự mà nó kéo từ kho lưu trữ từ xa, ví dụ như

mvn ship:ship -DshipVersion=2.5.1 

IMO, hàng hóa là nhằm mục đích sử dụng xung quanh integration-test giai đoạn trong vòng đời, nhưng một lần nữa , bạn có thể cướp nó vì các mục đích khác.

Nếu bạn đang sản xuất phần mềm thu gọn, tức là loại người dùng mua và cài đặt trên hệ thống của họ, chính chương trình cài đặt được thiết kế để định cấu hình ứng dụng cho môi trường người dùng cuối. Nó là tốt để có xây dựng Maven sản xuất trình cài đặt bởi vì trình cài đặt thực tế là (ít nhất là phần nào) môi trường bất khả tri. Ok nó có thể là một trình cài đặt chỉ dành cho Microsoft Windows, hoặc một trình cài đặt chỉ có Linux, nhưng nó không quan tâm đến việc người dùng máy nó được cài đặt trên đó.

Hiện tại, chúng tôi có xu hướng tập trung nhiều hơn vào Phần mềm dưới dạng Dịch vụ, vì vậy chúng tôi đang triển khai phần mềm lên các máy chủ mà chúng tôi kiểm soát. Nó trở nên hấp dẫn hơn đối với "mặt tối Maven", nơi các cấu hình xây dựng được sử dụng để tinh chỉnh cấu hình bên trong của các tạo phẩm xây dựng (sau khi tất cả chúng ta chỉ có ba môi trường mà chúng ta triển khai) và chúng ta đang di chuyển nhanh nên không muốn dành thời gian để làm cho các ứng dụng nhận cấu hình môi trường cụ thể từ bên ngoài để tạo tác được xây dựng (âm thanh quen thuộc?). Lý do tôi gọi đây là mặt tối là bạn thực sự đang chiến đấu theo cách con quạ muốn làm việc ... Bạn luôn tự hỏi nếu cái bình trong kho lưu trữ cục bộ được xây dựng với một cấu hình khác hoạt động, vì vậy bạn phải làm đầy đủ sạch sẽ xây dựng mọi lúc. Khi có thời gian để chuyển từ QA sang dàn dựng hoặc từ dàn dựng sang sản xuất, bạn cần phải làm một bản dựng đầy đủ của phần mềm ... Và tất cả các bài kiểm tra đơn vị và tích hợp sẽ được chạy lại (hoặc bạn sẽ bỏ qua chúng và lần lượt bỏ qua sự tỉnh táo mà họ có thể cung cấp trên các hiện vật mà họ đang xây dựng) vì vậy có hiệu lực bạn đang làm cho cuộc sống khó khăn hơn và phức tạp hơn ... Chỉ vì mục đích đặt một vài tiểu sử vào maven pom.xml ... Chỉ cần nghĩ, nếu bạn đã làm theo cách maven bạn chỉ cần lấy artifact từ kho và di chuyển dọc theo các môi trường khác nhau, chưa sửa đổi, unmolested, và với MD5, SHA1 (và hy vọng GPG) chữ ký để chứng minh rằng nó là cùng một tạo tác.

Vì vậy, bạn hỏi, làm thế nào để chúng tôi mã vận chuyển đến sản xuất ...

Cũng có một số cách để giải quyết vấn đề này. Tất cả trong số họ chia sẻ một bộ tương tự như các nguyên tắc cốt lõi, cụ thể là

  • giữ công thức cho vận chuyển đến một môi trường trong một hệ thống kiểm soát nguồn

  • công thức lý tưởng nên có hai phần, một phần không thể thuyết bất khả tri môi trường, và phần môi trường cụ thể.

Bạn có thể sử dụng các kịch bản bash cũ tốt, hoặc bạn có thể sử dụng nhiều công cụ "hiện đại" như đầu bếp và con rối được thiết kế cho không gian Vấn đề thứ hai này.

Đề xuất

Bạn nên sử dụng đúng công cụ cho đúng công việc.

Nếu nó là tôi, đây là là những gì tôi sẽ làm gì:

  • phiên bản Cut với Maven phát hành Plugin

  • Các hiện vật được xây dựng nên luôn được môi trường thuyết bất khả tri.

  • Các tạo phẩm được tạo nên chứa "các giá trị mặc định hợp lý" cho tất cả các tùy chọn cấu hình. Nói cách khác, chúng cần phải thổi nhanh nếu tùy chọn cấu hình yêu cầu không có mặc định hợp lý bị thiếu hoặc chúng sẽ hoạt động theo cách hợp lý nếu tùy chọn tùy chọn không được chỉ định. Ví dụ về tùy chọn cấu hình yêu cầu có thể là chi tiết kết nối cơ sở dữ liệu (trừ khi ứng dụng vui vẻ chạy với bộ nhớ trong DB)

  • Chọn một bên trong đầu bếp và chiến tranh con rối (không quan trọng bên nào , và bạn có thể thay đổi các bên nếu bạn muốn. Nếu bạn có và ANT suy nghĩ, đầu bếp có thể phù hợp với bạn tốt hơn, nếu bạn thích ma thuật quản lý phụ thuộc, con rối có thể phù hợp với bạn hơn)

  • Nhà phát triển nên có tiếng nói trong việc xác định đầu bếp/tập lệnh con rối để triển khai, ít nhất là phần bất khả tri về môi trường của các tập lệnh đó.

  • Operations cần xác định các chi tiết môi trường sản xuất cụ thể của việc triển khai đầu bếp/con rối

  • Giữ tất cả những kịch bản trong SCM.

  • Sử dụng Jenkins hoặc bất kỳ CI nào để tự động hóa càng nhiều bước càng tốt. Plugin xây dựng được quảng cáo cho Jenkins là bạn của bạn.

  • Trò chơi kết thúc của bạn là mọi cam kết, với điều kiện nó vượt qua tất cả các bài kiểm tra bắt buộc, * có thể * được triển khai vào sản xuất tự động (hoặc có thể với cổng của người nói "đi trước") ... bạn thực sự làm điều này cho mọi cam kết, chỉ rằng bạn có thể

+0

Cảm ơn bạn đã nhắc tôi rằng chu trình maven kết thúc bằng việc triển khai đến kho lưu trữ tương ứng. Tôi gần như quên mất điều này vì chúng tôi chỉ sử dụng Nexus để giữ các thành phần chung (thư viện nội bộ) được sử dụng bởi các dự án khác nhau. Tôi chưa bao giờ thấy bất kỳ lý do gì để đưa các hiện vật cuối cùng (ứng dụng) vào đó. Nhưng nếu công cụ bổ sung (phép thuật) có thể được sử dụng để triển khai các hiện vật giả thuyết môi trường cho các môi trường ứng dụng (và cấu hình chúng) thì vòng đời của maven sẽ có ý nghĩa trở lại. – aeisele

+0

Tôi không thấy [đầu bếp] (http://www.opscode.com/chef/) hoặc [con rối] (https://puppetlabs.com/) là ma thuật. Ngoài ra, không có gì sai, khi sử dụng Maven để làm phép thuật ... chỉ là bạn sẽ muốn phép thuật đó sống trong một 'pom.xml' riêng biệt (và mô-đun tương ứng) cho mỗi môi trường mà bạn nhắm vào. –

0

Những gì tôi đã sử dụng trong quá khứ mà làm việc tốt là sử dụng Apache Karaf + iPOJO với kiểm soát phiên bản của tôi mà là lật đổ (Tôi sẽ sử dụng git ngày nay)

gì cho phép kiểm soát phiên bản được làm là triển khai một bản sao phiên bản của Apache Karaf và các tệp cấu hình của tôi. Bất kỳ thay đổi nào được thực hiện từ phát triển hoặc trên hệ thống sản xuất (khi cần sửa chữa khẩn cấp) vẫn có thể được truy tìm và có thể được kiểm tra (bao gồm thông tin về ai đã thay đổi điều gì)

Điều mà Apache Karaf hỗ trợ là triển khai động maven thư viện từ kho lưu trữ maven của bạn. tức là bạn có các tệp cấu hình chỉ định phiên bản của jar bạn muốn phát hành và nó sẽ tải chúng xuống theo yêu cầu từ repo maven của bạn và chạy chúng. IPOJO thêm các thành phần cho các mô hình này mà bạn có thể định cấu hình bằng các giá trị thuộc tính (được phiên bản lại)

Giả sử bạn có quyền kiểm soát phát triển đầu cuối, nhưng có thể hoạt động tốt ngay cả với nhiều trang web từ xa.

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