Khi bạn có cơ sở mã lớn, các chuỗi phần phụ thuộc có thể trở nên rất sâu. Ngay cả các tệp nhị phân đơn giản cũng có thể phụ thuộc vào hàng chục nghìn mục tiêu bản dựng. Tại với quy mô như vậy, đơn giản là chúng tôi không thể hoàn thành một bản dựng với một số lượng hợp lý thời gian trên một máy: không hệ thống xây dựng nào có thể xử lý các định luật vật lý áp dụng lên phần cứng của máy móc. Cách duy nhất để làm việc này là một hệ thống xây dựng hỗ trợ các bản dựng được phân phối trong đó các đơn vị mà hệ thống thực hiện được trải rộng theo cách tuỳ ý và có thể mở rộng số lượng máy. Giả sử chúng tôi chia nhỏ công việc của hệ thống thành từng phần nhỏ đơn vị (sẽ tìm hiểu thêm ở phần sau), điều này sẽ cho phép chúng ta hoàn tất mọi quá trình tạo bản dựng của bất kỳ quy mô của bạn nhanh chóng khi chúng tôi sẵn sàng trả chi phí. Khả năng mở rộng này là một mục tiêu cao cấp chúng tôi đã và đang hướng tới bằng cách định nghĩa một hệ thống xây dựng dựa trên cấu phần phần mềm.
Lưu vào bộ nhớ đệm từ xa
Loại bản dựng được phân phối đơn giản nhất là loại bản dựng chỉ tận dụng điều khiển từ xa lưu vào bộ nhớ đệm như minh hoạ trong Hình 1.
Hình 1 Một bản dựng được phân phối cho thấy chức năng lưu vào bộ nhớ đệm từ xa
Mọi hệ thống thực hiện các bản dựng, bao gồm cả máy trạm của nhà phát triển và hệ thống tích hợp liên tục, chia sẻ tham chiếu đến một bộ nhớ đệm từ xa chung . Dịch vụ này có thể là một hệ thống lưu trữ ngắn hạn nhanh và cục bộ, chẳng hạn như Redis hoặc một dịch vụ đám mây như Google Cloud Storage. Bất cứ khi nào người dùng cần tạo cấu phần phần mềm, dù trực tiếp hay dưới dạng phần phụ thuộc, trước tiên, hệ thống sẽ kiểm tra bằng bộ nhớ đệm từ xa để xem cấu phần phần mềm đó đã tồn tại ở đó hay chưa. Nếu có, có thể tải cấu phần phần mềm xuống thay vì tạo cấu phần phần mềm. Nếu không, hệ thống sẽ tạo cấu phần phần mềm tự động và tải kết quả trở lại bộ nhớ đệm. Điều này có nghĩa là Các phần phụ thuộc cấp thấp không thay đổi thường xuyên có thể được tạo một lần rồi chia sẻ thay vì phải tự tạo lại cho từng người dùng. Tại Google, rất nhiều cấu phần phần mềm được cung cấp từ một bộ nhớ đệm thay vì được tạo từ đầu giúp giảm chi phí vận hành hệ thống xây dựng.
Để hệ thống lưu vào bộ nhớ đệm từ xa hoạt động, hệ thống xây dựng phải đảm bảo rằng các bản dựng hoàn toàn có thể tái tạo. Tức là đối với bất kỳ mục tiêu bản dựng nào, bạn cũng phải để xác định tập hợp các đầu vào cho mục tiêu đó sao cho cùng một tập hợp đầu vào sẽ cho ra cùng một đầu ra trên mọi máy. Đây là cách duy nhất để đảm bảo rằng kết quả tải xuống cấu phần phần mềm giống với kết quả tự xây dựng bản thân. Xin lưu ý rằng để làm được điều này, từng cấu phần phần mềm trong bộ nhớ đệm được tập trung vào cả mục tiêu và giá trị băm của dữ liệu đầu vào, theo cách đó, kỹ sư có thể thực hiện nhiều sửa đổi khác nhau cho cùng một mục tiêu tại cùng một thời điểm và bộ nhớ đệm từ xa sẽ lưu trữ tất cả cấu phần phần mềm kết quả và phân phát chúng một cách phù hợp mà không xung đột.
Tất nhiên, để có được bất kỳ lợi ích nào từ bộ nhớ đệm từ xa, việc tải xuống cấu phần phần mềm cần phải nhanh hơn so với việc tạo cấu phần phần mềm. Điều này không phải lúc nào cũng đúng, đặc biệt nếu máy chủ bộ nhớ đệm ở xa máy đang tạo bản dựng. hệ thống mạng và hệ thống xây dựng được điều chỉnh cẩn thận để có thể nhanh chóng chia sẻ kết quả.
Thực thi từ xa
Tính năng lưu vào bộ nhớ đệm từ xa không phải là bản dựng được phân phối thực sự. Nếu bộ nhớ đệm bị mất hoặc nếu bạn thực hiện một thay đổi ở cấp độ thấp và yêu cầu xây dựng lại mọi thứ, bạn vẫn cần để thực hiện toàn bộ bản dựng cục bộ trên máy của bạn. Mục tiêu thực sự là hỗ trợ thực thi từ xa, trong đó công việc thực tế tạo bản dựng có thể được phân tán cho số lượng worker bất kỳ. Hình 2 mô tả một hệ thống thực thi từ xa.
Hình 2. Hệ thống thực thi từ xa
Công cụ xây dựng chạy trên máy của từng người dùng (trong đó người dùng là con người hoặc hệ thống xây dựng tự động) gửi yêu cầu đến một chuyên viên xây dựng trung tâm. Chủ bản dựng chia các yêu cầu thành các hành động thành phần và lịch biểu việc thực thi những hành động đó trên một nhóm worker có thể mở rộng. Mỗi worker thực hiện các hành động được yêu cầu bằng thông tin đầu vào do người dùng chỉ định và ghi các cấu phần phần mềm thu được. Các cấu phần phần mềm này được chia sẻ giữa các cấu phần phần mềm máy thực thi các hành động yêu cầu chúng cho đến khi kết quả cuối cùng tạo và gửi đến người dùng.
Phần phức tạp nhất khi triển khai một hệ thống như vậy là quản lý giao tiếp giữa worker, chính và máy cục bộ của người dùng. Worker có thể phụ thuộc vào cấu phần phần mềm trung gian do các worker khác tạo ra và kết quả đầu ra cần được gửi lại vào máy cục bộ của người dùng. Để làm được điều này, chúng tôi có thể phát triển dựa trên ở trên cùng của bộ nhớ đệm phân phối được mô tả trước đó bằng cách cho phép mỗi worker ghi kết quả của nó và đọc các phần phụ thuộc của nó từ bộ nhớ đệm. Khối chính từ khi tiến hành cho đến khi hoàn tất mọi thứ chúng phụ thuộc vào, trong đó chúng sẽ có thể đọc dữ liệu đầu vào từ bộ nhớ đệm. Sản phẩm cuối cùng là cũng được lưu vào bộ nhớ đệm, cho phép máy cục bộ tải xuống. Xin lưu ý rằng chúng ta cũng cần các phương tiện riêng để xuất các thay đổi cục bộ trong cây nguồn của người dùng để worker có thể áp dụng những thay đổi đó trước khi tạo.
Để làm được điều này, tất cả các phần của hệ thống xây dựng dựa trên cấu phần phần mềm được mô tả sớm hơn cần kết hợp với nhau. Môi trường xây dựng phải hoàn chỉnh tự mô tả để có thể xoay vòng nhân viên mà không cần sự can thiệp của con người. Xây dựng phải hoàn toàn độc lập vì mỗi bước có thể được thực thi trên một máy khác. Kết quả phải có tính xác định hoàn toàn, vì vậy, rằng mỗi worker có thể tin tưởng kết quả mà nó nhận được từ các worker khác. Chẳng hạn việc đảm bảo là rất khó đối với một hệ thống dựa trên nhiệm vụ. khiến cho việc xây dựng một hệ thống thực thi từ xa đáng tin cậy gần như không thể một.
Bản dựng được phân phối tại Google
Kể từ năm 2008, Google đã sử dụng hệ thống xây dựng được phân phối hỗ trợ cả hai lưu vào bộ nhớ đệm từ xa và thực thi từ xa, được minh hoạ trong Hình 3.
Hình 3. Hệ thống xây dựng phân phối của Google
Bộ nhớ đệm từ xa của Google được gọi là ObjFS. Công cụ này có một phần phụ trợ lưu trữ kết quả của bản dựng trong Bigtables được phân phối xuyên suốt hệ thống sản xuất của chúng tôi một trình nền FUSE trên giao diện người dùng có tên objfsd chạy trên máy. Trình nền FUSE cho phép các kỹ sư duyệt qua kết quả của bản dựng như thể là các tệp thông thường được lưu trữ trên máy trạm, nhưng có nội dung tệp chỉ được tải xuống theo yêu cầu cho một số ít tệp mà người dùng. Việc phân phối nội dung tệp theo yêu cầu giúp giảm đáng kể cả mạng và ổ đĩa và hệ thống có thể xây dựng nhanh gấp hai lần so với khi chúng tôi lưu trữ tất cả đầu ra của bản dựng trên ổ đĩa cục bộ của nhà phát triển.
Hệ thống thực thi từ xa của Google có tên là Forge. Một khách hàng giả mạo trong Blaze (phương thức nội bộ tương đương của Bazel) được gọi là Nhà phân phối gửi yêu cầu cho từng hành động đến một công việc đang chạy trong trung tâm dữ liệu được gọi là Trình lập lịch biểu. Trình lập lịch biểu duy trì bộ nhớ đệm của hành động kết quả, cho phép công cụ này trả về một phản hồi ngay lập tức nếu hành động do bất kỳ người dùng hệ thống nào khác tạo. Nếu không, thao tác này sẽ đặt thao tác vào một hàng đợi. Một nhóm lớn các công việc Người thực thi liên tục đọc các hành động từ hàng đợi này, thực thi các API đó và lưu trữ kết quả trực tiếp trong Bigtables ObjFS. Các kết quả có sẵn cho người thi hành để thực hiện các hành động trong tương lai hoặc được tải xuống thông qua objfsd.
Kết quả cuối cùng là một hệ thống có thể mở rộng để hỗ trợ hiệu quả tất cả các bản dựng thực hiện tại Google. Quy mô các công trình của Google thực sự khổng lồ: Google chạy hàng triệu bản dựng, thực thi hàng triệu trường hợp kiểm thử và tạo ra hàng petabyte kết quả đầu ra của bản dựng từ hàng tỷ dòng mã nguồn mỗi ngày. Không chỉ một hệ thống như vậy cho phép các kỹ sư của chúng tôi xây dựng các cơ sở mã phức tạp một cách nhanh chóng, nó cũng cho phép chúng tôi triển khai rất nhiều công cụ và hệ thống tự động dựa vào bản dựng.