Cấu trúc kho lưu trữ Mercurial với comms công ty nặng, yêu cầu kiểm tra cấu hình và kiểm tra


16

Tôi vẫn là một người dùng Subversion khác đang đấu tranh để giáo dục lại bản thân mình trong Tao về kiểm soát phiên bản phân tán.

Khi sử dụng Subversion, tôi là một fan hâm mộ lớn của dự án - phương pháp tiếp cận nhỏ và, với hầu hết các chủ nhân trước đây của tôi, chúng tôi sẽ cấu trúc các chi nhánh kho lưu trữ của chúng tôi; thẻ & thân cây như sau:

branches-+
         +-personal-+
         |          +-alice-+
         |          |       +-shinyNewFeature
         |          |       +-AUTOMATED-+
         |          |                   +-shinyNewFeature
         |          +-bob-+
         |                +-AUTOMATED-+
         |                            +-bespokeCustomerProject
         +-project-+
                   +-shinyNewFeature
                   +-fixStinkyBug
tags-+
     +-m20110401_releaseCandidate_0_1
     +-m20110505_release_0_1
     +-m20110602_milestone
trunk

Trong chính cây nguồn thực tế, chúng ta sẽ sử dụng (một cái gì đó giống như) cấu trúc sau:

  (src)-+
        +-developmentAutomation-+
        |                       +-testAutomation
        |                       +-deploymentAutomation
        |                       +-docGeneration
        |                       +-staticAnalysis
        |                       +-systemTest
        |                       +-performanceMeasurement
        |                       +-configurationManagement
        |                       +-utilities
        +-libraries-+
        |           +-log-+
        |           |     +-build
        |           |     +-doc
        |           |     +-test
        |           +-statistics-+
        |           |            +-build
        |           |            +-doc
        |           |            +-test
        |           +-charting-+
        |           |          +-build
        |           |          +-doc
        |           |          +-test
        |           +-distributedComputing-+
        |           |                      +-build
        |           |                      +-doc
        |           |                      +-test
        |           +-widgets-+
        |                     +-build
        |                     +-doc
        |                     +-test
        +-productLines-+
        |              +-flagshipProduct-+
        |              |                 +-coolFeature
        |              |                 +-anotherCoolFeature
        |              |                 +-build
        |              |                 +-doc
        |              |                 +-test
        |              +-coolNewProduct
        +-project-+
                  +-bigImportantCustomer-+
                  |                      +-bespokeProjectOne
                  |                      +-bespokeProjectTwo
                  +-anotherImportantCustomer-+
                                             +-anotherBespokeProject

Ý tưởng là (và vẫn là) sử dụng cấu trúc của kho lưu trữ để giúp cấu trúc giao tiếp giữa nhóm kỹ sư; bộ phận khách hàng của doanh nghiệp và các bên liên quan khác & các chuyên gia tên miền.

Để dí dỏm: Các tài liệu nguồn nằm trong một trong các thư mục "dự án" chỉ được sử dụng (và kiếm tiền) một lần. Các tài liệu nằm trong một trong các thư mục "sản phẩm" kiếm được tiền nhiều lần khi một sản phẩm từ dòng cụ thể đó được bán. Các tài liệu nằm trong một trong các thư mục "thư viện" kiếm được tiền gấp nhiều lần bất kỳ sản phẩm nào sử dụng chúng được bán.

Nó làm cho khái niệm khấu hao chi phí rõ ràng và giúp xây dựng hỗ trợ cho việc tái sử dụng tài liệu nguồn trên toàn doanh nghiệp.

Điều đó cũng có nghĩa là có một cấu trúc chung mà các công cụ tự động hóa xây dựng của chúng tôi có thể vận hành. (Các tập lệnh xây dựng của chúng tôi đi trên cây nguồn tìm kiếm các thư mục "xây dựng" trong đó chúng tìm thấy các tệp cấu hình chỉ định cách xây dựng từng thành phần; một quá trình tương tự xảy ra để tạo và kiểm tra tài liệu).

