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-plugin
và ship-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ể
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). –
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
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