Đáng kể, các sản phẩm mà tôi làm việc thường mất nhiều thời gian để chạy các bài kiểm tra đo lường và đặc tính hiệu suất; từ 20 đến 200 giờ; tạo ra một nơi nào đó giữa vài GB đến vài TB kết quả kiểm tra / dữ liệu trung gian đã xử lý (phải được lưu trữ và gắn với một cấu hình hệ thống cụ thể để có thể đo lường cải thiện hiệu suất theo thời gian). Vấn đề này làm cho việc quản lý cấu hình trở thành một sự cân nhắc quan trọng và cũng đặt ra một số yêu cầu cho việc tập trung hóa, vì thông thường các tài nguyên tính toán cần thiết để chạy các phép đo đặc tính và kiểm tra hiệu năng bị hạn chế; (một cụm nhỏ gồm 64-128 lõi).

Như một lưu ý cuối cùng; hệ thống tích hợp liên tục biết rằng nó cần kích hoạt một bản dựng; phân tích tĩnh; kiểm tra khói & kiểm tra đơn vị chạy mỗi lần thân cây được sửa đổi, mỗi lần bất kỳ nhánh "thẻ" nào được sửa đổi và mỗi lần bất kỳ nhánh nhánh "TỰ ĐỘNG" nào được sửa đổi. Bằng cách này, các nhà phát triển cá nhân có thể sử dụng hệ thống CI với các chi nhánh cá nhân của họ, một khả năng quan trọng, IMHO.

Bây giờ, đây là câu hỏi của tôi: Làm thế nào tôi có thể sao chép tất cả những điều trên (và cải thiện nó, nếu có thể), với Mercurial.

--biên tập:

Dòng suy nghĩ hiện tại của tôi là sử dụng Kho lưu trữ Subversion trung tâm, để xác định cấu trúc tổng thể, nhưng cho phép sử dụng hg như một máy khách để các nhà phát triển có thể có kho lưu trữ có sẵn tại địa phương.


1
Ồ Một câu trả lời tốt cho điều này sẽ là một bài luận rất dài tôi nghĩ.
Ed James

Tôi nghĩ câu hỏi quan trọng là việc hợp nhất mã sẽ diễn ra như thế nào và ở đâu vì điều đó có thể sẽ xác định đường dẫn của sự kháng cự ít nhất. Vì vậy, làm thế nào để mã được hợp nhất?
Wyatt Barnett

Thông thường, hợp nhất có thể đến từ một nhánh cá nhân vào một dự án hoặc nhánh tính năng, và sau đó vào thân cây. Tôi chưa bao giờ gặp quá nhiều khó khăn khi hợp nhất (chúng tôi đã sử dụng TortoiseSVN trên Win32), mặc dù chúng tôi không bao giờ chạy quá lâu (nhiều nhất là một lần lặp) mà không tích hợp lại vào thân cây. Chúng tôi có xu hướng thực hiện hầu hết các công việc của mình trong thân cây, mặc dù mục tiêu là đơn giản hóa việc quản lý con người hơn là quy trình phát triển. (Một nhà phát triển, nhiều nhà phát triển làm việc độc lập, do đó, mọi thứ trong thân cây giúp cho nhà phát triển dễ dàng hơn để theo dõi những gì đang xảy ra.)
William Payne

Một điểm quan trọng là sự phụ thuộc nặng nề vào thử nghiệm được điều khiển bởi hệ thống CI, đặc biệt ở cấp độ thử nghiệm hệ thống. Điều này là để giúp xây dựng niềm tin rằng các nhà phát triển khác nhau không can thiệp lẫn nhau và để thúc đẩy tâm lý nhiều bước nhỏ. (Ngoài ra, việc nâng hạng nặng tính toán cần thiết để chạy thử nghiệm hệ thống có nghĩa là có ít sự tranh chấp về tài nguyên tính toán nếu mọi người làm việc chủ yếu trên thân cây).
William Payne

Câu trả lời:


10

Câu trả lời của Spoike là tuyệt vời, nhưng có một vài điều tôi nghĩ rằng nó sẽ đáng để thêm vào đó là quá lớn cho các bình luận.

Tổ chức chi nhánh

Với Mercurial, bạn có thể vui vẻ bỏ qua toàn bộ sơ đồ tổ chức đầu tiên của mình. Như Spoke nói, mỗi kho lưu trữ có bộ thẻ, chi nhánh (được đặt tên và ẩn danh) và có thể được sắp xếp theo nhu cầu kinh doanh.

Nếu bespokeProjectTwocần một phiên bản đặc biệt của chartingthư viện, thì bạn sẽ phân nhánh charting, thêm các tiện ích mới và sử dụng nó trong bespokeProjectTwo. Các cơ sở mới (và các lỗi của chúng) sẽ không được sử dụng bởi các dự án khác có tham chiếu chartingthư viện chuẩn . Nếu chartingthư viện chính có lỗi được sửa, bạn có thể hợp nhất những thay đổi đó vào nhánh. Nếu các dự án khác cũng cần các cơ sở này, bạn có thể sử dụng các dự án đó để sử dụng chi nhánh đặc biệt hoặc hợp nhất chi nhánh vào dòng chính và đóng chi nhánh.

Ngoài ra, không có gì ngăn cản bạn có chính sách cấu trúc tên chi nhánh để cung cấp các cơ sở cụ thể như các chi nhánh TỰ ĐỘNG của bạn.

Tổ chức thư mục

Không có lý do tại sao bạn không thể giữ thư mục nguồn chính xác như với Mercurial. Sự khác biệt duy nhất là trong khi với Subversion, bạn có một (src)kho lưu trữ nguyên khối duy nhất , với Mercurial, bạn tốt hơn hết là chia thành các kho lưu trữ được nhóm hợp lý. Từ cấu trúc cây nguồn của bạn, tôi có thể trích xuất từng mục sau đây dưới dạng các kho riêng lẻ:

src-+
      +-(developmentAutomation)
      +-libraries-+
      |           +-(log)
      |           +-(statistics)
      |           +-(charting)
      |           +-(distributedComputing)
      |           +-(widgets)
      +-productLines-+
      |              +-(flagshipProduct)
      |              +-(coolNewProduct)
      +-project-+
                +-bigImportantCustomer-+
                |                      +-(bespokeProjectOne)
                |                      +-(bespokeProjectTwo)
                +-anotherImportantCustomer-+
                                           +-(anotherBespokeProject)

Điều này cho phép bất kỳ sản phẩm hoặc dự án bespoke nào sử dụng bất kỳ sự kết hợp nào của các thư viện, tại bất kỳ sửa đổi nào. Có một cái nhìn vào các kho lưu trữ phụ để dễ dàng quản lý thư viện nào được sử dụng cho bất kỳ phiên bản nhất định nào của sản phẩm hoặc dự án.

Quy trình làm việc

Một giải pháp thay thế cho quy trình làm việc được đề xuất của Spoike (nhà phát triển lấy từ repo may mắn, làm việc cục bộ, đưa ra yêu cầu kéo và cuối cùng là nhà tích hợp kéo những thay đổi đó và hợp nhất chúng) sẽ sử dụng hệ thống tích hợp liên tục làm trung gian.

Như trước đây, nhà phát triển lấy từ repo may mắn và làm việc tại địa phương, nhưng khi hoàn thành, họ lại kéo từ repo may mắn một lần nữa và hợp nhất bản thân trước khi đẩy sang một repo không may mắn. Mọi thay đổi đối với repo không được ban hành sau đó sẽ được xem xét (bằng tay hoặc tự động) và được chuyển sang repo may mắn chỉ khi chúng được chấp thuận.

Điều này có nghĩa là nhà tích hợp chỉ chấp nhận hoặc từ chối thay đổi, không thực hiện hợp nhất. Theo kinh nghiệm của tôi, hầu như luôn luôn tốt hơn cho nhà phát triển đã viết mã để thực hiện hợp nhất so với người khác thực hiện.

Theo đề xuất trong cuốn sách đồng bóng, móc có thể được sử dụng để tự động hóa thủ tục này:

Khi ai đó đẩy một bộ thay đổi đến máy chủ mà mọi người lấy từ đó, máy chủ sẽ kiểm tra bộ thay đổi trước khi chấp nhận nó là vĩnh viễn và từ chối nếu không vượt qua bộ kiểm tra. Nếu mọi người chỉ kéo các thay đổi từ máy chủ lọc này, nó sẽ phục vụ để đảm bảo rằng tất cả các thay đổi mà mọi người kéo đã được tự động hiệu lực.

Các vấn đề khác

Vấn đề của các bộ dữ liệu thử nghiệm lớn cũng có thể được giải quyết bằng cách đưa dữ liệu thử nghiệm đó vào một kho lưu trữ phụ . Điều này sẽ ngăn kho lưu trữ mã bị đầy với dữ liệu thử nghiệm, trong khi vẫn giữ dữ liệu thử nghiệm dưới sự kiểm soát sửa đổi.


Một lần nữa, một câu trả lời xuất sắc và nhiều thông tin. Cảm ơn bạn.
William Payne

RE: Tổ chức chi nhánh. Tôi đồng ý rằng sơ đồ tổ chức đầu tiên có thể vui vẻ bị bỏ qua. Dù sao, nó cũng không truyền đạt được quy trình công việc đặc biệt tốt, và do đó không cung cấp bất kỳ tiện ích thực sự nào ngoài việc củng cố quy ước. Tuy nhiên, tôi muốn thay thế nó bằng một cái gì đó truyền đạt mạnh mẽ một quy trình công việc (đơn giản nhất có thể) và khuyến khích các cam kết thường xuyên. Có lẽ gọi nhánh "thân / phát triển" chính là "hàng ngày" sẽ làm điều đó?
William Payne

RE: Tổ chức thư mục. Tôi đã sử dụng tổ chức thư mục nguồn như một phương tiện truyền thông cao siêu; áp đặt một cấu trúc ngầm đối với việc tổ chức mã (và thông qua đó đối với toàn bộ doanh nghiệp). Tôi bắt đầu hiểu rằng Mercurial có xu hướng được sử dụng một cách rất linh hoạt; nhưng tôi thực sự muốn hạn chế một số tính linh hoạt đó để áp đặt một cấu trúc theo cách mọi người nghĩ về doanh nghiệp bằng cách áp đặt một cấu trúc theo cách các tài liệu của họ được tổ chức trên máy trạm và khu vực lưu trữ mạng của chúng tôi. (Nhiều thông tin liên lạc của công ty hơn công nghệ.)
William Payne

RE: Quy trình làm việc. Tôi nghĩ rằng quy trình làm việc đơn giản nhất sẽ là lấy từ kho lưu trữ "hàng ngày", làm việc trên nó cục bộ, sau đó (thường xuyên) đẩy trở lại kho "hàng ngày", khởi động phân tích tĩnh, kiểm tra khói và kiểm tra hồi quy qua hệ thống CI. Tôi rất vui khi repo chính bị "hỏng", miễn là tôi biết về nó, và miễn là nó được sửa chữa một cách nhanh chóng. Trên thực tế, tôi đang xem xét thực hiện cam kết "repo" hàng ngày theo cách duy nhất mà người ta có thể biên dịch và xây dựng, để khuyến khích các cam kết thường xuyên và bảo hiểm kiểm tra tốt. (Quan trọng hơn nhiều so với khả năng làm việc trong sự cô lập, IMHO).
William Payne

@WilliamPayne - Cảm ơn. Mặc dù Mercurial rất linh hoạt, với các kho, nhánh và móc phù hợp mà bạn có thể xây dựng theo bất kỳ hạn chế nào bạn muốn, ở cấp độ tổ chức hoặc kho lưu trữ. Cá nhân, tôi sẽ bắt đầu đơn giản với các điều khiển tổ chức, và một vài móc CI, và mở rộng các điều khiển đó trong tương lai khi nhu cầu của họ trở nên rõ ràng. Ngoài ra, ví dụ, việc sử dụng hợp lý các repos phụ có thể khuyến khích mọi người kiểm tra mọi thứ cục bộ trong cùng cấu trúc như trên máy chủ, ví dụ như có productLineshoặc bigImportantCustomerlà siêu repos.
Đánh dấu gian hàng

9

Được rồi, cố gắng trả lời điều này một cách đơn giản.

Những gì bạn cần biết

Điều đầu tiên bạn cần biết: Mercurial là phiên bản kiểm soát phân phối và có một số thuộc tính bạn nên biết về liệt kê dưới đây.

  • Nguồn đến từ một kho lưu trữ, nơi kho lưu trữ đó có thể được nhân bản. Tất cả các kho lưu trữ nhân bản có thể chia sẻ mã với nhau thông qua đồng bộ hóa (với các lệnh kéo và đẩy, có thể bị hạn chế truy cập).
  • Mỗi người dùng có một bản sao của mã, có một bản sao của kho lưu trữ. Nếu họ muốn phân nhánh, họ có thể làm điều đó trong bản sao địa phương của họ. Điều đó có nghĩa là bạn không cần phải tổ chức cách mọi người dùng nên phân nhánh. Họ có thể làm điều này cho chính họ.
  • Các thẻ được tạo trong đồng bóng bởi một cam kết (giống như các thẻ cứng trong git). Điều này có nghĩa là bạn không cần một thư mục bên trong cấu trúc kho lưu trữ của mình cho các thẻ.
  • Mô hình thông thường mà mọi người làm việc với DVCS (được sử dụng trong github và bitbucket) là thực hiện bán tập trung.

    Mỗi người dùng có một kho lưu trữ công cộng (trong một số chia sẻ hoặc trên một máy chủ an toàn) và một kho lưu trữ riêng (trong các máy trạm riêng của họ). Cả hai đều là bản sao của kho lưu trữ "may mắn" của nhà tích hợp. Bất cứ khi nào họ cảm thấy họ sẵn sàng xuất bản mã của mình, họ có thể đẩy các thay đổi từ kho lưu trữ công khai của họ. Sau đó, một nhà tích hợp có thể chọn người dùng nào để kéo mã vào kho lưu trữ "may mắn".

    Nếu nhà tích hợp không thể hợp nhất một số mã người dùng một cách dễ dàng, thì các thay đổi sẽ bị từ chối và tùy thuộc vào người dùng cụ thể đó để cập nhật kho lưu trữ của họ và tự sửa lỗi hợp nhất. Nó thường không khó nếu bạn hợp nhất thường xuyên (vì đó là ít mã cần được hợp nhất) và thông thường người dùng nên biết điều gì đã xảy ra với việc hợp nhất.

Thiết lập kho lưu trữ cho mỗi dự án

Vì vậy, thiết lập thông thường là cho mỗi dự án có những điều sau đây:

  • Một kho lưu trữ chỉ đọc công khai mà nhà tích hợp chịu trách nhiệm. Đó là "may mắn".

    Tức là tất cả người dùng có thể kéo / tìm nạp nội dung nhưng không có quyền truy cập để đẩy nội dung đó.

  • Mỗi người dùng có thể có bản sao công khai của kho lưu trữ.

    Dễ dàng nhất được thiết lập như đặt trong một ổ đĩa chia sẻ (mặc dù bạn có thể xem xét việc lưu trữ như bitbucket). Nhà tích hợp nhận các yêu cầu kéo từ người dùng và cố gắng kéo mã mới từ các kho lưu trữ này. Khi việc hợp nhất được thực hiện mà không gặp trở ngại, nó sẽ được đưa vào kho chỉ đọc. Nếu không, sau đó người dùng được yêu cầu khắc phục các xung đột hợp nhất phát sinh bằng cách cập nhật và hợp nhất nó cho chính họ cục bộ.

  • Mỗi người dùng có thể có bản sao riêng của kho lưu trữ.

    Thực hành tốt là lấy từ bản sao công khai của họ, nhưng không thành vấn đề nếu họ lấy từ công chúng hoặc nhà tích hợp. Tất cả các cam kết đều có thể nhận dạng duy nhất, do đó, các cam kết hợp nhất mà bạn quên tìm nạp ở nơi công cộng tương đối dễ sửa (bằng cách đẩy các thay đổi từ riêng tư sang công khai, nó cũng tự động nhận các thay đổi của nhà tích hợp).

Tổ chức mã nguồn

Như trong cách sắp xếp nguồn dự án là điều bạn cần suy nghĩ kỹ. Nếu một vật phẩm cần phải được kiểm soát nguồn thì hãy đặt nó trong kiểm soát nguồn. Cá nhân tôi không thích ý tưởng kiểm tra các tạo phẩm được tạo bởi quá trình xây dựng hoặc thời gian chạy (do có nguy cơ cao xung đột hợp nhất trên các loại tạo phẩm này) như tệp nhị phân hoặc tệp nhật ký.

Bạn cũng có thể kiểm tra cấu hình, miễn là chúng giúp nhà phát triển dễ dàng thực hiện và không làm rối cấu hình cho các bản phát hành hoặc môi trường sống / sản xuất (chẳng hạn như cài đặt ứng dụng / máy chủ web). Điều này dẫn đến khái niệm rằng nếu cấu hình bạn đã cản trở nghiêm trọng các nhà phát triển bắt đầu trong vòng năm phút sau khi họ kiểm tra mã thì nó cần phải được cấu trúc lại. Một yêu cầu khác là các nhà phát triển sẽ rất khó khăn trong việc làm xáo trộn môi trường phát hành hoặc sống / sản xuất.

Bạn đề cập rằng bạn có dữ liệu thử nghiệm cần được gắn với một số phiên bản của mã. Bây giờ điều này phức tạp hơn một chút vì các hệ thống DVCS như Mercurial và Git có xu hướng bị chậm khi bạn kiểm tra dữ liệu rất LỚN. Theo kinh nghiệm của tôi, nó thực sự không thể chịu đựng được sau 5 GB tệp nhị phân (số dặm của bạn có thể thay đổi, vì vậy bạn nên kiểm tra xem nó hoạt động như thế nào cho bạn). Tuy nhiên, tôi khuyên bạn nên đưa dữ liệu được tạo vào kho lưu trữ của riêng nó và yêu cầu hệ thống kiểm tra của bạn gắn thẻ chúng một cách thích hợp khi kiểm tra chúng (và / hoặc tạo tệp văn bản cho cùng mục đích dữ liệu meta).

Tôi hy vọng tất cả điều này có ý nghĩa. Vui lòng bình luận bên dưới nếu tôi bỏ lỡ một số chi tiết hoặc nếu có gì đó cần giải thích thêm và tôi sẽ cố gắng chỉnh sửa.


+1 cho một phản hồi rất hay với một số điểm rất hữu ích. Đáp lại phần đầu tiên trong câu trả lời của bạn, tôi đã không nắm bắt được tầm quan trọng của mỗi người dùng có kho lưu trữ công khai của riêng họ. Có lẽ tôi cần suy nghĩ nhiều hơn về cách tổ chức các quy trình công việc ngang hàng.
William Payne

Đáp lại phần thứ hai trong câu trả lời của bạn, toàn bộ ý kiến ​​của tôi về việc có một kho lưu trữ duy nhất cho toàn bộ tổ chức là tạo ra một hình ảnh tinh thần được chia sẻ về cách cấu trúc công việc và để dễ dàng tìm thấy các thành phần có thể được sử dụng lại. (Rất nhiều Nhà thờ chứ không phải Bazaar, nhưng đó là môi trường mà tôi làm việc). Tôi thực sự muốn biết làm thế nào để đạt được ý thức tương tự về tổ chức có cấu trúc (hệ thống nộp đơn) với một DCVS.
William Payne

Đáp lại phần thứ ba trong câu trả lời của bạn: Tôi hoàn toàn đồng ý rằng hệ thống kiểm soát nguồn là dành cho các tài liệu nguồn và các đồ tạo tác có nguồn gốc không thuộc về nơi đó. Tôi cũng đồng ý rằng việc lưu trữ các nhị phân lớn của bất kỳ mô tả nào trong VCS là không thực tế. Tuy nhiên, tôi tin rằng bạn có thể lưu trữ các tệp nhị phân lớn trong một vị trí mạng đã được thống nhất, với một tên được xác định và tham chiếu chúng từ bên trong VCS. Ví dụ, (các) môi trường xây dựng có thể được lưu trữ dưới dạng hình ảnh đĩa VM được đặt tên và được tham chiếu từ các tập lệnh xây dựng khác nhau. (ví dụ: xây dựng tôi trên build_env_A). Điều tương tự giữ cho dữ liệu thử nghiệm.
William Payne

Trước đây, tôi đã sử dụng một hệ thống phân cấp các thư mục trên một ổ đĩa mạng, trong đó tên thư mục được lấy từ số sửa đổi lật đổ + hàm băm của vị trí chi nhánh để buộc các tệp trung gian & kết quả kiểm tra vào các phiên bản cụ thể. Điều này có nghĩa là chúng tôi có khả năng truy tìm nguồn gốc mà không cần lưu trữ các tệp có nguồn gốc trong kiểm soát phiên bản.
William Payne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.