Cách xây dựng và triển khai các gói cho server FreeBSD của bạn bằng Buildbot và Poudriere
Bộ sưu tập các gói và cổng FreeBSD , sau đây được gọi là cây cổng , là hệ thống xây dựng của FreeBSD cho phần mềm bên ngoài. Nó cung cấp một cách xây dựng các gói nhất quán dựa trên Makefile . Cổng đề cập đến công thức xây dựng, đó là Makefile và các file liên quan; trong khi gói là kết quả của việc xây dựng một cổng thành một repository binary (nén) của các file gói và thông tin meta của nó. Có thể xây dựng và cài đặt thủ công một tập hợp con hoặc tất cả hơn 30.000 cổng khi make install . Tuy nhiên, các bản dựng sẽ chạy trên một trong các  server  của bạn — không phải là một môi trường sạch. Đối với các trường hợp sử dụng production , bản dựng thủ công cũng  nghĩa là  mỗi  server  lưu trữ cần có cùng một bản sửa đổi của cây cổng và cần phải biên dịch tất cả các gói cho chính nó. Điều này  nghĩa là  công việc lặp đi lặp lại, dễ xảy ra lỗi của con người và  server . Tốt hơn là truy xuất và sử dụng các gói binary  giống hệt nhau, được tạo sẵn trên mỗi  server  và phân phát chúng từ một  repository  trung tâm, an toàn.
  Để làm điều này,  Poudriere là công cụ tiêu chuẩn trên FreeBSD để xây dựng, thử nghiệm và kiểm tra các gói cũng như duy trì các  repository . Mỗi bản dựng được chạy cô lập trong một nhà tù mới, chạy version  FreeBSD mong muốn và bắt đầu mà không có gói nào được cài đặt. Chỉ hệ thống cơ sở, cộng với mọi phụ thuộc được chỉ định rõ ràng, mới có sẵn cho bản dựng sạch. Poudriere đảm nhận việc xây dựng lại các gói khi cần thiết cũng như cập nhật  repository  sau khi quá trình xây dựng kết thúc. Công cụ dòng lệnh poudriere là trung tâm để quản lý các cây cổng khác nhau, các version  FreeBSD, các tùy chọn xây dựng cổng và cuối cùng là chạy các bản dựng.
Trong hướng dẫn này, bạn sẽ cấu hình Poudriere, xây dựng một tập hợp các gói mong muốn, cài đặt lưu trữ gói dựa trên HTTP và tự động hóa việc xây dựng bằng Buildbot làm nền tảng tích hợp liên tục. Cuối cùng, bạn sẽ truy cập an toàn các gói từ client .
 Lưu ý: Để bao gồm các trường hợp sử dụng giống như production , các ví dụ hướng dẫn sử dụng các nhánh ổn định hàng quý của cây cổng . Việc ở trên một nhánh như vậy bảo vệ bạn khỏi vi phạm các thay đổi, đồng thời cung cấp bảo mật và xây dựng các bản sửa lỗi khi cần thiết — nếu bạn thường xuyên cập nhật cây từ thượng nguồn (Subversion hoặc gương GitHub của nó). Bạn có thể chọn ở lại một chi nhánh trong một khoảng thời gian dài, tùy thuộc vào tốc độ mà  group  nhà phát triển / cơ sở hạ tầng có thể xử lý các bản cập nhật hệ thống của bạn. Bộ sưu tập cổng hỗ trợ các bản phát hành FreeBSD cho đến khi chúng trở thành version  cuối của vòng đời (EOL) —xem các bản phát hành FreeBSD được hỗ trợ — do đó, các bản cập nhật hệ điều hành và gói có thể được xử lý độc lập. Ngoài ra, bạn có thể xem xét một repository  kiểm soát version  local  được sao chép từ cây ngược dòng. Bằng cách đó, bạn có thể quản lý các bản vá và chỉ hợp nhất các thay đổi ngược dòng vào thời điểm bạn muốn.
Yêu cầu
Trước khi bắt đầu hướng dẫn này, bạn cần :
- Server chạy FreeBSD 11.2. Nếu bạn mới làm việc với FreeBSD, bạn có thể thấy hữu ích khi tùy chỉnh server này theo hướng dẫn của ta về Cách bắt đầu với FreeBSD .Lưu ý: FreeBSD 12.0 hiện đang gặp sự cố với các jails lồng nhau , điều này trước tiên cần được khắc phục trước khi 12.x được dùng cho hướng dẫn này.
 - Dung lượng đĩa trống 10 GB trở lên để có đủ dung lượng lưu trữ các gói và log .
 - Cài đặt Buildbot cơ bản bằng cách hoàn thành hướng dẫn Cách cài đặt Buildbot trên FreeBSD .
 - Một server khác đang chạy FreeBSD, cùng một version , mà bạn sẽ sử dụng làm client để tìm nạp và cài đặt các gói mà bạn sẽ tự động xây dựng và lưu trữ trong repository dựa trên HTTP / HTTPS.
 
Bước 1 - Cài đặt Poudriere để sử dụng trong Buildbot Worker
Sau khi hoàn thành hướng dẫn yêu cầu , bạn sẽ có một bản jailbreak và công nhân Buildbot đang hoạt động cộng với cài đặt Nginx. Bạn sẽ xây dựng dựa trên cài đặt hiện có này trong các bước sau. Trong bước đầu tiên này, bạn sẽ cài đặt công cụ xây dựng Poudriere bên trong nhà tù công nhân, vì đó là nơi quy trình công nhân xây dựng sẽ kích hoạt các bản dựng sau này.
Kết nối với server lưu trữ Buildbot của bạn và mở shell gốc trong tù công nhân bằng lệnh sau:
- sudo jexec buildbot-worker0 csh 
 
Cài đặt Poudriere dưới dạng một gói:
- pkg install poudriere 
 
Sau đó xác nhận cài đặt bằng cách nhấn y và sau đó ENTER .
Lưu ý: Nên sử dụng repository FreeBSD chính thức để cài đặt Buildbot, Poudriere, v.v. Nếu bạn tự xây dựng các gói công cụ đó, bạn sẽ bắt đầu trong tình huống gà và trứng: muốn cài đặt phần mềm bên ngoài, nhưng yêu cầu cài đặt Poudriere để có được các gói được xây dựng rõ ràng. Vì Poudriere là một công cụ rất ổn định và tương thích ngược nên không có gì chống lại việc cập nhật nó thường xuyên và độc lập với các gói production của bạn.
Nếu bạn đã làm theo hướng dẫn yêu cầu , thì trường hợp này đã xảy ra và bạn có thể tiếp tục mà không cần làm theo ghi chú này.
Bạn đã cài đặt thành công công cụ Poudriere mới nhất và các phụ thuộc. Trong vài bước tiếp theo, bạn sẽ thực hiện các bước chuẩn bị để cấu hình Poudriere.
Bước 2 - Tạo khóa ký gói (Tùy chọn)
Bạn nên cài đặt chữ ký điện tử cho các gói được xây dựng để cung cấp bảo mật hơn. Bỏ qua bước này nếu bạn muốn bảo mật cài đặt của bạn sau này hoặc theo một cách khác. Nếu không, hãy tiếp tục và tạo một cặp khóa dùng để ký gói (sử dụng private key ) và xác minh gói (sử dụng phần công khai).
 Các gói, theo mặc định, được tạo dưới dạng file  .txz , là file  tarball được nén mạnh của nội dung gói. Tổng kiểm tra của file  nén, cùng với việc phân phát file  qua HTTP / HTTPS (Tổng kiểm tra TCP), đã cung cấp một số biện pháp bảo vệ chống lại dữ liệu bị hỏng. Nội dung gói thường bao gồm các file  và folder  cộng với thông tin meta như tên gói, version  và các tùy chọn khác. Các file  thậm chí có thể bao gồm các chương trình có thể setuid (như được thấy trong gói sudo - mặc dù sudo không được tích hợp sẵn trong FreeBSD) và các tập lệnh thời gian cài đặt chạy  với quyền   user  root . Do đó, cài đặt từ các nguồn chưa được xác minh có nguy cơ bảo mật.
 Bằng cách cung cấp các gói qua HTTPS, bạn không thể phát hiện ai đó có giả mạo các gói trên đĩa hay không. Tính toàn vẹn và tính xác thực của các gói của bạn có thể được thêm vào bằng cách  cấu hình  Poudriere để ký vào  repository  bằng private key  RSA. Do đó, các thông báo đã ký và public key  tương ứng được lưu trữ trong file  digests.txz của  repository . Cặp khóa bắt buộc (khóa riêng tư và public key  RSA) có thể được giữ nguyên trong thời gian dài trừ khi private key  bị mất hoặc bị xâm phạm.
Trong bước này, bạn sẽ tạo cặp khóa nơi các bản dựng chạy (worker jail) và download phần công khai để sử dụng sau này trên các ứng dụng client gói (sẽ thảo luận ở bước sau).
Đảm bảo bạn vẫn ở trong shell root của worker jail.
Tạo private key RSA mới:
- openssl genrsa -out /usr/local/etc/poudriere.key 4096 
 
Tệp private key chỉ cần root có thể truy cập được — user chạy Poudriere. Bảo vệ quyền truy cập của nó:
- chmod 0600 /usr/local/etc/poudriere.key 
 
Sau đó, bạn cần phần public key có sẵn trên client để xác minh chữ ký gói. Hãy extract public key ngay bây giờ:
- openssl rsa -in /usr/local/etc/poudriere.key -pubout -out /tmp/poudriere.pub 
 
Cuối cùng, download file public key từ máy tính của bạn :
- scp your-server:/usr/jails/buildbot-worker0/tmp/poudriere.pub /tmp/poudriere.pub 
 
Điều này kết thúc việc tạo cặp khóa tùy chọn để ký gói. Sau đó, bạn sẽ cấu hình việc ký thực tế với Poudriere và sử dụng file public key đã download trên client để xác minh.
Một bước tùy chọn khác sau đây: nếu bạn sử dụng hệ thống file ZFS, Poudriere có thể sử dụng nó để tăng tốc các bản dựng. Nếu không, bạn có thể chuyển sang Bước 4 để cấu hình Poudriere để sẵn sàng chạy bản dựng đầu tiên.
Bước 3 - Cài đặt ZFS (Tùy chọn)
Bước này chỉ áp dụng nếu bạn chạy hệ thống FreeBSD trên hệ thống file ZFS . Ví dụ: nếu bạn đang sử dụng DigitalOcean Server, hình ảnh được gắn nhãn 11,2 x64 zfs (đối với FreeBSD 11,2 ). Trong bước này, bạn sẽ tạo hệ thống file mà Poudriere có thể sử dụng để tạo và quản lý nhà tù nhanh hơn, có khả năng tăng tốc các bản dựng của bạn.
Bạn có thể tìm hiểu xem mình có đang sử dụng ZFS hay không bằng cách liệt kê các group . Đảm bảo rằng bạn đang ở trong shell của server , không phải bên trong nhà tù.
- exit 
 
Chạy lệnh sau để liệt kê các zpools:
- sudo zpool list 
 
Nếu có bất kỳ hồ bơi nào, nó sẽ in thông tin về nó:
OutputNAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT zroot   148G  94.4G  54.1G        -         -    66%    63%  1.00x  ONLINE  - Nếu không, nếu không hỗ trợ ZFS, công cụ sẽ in no pools available hoặc failed to initialize ZFS library . Điều này  nghĩa là  không có hệ thống nào của bạn đang sử dụng ZFS; trong trường hợp này, hãy chuyển sang bước tiếp theo. Nếu bạn đã quyết định sử dụng đĩa hoặc loại lưu trữ khác, chẳng hạn như hệ thống file  UFS, bạn cũng có thể chuyển sang bước tiếp theo.
Nếu bạn định sử dụng ZFS, hãy nhớ tên group được in mà bạn muốn lưu trữ dữ liệu liên quan đến bản dựng. Bạn nên có kế hoạch cho vài GB dung lượng lưu trữ.
ZFS rất hữu ích để tách các bộ dữ liệu khác nhau của Poudriere, như xây dựng nhà tù, cây cổng, log , gói và các dữ liệu khác. Chúng được lưu trữ độc lập và kết quả là có thể xóa nhanh chóng với sự chắc chắn không để lại dung lượng trống hoặc dấu vết phía sau.
Để Poudriere sử dụng ZFS, bạn cần thực hiện ba việc: tạo tập dữ liệu ZFS root , cho phép tạo và xóa tập dữ liệu ZFS (mà theo mặc định, nhà tù Buildbot worker hoặc bất kỳ nhà tù nào khác không thể làm) và chỉnh sửa Cấu hình của Poudriere cho phù hợp.
 Trong hướng dẫn  yêu cầu , bạn đã  cấu hình  jailbreak Buildbot worker trong /etc/jail.buildbot-worker0.conf . Mở file  này bằng editor   bạn muốn  và thêm các dòng được đánh dấu sau để ủy quyền tập dữ liệu mẹ để cho phép nhà tù quản lý tập dữ liệu ZFS bên dưới tập dữ liệu root . Hãy nhớ thay thế zroot bằng tên  group  mong muốn của bạn:
- sudo ee /etc/jail.buildbot-worker0.conf 
 
buildbot-worker0 {     host.hostname = buildbot-worker0.localdomain;     ip4.addr = "lo1|10.0.0.3/24";     path = "/usr/jails/buildbot-worker0";     exec.start = "/bin/sh /etc/rc";     exec.stop = "/bin/sh /etc/rc.shutdown";     mount.devfs; # need /dev/*random for Python     persist;      exec.poststart = "/sbin/zfs jail buildbot-worker0 zroot/pdr/w0"; } Trong bài viết này,  ta  sẽ lưu trữ dữ liệu liên quan đến xây dựng trên zroot  group  ZFS — vui lòng điều chỉnh cấu hình liên quan đến ZFS này ở đây và trong suốt phần còn lại của bài viết nếu bạn chọn một  group  có tên khác.
 Sau khi thêm nội dung này, hãy lưu và thoát khỏi  editor . Nếu bạn đang sử dụng ee , hãy thực hiện việc này bằng cách nhấn CTRL+C , nhập exit và nhấn ENTER .
Tạo tập dữ liệu ZFS root được đề cập trong file cấu hình:
- sudo zfs create zroot/pdr 
 - sudo zfs create zroot/pdr/w0 
 
Điều này cố tình giả định bạn có thể cần thêm nhiều công nhân hơn trong tương lai và do đó tạo tập dữ liệu phụ cho công nhân đầu tiên của bạn. Tên tập dữ liệu có mục đích ngắn, vì các version FreeBSD cũ hơn (trước 12.0) có giới hạn tên mount là 88 ký tự.
Để tù nhân kiểm soát tập dữ liệu mẹ và quản lý bất kỳ tập dữ liệu con nào, tập dữ liệu phải được đánh dấu bằng cờ sau:
- sudo zfs set jailed=on zroot/pdr/w0 
 
Với các yêu cầu hiện đã được đáp ứng, máy giam sẽ bắt đầu đúng với cấu hình mới:
- sudo service jail restart buildbot-worker0 
 
Với các hướng dẫn này, bạn đã tạo thành công các hệ thống file cần thiết — bộ dữ liệu ZFS — và cho phép nhà tù quản lý tập dữ liệu mẹ. Trong bước tiếp theo, bạn sẽ cấu hình Poudriere, bao gồm việc chỉ định zpool đã chọn và tập dữ liệu được sử dụng để lưu trữ dữ liệu liên quan đến bản dựng.
Bước 4 - Cấu hình Poudriere, Build Jail và Ports Tree
Cho đến thời điểm này, bạn đã cài đặt Poudriere và các yêu cầu tùy chọn bao gồm ký gói và ZFS. Để Poudriere có thể chạy theo kiểu “bỏ tù” — nghĩa là, hoạt động bình thường từ bên trong nhà tù công nhân Buildbot — bạn cần cung cấp một số quyền nhất định cho nhà tù. Ví dụ, nếu bạn sử dụng ZFS, bạn đã ủy quyền cho nhà tù sử dụng và quản lý một tập dữ liệu mẹ.
Trước tiên, hãy cấu hình IP loopback và tất cả các quyền, sau đó bước qua ý nghĩa tương ứng sau các thay đổi.
 Poudriere muốn bắt đầu hai nhà tù xây dựng cho mỗi bản dựng: một nhà tù chỉ có mạng loopback và một nhà tù có truy cập internet. Chỉ xây dựng các giai đoạn được cho là để tiếp cận internet mới sử dụng giai đoạn sau. Ví dụ: fetch có thể  download  các tarball nguồn, nhưng giai đoạn build không được phép truy cập internet. Cấu hình hiện có của tù công nhân có ip4.addr = "lo1|10.0.0.3/24" cho phép truy cập internet. Để cho phép Poudriere chỉ định địa chỉ loopback cho các trại giam xây dựng mới bắt đầu, IP cũng phải được chuyển cho cha mẹ của nó (nhà tù công nhân). Để điều này hoạt động, hãy đảm bảo bạn đã áp dụng version  mới nhất của file  cấu hình firewall  /usr/local/etc/ipfw.rules từ hướng dẫn  yêu cầu , sẽ chặn giao diện loopback lo0 mở các kết nối đi thông qua NAT.
Thêm các dòng được đánh dấu vào cấu hình tù công nhân của bạn:
- sudo ee /etc/jail.buildbot-worker0.conf 
 
buildbot-worker0 {     host.hostname = buildbot-worker0.localdomain;     ip4.addr = "lo1|10.0.0.3/24";     ip4.addr += "lo0|127.0.0.3";     path = "/usr/jails/buildbot-worker0";     exec.start = "/bin/sh /etc/rc";     exec.stop = "/bin/sh /etc/rc.shutdown";     mount.devfs; # need /dev/*random for Python     persist;      # If you followed the ZFS setup step, you have this line     # already (keep it). For non-ZFS setup, this line must be absent.     exec.poststart = "/sbin/zfs jail buildbot-worker0 zroot/pdr/w0";      allow.chflags;     allow.mount;     allow.mount.devfs;     allow.mount.nullfs;     allow.mount.procfs;     allow.mount.tmpfs;     allow.mount.zfs; # only needed if you use ZFS     allow.raw_sockets; # optional     allow.socket_af; # optional     allow.sysvipc; # optional     children.max=16;     enforce_statfs=1; } Ở đây bạn đã thêm những thứ sau (cũng xem trang (8) của nhà tù ):
-  
ip4.addr += "lo0|127.0.0.3"thêm một địa chỉ IPv4 khác vào tù. Sau đó, bạn sẽ cấu hình biến LOIP4 củaLOIP4để gán địa chỉ loopback này để xây dựng các nhà tù không được phép nói chuyện với internet hoặc các máy khác trong mạng của bạn, chẳng hạn như trong giai đoạnbuild. Nếu bạn từng có một bản dựng yêu cầu truy cập internet trong quá trình xây dựng, Poudriere hỗ trợ biếnALLOW_NETWORKING_PACKAGESnhư một giải pháp thay thế. Tuy nhiên, tốt hơn hết là bạn nên làm theo phương pháp hay nhất và thực hiện download cũng như các việc sử dụng internet khác sớm hơn, trong giai đoạnfetchmà Poudriere cho phép truy cập internet. -  
allow.chflagscho phép Poudriere hiển thị các file hệ thống nhất định như/bin/shkhông thể thay đổi trong bản dựng. -  
allow.mountvà các tùy chọnallow.mount.*cho phép Poudriere gắn các hệ thống file cần thiết nhất định vào nhà tù xây dựng. -  
allow.raw_socketscho phép sử dụng các socket thô vàallow.socket_afcho phép sử dụng bất kỳ họ địa chỉ socket nào, đều được áp dụng cho các nhà tù xây dựng có khả năng kết nối internet. Điều này rất hữu ích để bạn có thể chạy các công cụ nhưpingở chế độ tương tác, giống như khi vào bản dựng xây dựng để gỡ lỗi. -  
allow.sysvipckhông được dùng nữa vì có ba cài đặt riêng biệtsysvmsg/sysvsem/sysvshmđể hạn chế các tù nhân chỉ nhìn thấy các đối tượng bộ nhớ dùng chung của riêng chúng (thông qua nguyên thủy IPC “SYS V”). Tuy nhiên, Poudriere chỉ có thể truyềnallow.sysvipcđể xây dựng nhà tù vì nó không thể đọc thông tin sysctl liên quan cho ba tham số riêng biệt (kể từ FreeBSD 11.2). Với cấu hình không dùng nữa này, máy giam có thể đọc bộ nhớ dùng chung của các tiến trình bên ngoài máy giam. Điều này chỉ phù hợp với một số phần mềm nhất định phụ thuộc vào các tính năng của IPC, như PostgreSQL, vì vậy khả năng điều này ảnh hưởng đến bảo mật là rất nhỏ. Bạn có thể loại bỏ cấu hình này trừ khi bạn phụ thuộc vào một cổng yêu cầu nó trong quá trình xây dựng. -  
children.max=16cho phép 16 nhà tù phụ bên dưới nhà tù công nhân. Bạn có thể tăng con số này sau nếu bạn có nhiều CPU và Poudriere cố gắng tạo ra nhiều nhà tù xây dựng hơn mức cho phép. Mỗi bản dựng Poudriere sẽ cố gắng tạo một nhà tù tham chiếu và hai nhà tù bản dựng cho mỗi “công việc” và mặc định của nó là sử dụng số lượng CPU (như kết quả củasysctl -n hw.ncpu) làm số lượng công việc. -  
enforce_statfs=1là bắt buộc cùng vớiallow.mountđể mount các hệ thống file nhất định. 
Lưu và thoát khỏi file cấu hình.
Khởi động lại tù để cấu hình của nó có ảnh hưởng ngay lập tức:
- sudo service jail restart buildbot-worker0 
 
Các module kernel tương ứng phải được tải để Poudriere có thể thực hiện mount . Chạy các lệnh sau để tải các module tại thời điểm khởi động và ngay lập tức:
- sudo sysrc -f /boot/loader.conf nullfs_load=YES 
 - sudo kldload -n nullfs 
 - sudo sysrc -f /boot/loader.conf tmpfs_load=YES 
 - sudo kldload -n tmpfs 
 
Bạn đã cài đặt gói Poudriere trước đó, gói này đã sao chép file  mẫu /usr/local/etc/poudriere.conf.sample sang /usr/local/etc/poudriere.conf . Tiếp theo, bạn sẽ thực hiện các chỉnh sửa đối với file  cấu hình. Tất cả các biến cấu hình có thể có trong mẫu, vì vậy hãy bỏ ghi chú hoặc điều chỉnh dòng tương ứng trong file  để đặt một biến thành một giá trị nhất định.
Đối với các lệnh sau, hãy đảm bảo bạn vẫn ở trong shell gốc trong tù công nhân:
- sudo jexec buildbot-worker0 csh 
 
Mở file bằng lệnh sau:
- ee /usr/local/etc/poudriere.conf 
 
Nếu bạn đã quyết định sử dụng ZFS, vui lòng điền vào tập dữ liệu mẹ và zpool mong muốn của bạn:
. . . # Poudriere can optionally use ZFS for its ports/jail storage. For # ZFS define ZPOOL, otherwise set NO_ZFS=yes # #### ZFS # The pool where poudriere will create all the filesystems it needs # poudriere will use ${ZPOOL}/${ZROOTFS} as its root # # You need at least 7GB of free space in this pool to have a working # poudriere. # ZPOOL=zroot  ### NO ZFS # To not use ZFS, define NO_ZFS=yes #NO_ZFS=yes  # root of the poudriere zfs filesystem, by default /poudriere ZROOTFS=/pdr/w0 . . . Ngược lại, nếu bạn quyết định chống lại ZFS, hãy tắt hỗ trợ ZFS:
. . . # Poudriere can optionally use ZFS for its ports/jail storage. For # ZFS define ZPOOL, otherwise set NO_ZFS=yes # #### ZFS # The pool where poudriere will create all the filesystems it needs # poudriere will use ${ZPOOL}/${ZROOTFS} as its root # # You need at least 7GB of free space in this pool to have a working # poudriere. # #ZPOOL=zroot  ### NO ZFS # To not use ZFS, define NO_ZFS=yes NO_ZFS=yes  # root of the poudriere zfs filesystem, by default /poudriere # ZROOTFS=/poudriere . . . Sau đó, bạn sẽ hướng dẫn Poudriere download hệ thống cơ sở FreeBSD và do đó khởi động máy giam bản dựng đầu tiên. Điều này yêu cầu chỉ định một server download , hãy thêm dòng được đánh dấu sau:
. . . # the host where to download sets for the jails setup # You can specify here a host or an IP # replace _PROTO_ by http or ftp # replace _CHANGE_THIS_ by the hostname of the mirrors where you want to fetch # by default: ftp://ftp.freebsd.org # # Also note that every protocols supported by fetch(1) are supported here, even # file:/// # Suggested: https://download.FreeBSD.org FREEBSD_HOST=https://download.FreeBSD.org Vì Poudriere sẽ bị bỏ tù nên giới hạn tên mount 88 ký tự của các version  FreeBSD trước 12.0 đặc biệt có hại, vì đường dẫn đầy đủ của jail /usr/jails/buildbot-worker0 là một phần của mỗi đường dẫn mount. Vượt quá giới hạn sẽ phá vỡ các bản dựng, vì vậy hãy cẩn thận để giảm độ dài đường dẫn. Thay vì folder  điển hình /usr/local/poudriere , bạn có thể sử dụng /pdr như sau:
. . . # The directory where poudriere will store jails and ports BASEFS=/pdr Bây giờ, hãy tạo folder đó:
- mkdir /pdr 
 
Chuyển lại sang trình poudriere.conf của poudriere.conf :
- ee /usr/local/etc/poudriere.conf 
 
Poudriere sẽ gắn một folder trung tâm cho các file dist (tarballs mã nguồn cho mỗi cổng) trong khi chạy các bản dựng để tất cả các trình tạo chia sẻ cùng một bộ nhớ cache. Thư mục mặc định là:
. . . # If set the given directory will be used for the distfiles # This allows to share the distfiles between jails and ports tree # If this is "no", poudriere must be supplied a ports tree that already has # the required distfiles. DISTFILES_CACHE=/usr/ports/distfiles Bây giờ, hãy tạo folder đó:
- mkdir -p /usr/ports/distfiles 
 
Nếu bạn đã làm theo Bước 2 và tạo khóa ký repository , vui lòng nhập lại editor và chỉ định nó:
- ee /usr/local/etc/poudriere.conf 
 
. . . # Path to the RSA key to sign the PKG repo with. See pkg-repo(8) PKG_REPO_SIGNING_KEY=/usr/local/etc/poudriere.key Các bản dựng sẽ chạy nhanh hơn nhiều nếu bạn lưu vào cache các kết quả kết quả của trình biên dịch C / C ++ và trình liên kết cho lần sau. Cây cổng hỗ trợ điều này trực tiếp bằng cách tận dụng công cụ ccache . Vui lòng kích hoạt nó và tạo folder bộ nhớ cache tương ứng nếu bạn có thể dành thêm ít nhất 5GB dung lượng (kích thước bộ nhớ cache mặc định):
. . . # ccache support. Supply the path to your ccache cache directory. # It will be mounted into the jail and be shared among all jails. # It is recommended that extra ccache configuration be done with # ccache -o rather than from the environment. CCACHE_DIR=/var/cache/ccache - mkdir /var/cache/ccache 
 
Việc xây dựng và chạy phần mềm Linux không phổ biến, vì vậy hãy tắt nó cho đến khi cần:
- ee /usr/local/etc/poudriere.conf 
 
. . . # Disable linux support NOLINUX=yes Các nhà tù sẽ được gán một địa chỉ loopback, hoặc Poudriere sẽ cảnh báo về điều đó.  Ta  có thể kế thừa IP của tù vì nó nằm trên  network interface  chỉ loopback ( lo1 ). Đối với điều này, vui lòng thêm dòng sau vào cuối file  cấu hình:
LOIP4=127.0.0.3 Lưu và thoát khỏi file cấu hình.
 Đối với các bản dựng đang hoạt động,  ta  cần thêm hai tài nguyên: hệ thống cơ sở FreeBSD để sử dụng làm mẫu giam bản dựng và một cây cổng cập nhật. Chọn version  FreeBSD mà bạn đang  nhắm đến . Trong hướng dẫn này,  ta  sẽ yêu cầu Poudriere  download  FreeBSD 11.2 cho kiến trúc amd64 . Bạn có thể đặt tên cho nhà tù theo cách bạn muốn, nhưng nên đặt tên phù hợp như 112amd64 . Ngoài ra, hãy nhớ lựa chọn giữa các nhánh cây cổng ổn định, hàng quý (ở đây,  ta  sử dụng 2019Q2 ) và nhánh "đầu" cạnh chảy máu có thể dẫn đến việc phá vỡ các bản dựng sau các bản cập nhật 2019Q2 . Không thể sử dụng các version  FreeBSD mới hơn version  trên  server  trong bản dựng.
Download và tạo nhà tù xây dựng:
- poudriere jail -c -j 112amd64 -v 11.2-RELEASE -a amd64 
 
Cuối cùng, hãy download cây cổng. Phương pháp download mặc định là portnap , sử dụng ảnh chụp nhanh được nén của cây mà không có thông tin lịch sử. Tốt hơn là Subversion hoặc Git để hợp nhất các thay đổi ngược dòng hoặc đóng góp lại. Điều này cũng quan trọng nếu bạn muốn sử dụng cây tùy chỉnh, tự lưu trữ trong hệ thống kiểm soát version . Trong lệnh sau, vui lòng điền vào năm và quý hiện tại.
Nếu bạn muốn bắt đầu với cây cổng chính thức ngược dòng:
- poudriere ports -c -p 2019Q2 -m svn+https -B branches/2019Q2 
 
Phương thức svn+https sẽ đồng bộ hóa từ  server  FreeBSD Subversion ( có thể xem trực tuyến tại đây ). Nếu bạn định sử dụng một nguồn thay thế, hãy đọc lưu ý sau, nếu không hãy bỏ qua.
 Lưu ý: Theo mặc định, phương pháp git sao chép cây từ máy nhân bản trên GitHub.
 Để sử dụng nhánh "head", hãy thay thế tham số cuối cùng bằng -B head (cho Subversion) hoặc -B master (cho Git).
 Nếu  bạn muốn sử dụng  repository  Git của riêng mình, bạn sẽ phải chỉ định rõ ràng URL repository  và tên chi nhánh  của bạn . Giả sử bạn muốn đặt tên cây của bạn customtree và sử dụng các chi nhánh custom :
- poudriere ports -c -p customtree -m git -B custom -U https://github.com/AndiDog/freebsd-ports.git 
 
URL ví dụ trỏ đến một nhánh của các cổng freebsd trên GitHub, nhưng có thể là bất kỳ Git nào hoặc loại repository được hỗ trợ nào khác mà server CI có quyền truy cập.
 Các cây có sẵn có thể được liệt kê với poudriere ports -l , xuất ra một danh sách như:
OutputPORTSTREE METHOD    TIMESTAMP           PATH 2019Q2    svn+https 2019-04-20 19:23:19 /pdr/ports/2019Q2 Đến đây bạn đã hoàn tất việc cài đặt cấu hình và tài nguyên của Poudriere. Bạn đã cấu hình Poudriere với dữ liệu cần thiết để kích hoạt các bản dựng đầu tiên và cho phép máy giam tạo các bản phụ. Tiếp theo, bạn sẽ chạy bản dựng đầu tiên theo cách thủ công để xác minh cài đặt đang hoạt động.
Bước 5 - Chạy bản dựng thử nghiệm thủ công
 Bạn có thể sử dụng lệnh poudriere bulk để xây dựng một hoặc nhiều gói và tất cả các gói phụ thuộc của nó. Sau lần xây dựng đầu tiên của một gói, Poudriere cũng tự động phát hiện xem có cần thiết phải xây dựng lại hay không, nếu không thì vẫn giữ nguyên file  gói hiện có. Trong khi lệnh con bulk chỉ xây dựng các gói, việc chạy một bản dựng bằng poudriere testport thử nghiệm poudriere testport cũng sẽ kiểm tra các cổng được chỉ định bằng cách sử dụng định nghĩa “kiểm tra” được đưa ra trong Makefile của cổng. Đối với phạm vi bài viết này,  ta  chỉ quan tâm đến việc cung cấp các gói để cài đặt trên client , vì vậy  ta  đang sử dụng các bản dựng hàng loạt.
Đảm bảo bạn vẫn đang ở trong shell root của tù công nhân nơi bạn đã cài đặt Poudriere. Sau đó, đây cũng sẽ là nơi quy trình Buildbot worker sẽ chạy các bản dựng tự động.
Chạy bản dựng, điền vào chỗ dành sẵn với tên tù bản dựng và tên cây cổng mà bạn đã chọn trước đó:
- poudriere bulk -j 112amd64 -p 2019Q2 ports-mgmt/pkg 
 
Điều này xây dựng các cổng ports-mgmt/pkg . Các cổng trong cây chính thức được lưu trữ trong hệ thống phân cấp <category>/<name> và những đường dẫn đó (được gọi là gốc gói ) được sử dụng để cho Poudriere biết gói nào nên được xây dựng. Đầu tiên,  ta  đã chọn chỉ xây dựng trình quản lý gói pkg , trình quản lý gói này không có bất kỳ phụ thuộc nào của bên thứ ba và do đó, đây là cách kiểm tra cấu hình tốt, nhanh chóng. Nếu mọi thứ chạy tốt, bạn sẽ thấy  kết quả  như thế này:
Output[00:00:00] Creating the reference jail... done [00:00:06] Mounting system devices for 112amd64-2019Q2 [00:00:06] Mounting ports/packages/distfiles [00:00:06] Using packages from previously failed build [00:00:06] Mounting ccache from: /var/cache/ccache [00:00:06] Mounting packages from: /pdr/data/packages/112amd64-2019Q2 /etc/resolv.conf -> /pdr/data/.m/112amd64-2019Q2/ref/etc/resolv.conf [00:00:06] Starting jail 112amd64-2019Q2 [00:00:07] Logs: /pdr/data/logs/bulk/112amd64-2019Q2/2019-04-20_19h35m00s [00:00:07] Loading MOVED for /pdr/data/.m/112amd64-2019Q2/ref/usr/ports [00:00:08] Ports supports: FLAVORS SELECTED_OPTIONS [00:00:08] Gathering ports metadata [00:00:08] Calculating ports order and dependencies [00:00:08] pkg package missing, skipping sanity [00:00:08] Skipping incremental rebuild and repository sanity checks [00:00:08] Cleaning the build queue [00:00:08] Sanity checking build queue [00:00:08] Processing PRIORITY_BOOST [00:00:08] Balancing pool [00:00:08] Recording filesystem state for prepkg... done [00:00:08] Building 1 packages using 1 builders [00:00:08] Starting/Cloning builders [00:00:14] Hit CTRL+t at any time to see build progress and stats [00:00:14] [01] [00:00:00] Building ports-mgmt/pkg | pkg-1.10.5_5 [00:03:24] [01] [00:03:10] Finished ports-mgmt/pkg | pkg-1.10.5_5: Success [00:03:25] Stopping 1 builders [00:03:25] Creating pkg repository Creating repository in /tmp/packages: 100% Packing files for repository: 100% [00:03:25] Committing packages to repository [00:03:25] Removing old packages [00:03:25] Built ports: ports-mgmt/pkg [112amd64-2019Q2] [2019-04-20_19h35m00s] [committing:] Queued: 1  Built: 1  Failed: 0  Skipped: 0  Ignored: 0  Tobuild: 0   Time: 00:03:18 [00:03:25] Logs: /pdr/data/logs/bulk/112amd64-2019Q2/2019-04-20_19h35m00s [00:03:25] Cleaning up [00:03:25] Unmounting file systems Đầu ra này cho biết các gói sẽ đi đâu sau khi xây dựng và từ đâu các gói hiện có được lấy trong trường hợp chúng không cần xây dựng lại (tại đây: /pdr/data/packages/112amd64-2019Q2 ). Ngoài ra,  kết quả  hiển thị tổng quan về các bản dựng đang chạy trong khi Poudriere chạy (bạn có thể nhấn CTRL+T trong một  shell  tương tác để in tiến trình). Trong phần tóm tắt cuối cùng, bạn sẽ thấy một gói đã được xây dựng. Bạn có thể xem  kết quả  bản dựng chi tiết trong folder  log  ( /pdr/data/logs/bulk/112amd64-2019Q2/* ).
 Kết quả này xác nhận một bản dựng thành công. Nếu Poudriere đã xây dựng thành công ít nhất một gói, nó sẽ tự động  commit  gói đó vào  repository . Điều này  nghĩa là  các gói chỉ khả dụng sau khi tất cả các bản dựng đã hoàn tất, ngay cả khi các gói khác không thể xây dựng.  Như vậy,  bạn có một  repository  đang hoạt động tại /pdr/data/packages/112amd64-2019Q2 trong nhà tù Buildbot worker.
Bạn đã hoàn thành tất cả cấu hình cần thiết để trở lại các bản dựng Poudriere đang hoạt động và bạn đã xác minh thành công với bản dựng thủ công. Bạn sẽ thấy kết quả tương tự sau này trong hướng dẫn khi bạn đã tự động tạo hàng loạt trong Buildbot. Ngoài ra, một liên kết để xem log chi tiết sẽ có thể truy cập được từ giao diện web. Để đạt được điều này và để cung cấp repository cho khách hàng, tiếp theo bạn sẽ cài đặt một web server .
Bước 6 - Cấu hình Nginx để phục vụ Repository và giao diện web Poudriere
Poudriere cung cấp một số tạo tác kết quả mà ta muốn lưu trữ bằng web server :
-   Repository  được cung cấp cho khách hàng để họ có thể truy cập chúng bằng 
pkg updatethông thường và lệnhpkg install, sử dụng HTTPS hoặc HTTP làm phương tiện truyền tải. - Nhật ký bản dựng chi tiết rất hữu ích cho các nhà phát triển để gỡ lỗi các bản dựng có vấn đề hoặc để điều tra kết quả bản dựng. Chúng được lưu trữ trên mỗi gói và mỗi bản dựng — trong kết quả Poudriere từ bước cuối cùng, bạn đã thấy rằng các bản ghi được lưu trữ trong một folder cho mỗi bản dựng, được gắn nhãn ngày và giờ.
 - Giao diện web tích hợp của Poudriere là một trang HTML nhỏ, duy nhất trên mỗi bản dựng sử dụng WebSockets để cập nhật thường xuyên trạng thái hiển thị trên trang. Điều này rất hữu ích để có cái nhìn tổng quan hơn về khoảng cách của một bản dựng, phần phụ thuộc nào đã kích hoạt các bản dựng gói khác không thành công và cuối cùng là sự thay thế cho kết quả dòng lệnh, chỉ hiển thị tóm tắt ở cuối trừ khi bạn thực hiện cụ thể nó in tiến độ xây dựng hiện tại.
 
Thay đổi cấu hình trong Nginx là ngắn vì chỉ cần cung cấp các file tĩnh. Vì bạn sẽ phục vụ chúng cho thế giới bên ngoài, nên bây giờ bạn sẽ cấu hình version Nginx hiện có trên server , bên ngoài nhà tù, để phân phát các file được đề cập từ các đường dẫn bên trong nhà lao công nhân.
Vui lòng thoát khỏi shell vì bây giờ bạn sẽ làm việc trên server :
- exit 
 
Mở  editor  với cấu hình Nginx /usr/local/etc/nginx/nginx.conf :
- sudo ee /usr/local/etc/nginx/nginx.conf 
 
Thêm các vị trí sau vào bên trong server { block:
. . . http {     . . .     server {         . . .         location / {             root /usr/local/www/nginx;             index index.html index.htm;         }          # poudriere logs         location ~ ^/logs(/(.*))?$ {             include mime.types;             types {                 text/plain log;             }              alias /usr/jails/buildbot-worker0/pdr/data/logs/bulk$1;             index index.html index.htm;             autoindex on;         }          # poudriere packages         location ~ ^/packages(/(.*))?$ {             alias /usr/jails/buildbot-worker0/pdr/data/packages$1;             index no-index-file-but-required-directive-to-list-dir-contents;             autoindex on;         }          location /buildbot/ {             proxy_pass http://10.0.0.2:8010/;         }          . . .     } } . . . Lưu file cấu hình Nginx. Sau đó, reload dịch vụ Nginx:
- sudo service nginx reload 
 
Bây giờ ta hãy kiểm tra các đồ tạo tác được tạo bởi bản dựng thủ công đầu tiên. Mở trình duyệt web bạn muốn trên máy local của bạn để truy cập các tài nguyên.
  Repository  bên dưới http s :// your-domain /packages/ (hoặc http:// your-server-ip / ). Bạn sẽ tìm thấy thông tin meta trong folder  root , ví dụ: 112amd64-2019Q2 và tất cả các gói được xây dựng trong folder  con All : 
 Bạn có thể tìm thấy nhật ký xây dựng chi tiết và giao diện web tích hợp của Poudriere bên dưới http s :// your-domain /logs/ . Nhấp qua hệ thống phân cấp folder  để truy cập dữ liệu của bản dựng thủ công trước đó của bạn. Trong ví dụ này, bạn có thể kết thúc trên một URL như http s :// your-domain /logs/112amd64-2019Q2/latest/build.html . 
 Nếu bạn chưa  cài đặt  domain  cho  server   của bạn , bạn  cần  nhập địa chỉ IP công cộng của  server  cho các ví dụ này, ví dụ: http:// your-server-ip /logs/ .
Điều này kết thúc tất cả cài đặt thủ công để có được các bản dựng hoạt động và có khả năng hiển thị vào kết quả (gói và log ). Trong tương lai, bạn sẽ tự động hóa các bản dựng để đạt được tích hợp liên tục .
Bước 7 - Cài đặt Trình tạo Buildbot cho Gói của bạn
 Mục tiêu của bạn trong bước này là tự động hóa các bản dựng gói hàng loạt bằng cách thực thi Poudriere theo cách bạn đã làm theo cách thủ công — bằng cách thêm vào cấu hình mẫu Buildbot hiện có. Đến cuối bước này, Buildbot sẽ kích hoạt xây dựng gói  khi  nào nhánh đã chọn của cây cổng thay đổi. Trong các ví dụ của hướng dẫn này, đó sẽ là chi nhánh hàng quý 2019Q2 .
Tất cả các thay đổi cần thiết đều được thực hiện trong cấu hình chính Buildbot, vì vậy hãy mở root shell trong master jail:
- sudo jexec buildbot-master csh 
 
Đầu tiên, một người thợ xây phải được định nghĩa mô tả các lệnh và hành động thực hiện để chạy một xây dựng. Trong cấu hình hiện có /var/buildbot-master/master.cfg , bạn sẽ tìm thấy một phần ####### BUILDERS BUILDERS —mở một  editor  và thay thế toàn bộ phần cho đến khi tiêu đề tiếp theo bắt đầu bằng ####### ... , với cấu hình sau:
- ee /var/buildbot-master/master.cfg 
 
. . . ####### BUILDERS  c['builders'] = []  PORTS_TO_BUILD = {     'security/sudo',     'shells/bash',     'sysutils/tmux', }   # Custom classes class PoudriereLogLineObserver(util.LogLineObserver):     _logsRe = re.compile(r'Logs: /pdr/data/logs/bulk(/[-_/0-9A-Za-z]+)$')      def __init__(self):         super().__init__()         self._hadUrls = False      def outLineReceived(self, line):         if not self._hadUrls:             m = self._logsRe.search(line.strip())             if m:                 poudriereUiUrl = f'''{re.sub('/buildbot/$', '', c['buildbotURL'])}/logs{m.group(1)}'''                 self.step.addURL('Poudriere build', poudriereUiUrl)                 self.step.addURL('Poudriere logs', poudriereUiUrl + '/logs/')                 self._hadUrls = True   class PoudriereCompileStep(steps.Compile):     def __init__(self, *args, **kwargs):         super().__init__(*args, **kwargs)         self.addLogObserver('stdio', PoudriereLogLineObserver())   # Poudriere bulk build bulkBuildFactory = util.BuildFactory() bulkBuildFactory.addSteps([     steps.ShellCommand(         name='update ports tree',         command=['sudo', 'poudriere', 'ports', '-u', '-p', '2019Q2', '-v'],         haltOnFailure=True,     ),     PoudriereCompileStep(         name='make bulk',         command=['sudo', 'poudriere', 'bulk', '-j', '112amd64', '-p', '2019Q2'] + list(sorted(PORTS_TO_BUILD)),         haltOnFailure=True,     ), ]) c['builders'].append(util.BuilderConfig(name='bulk-112amd64-2019Q2',                                         workernames=['worker0'],                                         factory=bulkBuildFactory)) . . . Lưu ý cách điều này sử dụng khả năng mở rộng của Buildbot: các lớp tùy chỉnh được sử dụng để quan sát và phân tích thông tin từ  kết quả  log  của Poudriere. Cụ thể, PoudriereLogLineObserver được thêm vào làm “trình quan sát log ”, tức là được gọi  khi  nào một dòng log  mới được in trong quá trình xây dựng. Lớp tìm kiếm các bản ghi cho folder  bản ghi và chuyển đổi nó thành các siêu liên kết. Các liên kết đó sẽ được hiển thị cùng với bước xây dựng và đưa  user  trực tiếp đến giao diện web và log  của Poudriere.
 Trong bước xây dựng đầu tiên “cây cập nhật cổng”,  ta  sử dụng lệnh cập nhật tích hợp của Poudriere ( ports -u ) để kéo version  mới nhất của cây cổng. Điều này sẽ tự động sử dụng phương pháp đã cấu hình trước đó (ví dụ: SVN / Git). Bằng cách này, bạn có thể chắc chắn rằng các gói luôn được xây dựng dựa trên cây  commit  mới nhất, điều này đặc biệt hữu ích nếu bạn có repository  version  của riêng mình, nơi bạn duy trì các version  và bản vá phần mềm.
 Ở trên cùng, danh sách PORTS_TO_BUILD chỉ định cổng nào sẽ được tạo. Nó được sử dụng trong các bước của nhà máy xây dựng được chỉ định ở dưới cùng của khối. Nhà máy xây dựng là một mẫu được sử dụng để khởi tạo một bản dựng. Buildbot tạo một bản dựng duy nhất  khi  nào một bản được kích hoạt và bản dựng sử dụng bản sao của các bước đã được xác định cho nhà máy xây dựng tại thời điểm đó. Trong trường hợp này,  ta  đã  cấu hình  chính xác hai bước:
-  Cập nhật cây cổng. Vì ví dụ này sử dụng nhánh hàng quý 
2019Q2nên nó sẽ không nhận được các thay đổi thường xuyên (thường chỉ các bản sửa lỗi bảo mật và bản dựng). - Chạy bản dựng hàng loạt bằng cách sử dụng cùng một cây.
 
Để làm cho khối mã đã thêm hoạt động, vui lòng thêm nhập bắt buộc vào đầu file :
# -*- python -*- # ex: set filetype=python:  import re  from buildbot.plugins import * Thư viện re trong Python triển khai các biểu thức chính quy , một tính năng để tìm kiếm hoặc thay thế các phần của một chuỗi — lớp PoudriereLogLineObserver sử dụng nó để tìm kiếm dòng Logs: /pdr/data/logs/... đề cập đến folder  log.
 Các lệnh xây dựng sử dụng sudo để chạy các lệnh nhất định. Điều này là bắt buộc vì Poudriere cần các  quyền  của  user  cấp cao khi chạy một bản dựng — để tạo, quản lý và phá hủy các nhà tù xây dựng — và cả cây cổng do Poudriere quản lý cũng được tạo với  user  root  là chủ sở hữu. Trong hướng dẫn trước,  ta  đã  cấu hình   user  chạy quy trình Buildbot worker với sysrc buildbot_worker_uid=buildbot-worker . Do đó,  ta  muốn cho phép  user  buildbot-worker chạy chính xác các lệnh cần thiết dưới dạng root, chứ không phải các lệnh khác (vì lý do bảo mật). Hãy cài đặt chương trình sudo và cấu hình nó cho phù hợp.
Điều này cần được thực hiện trên nhà tù công nhân, không phải cho user root . Vui lòng thoát khỏi shell nhà tù chính và vào nhà tù công nhân:
- exit 
 
- sudo jexec buildbot-worker0 csh 
 
Cài đặt gói sudo :
- pkg install sudo 
 
Xác nhận cài đặt bằng y và ENTER .
 Trên FreeBSD, gói sudo theo mặc định đọc các file  cấu hình từ /usr/local/etc/sudoers.d/ . Mở  editor  để tạo file  cấu hình mới:
- env EDITOR=ee visudo /usr/local/etc/sudoers.d/buildbot-worker 
 
Việc sử dụng visudo là có chủ đích, vì nó sẽ cảnh báo lỗi cú pháp và cho phép sửa chúng thay vì cấu hình xấu.
 Chỉ định lệnh nào mà  user  buildbot-worker có thể chạy dưới dạng root mà không yêu cầu bất kỳ password  nào:
buildbot-worker ALL=(ALL) NOPASSWD: /usr/local/bin/poudriere bulk * buildbot-worker ALL=(ALL) NOPASSWD: /usr/local/bin/poudriere ports -u * Lưu file và chuyển trở lại ngục chính để có thêm cấu hình yêu cầu của Buildbot master:
- exit 
 
- sudo jexec buildbot-master csh 
 
Bạn vừa đáp ứng các yêu cầu để bản dựng hàng loạt hoạt động. Nhưng như đã đề cập, mỗi bản dựng phải được kích hoạt để chạy. Buildbot sử dụng thuật ngữ lập lịch cho một đối tượng xác định thời điểm một bản dựng được kích hoạt và thông tin bổ sung nào, chẳng hạn như nhánh nào đã được thay đổi. Vui lòng xóa phần hiện có SCHEDULERS khỏi file  cấu hình và đặt nội dung sau sau phần BUILDERS , để mã có thể sử dụng tất cả các tên trình tạo hiện có:
- ee /var/buildbot-master/master.cfg 
 
. . . ####### SCHEDULERS  c['schedulers'] = []  # Forceful scheduler allowed for all builders c['schedulers'].append(schedulers.ForceScheduler(     name='force',     builderNames=[builder.name for builder in c['builders']]))  # Watch ports tree for changes on given branch c['schedulers'].append(schedulers.SingleBranchScheduler(     name='sched-bulk-112amd64-2019Q2',     change_filter=util.ChangeFilter(project='freebsd-ports', branch='branches/2019Q2'),     builderNames=['bulk-112amd64-2019Q2'])) . . . Điều này thay thế cấu hình mẫu để nút lực xuất hiện trên mọi trình tạo. Và quan trọng nhất, nó tạo ra một bộ lập lịch trình theo dõi tất cả các thay đổi liên quan đến project / branch và kích hoạt bản dựng cho mỗi thay đổi. Tuy nhiên, không có sự kiện thay đổi nào như vậy có thể xảy ra — trước tiên bạn phải tạo một nguồn thay đổi . Thông thường, đó là các hệ thống kiểm soát version  như SVN hoặc Git mà trên đó người ta có thể phát hiện các thay đổi trên một nhánh. Buildbot hỗ trợ những cái phổ biến nhất, vì vậy  ta  có thể sử dụng chức năng của nó để thêm repository  cây cổng ngược dòng đã chọn của  ta  làm nguồn. CHANGESOURCES thế hoàn toàn phần CHANGESOURCES bằng cấu hình sau:
. . . ####### CHANGESOURCES  c['change_source'] = []  c['change_source'].append(changes.SVNPoller(     'svn://svn.freebsd.org/ports/',     project='freebsd-ports',     split_file=util.svn.split_file_branches,     svnbin='svnlite',     pollInterval=4 * 3600))  # Example for Git: # c['change_source'].append(changes.GitPoller( #     repourl='https://github.com/AndiDog/freebsd-ports.git', #     project='freebsd-ports', #     branches=['custom'], #     pollInterval=4 * 3600)) . . . Điều này sẽ thăm dò repository SVN bốn giờ một lần trên Buildbot master và bất kỳ thay đổi mới nào (chưa từng thấy trước đây) đều được chuyển tiếp đến các bộ lập lịch phù hợp, từ đó sẽ kích hoạt các bản dựng cuối cùng được gửi để chạy trên một nhân viên Buildbot duy nhất của ta . Cây cổng rất lớn và lúc đầu chạy các trình đánh bóng này sẽ tải toàn bộ lịch sử (đối với Git, chỉ các nhánh được chỉ định), có thể mất vài phút và yêu cầu dung lượng đáng kể (vài gigabyte).
Áp dụng file cấu hình mới bằng cách khởi động lại Buildbot:
- service buildbot restart 
 
Trong ví dụ này, bạn đã sử dụng bộ sưu tập cổng ngược dòng từ svn://svn.freebsd.org/ports/ và các bản dựng được lên lịch  khi  nào nhánh 2019Q2 thay đổi. Như đã ghi nhận trước đây, các chi nhánh theo quý hầu hết hoạt động ổn định và không nhận được bản cập nhật thường xuyên. Vì bạn có thể không muốn đợi một thay đổi như vậy đến trước khi bản dựng được kích hoạt lần đầu tiên, hãy chạy nó một lần bằng tay.
 Mở giao diện web Buildbot của bạn ( http s :// your-domain /buildbot/ ),  chuyển  đến Công trình > Trình xây dựng> số lượng lớn-112amd64-2019Q2 . Nó sẽ không hiển thị bất kỳ bản dựng nào. 
Nhấp vào nút lực lượng ở trên cùng bên phải và sau đó Bắt đầu xây dựng . Điều đó sẽ kích hoạt bản dựng bằng cách sử dụng cài đặt mặc định của nó, tức là lý do, nhánh và các giá trị khác không bị overrides . Bước "cập nhật cây cổng" có thể mất một phút để chạy và cuối cùng bản dựng Poudriere cũng sẽ chạy thành công. Giao diện web sẽ hiển thị quá trình xây dựng thành công.
 Nhấp vào một trong các liên kết (Poudriere xây dựng và các bản ghi Poudriere) sẽ đưa bạn đến Poudriere giao diện web và xây dựng các bản ghi cho cụ thể này xây dựng, tương ứng (như trong Bước 6). Mở rộng bằng cách nhấp vào mũi tên bên cạnh để tạo số lượng lớn và sau đó nhấp vào stdio> xem tất cả… dòng để hiển thị toàn bộ  kết quả  của lệnh poudriere bulk ... .
 Sau khi hoàn thành bản xây dựng đầu tiên, các gói hiện đã có sẵn, như được  cấu hình  trong Nginx ở Bước 6. Đi tới http s :// your-domain /packages/ (hoặc http:// your-server-ip /packages/ ) trong một trình duyệt và nhấp qua  repository  được tạo bởi Poudriere. Bạn có thể tìm thấy các file  gói thực tế ( *.txz ) khi bạn nhập một trong các repository  và  chuyển  đến All/ folder  con. 
Như vậy, các gói có sẵn qua HTTPS (hoặc HTTP nếu bạn quyết định như vậy) và được xây dựng tự động dựa trên các thay đổi của cây cổng, bạn có thể cấu hình một hoặc nhiều server để sử dụng các gói đó.
Bước 8 - Cấu hình khách hàng gói
Trong bước này, bạn cần một server FreeBSD thứ hai và sẽ cài đặt nó để nó có thể tìm nạp và cài đặt các gói được xây dựng trên server CI. Ta sẽ gọi server thứ hai này là máy khách gói .
SSH vào máy khách . Hầu hết các hướng dẫn còn lại trong phần này sẽ được thực hiện trên máy khách :
- ssh package-client 
 
Tạo folder cho các cấu hình repository tùy chỉnh:
- sudo mkdir -p /usr/local/etc/pkg/repos 
 
 Với quyền  là  user  root , hãy mở  editor  để tạo file  /usr/local/etc/pkg/repos/ci.conf và chỉ định cách thức và nơi lấy các gói:
- sudo ee /usr/local/etc/pkg/repos/ci.conf 
 
Trong trường hợp bạn chọn ký gói, hãy sử dụng nội dung này:
ci: {     url: "https://your-domain/packages/112amd64-2019Q2",     signature_type: "pubkey",     pubkey: "/usr/local/etc/pkg/repos/ci.pub",     enabled: yes } Ngoài ra, nếu bạn quyết định không ký gói, hãy tắt kiểm tra chữ ký như sau:
ci: {     url: "https://your-domain/packages/112amd64-2019Q2",     signature_type: "none",     enabled: yes } Lưu ý: Lưu ý này chỉ áp dụng nếu bạn đã làm theo Bước 2 để tạo khóa ký repository . Hãy bỏ qua nó nếu không.
Từ máy local của bạn, tải public key lên client gói:
- scp /tmp/poudriere.pub package-client:/tmp/ci.pub 
 
Sử dụng lại client shell , di chuyển khóa vào vị trí để nó có thể xác minh tính xác thực của các gói:
- sudo mv /tmp/ci.pub /usr/local/etc/pkg/repos/ci.pub 
 
Bạn đã hoàn tất việc cấu hình repository và kích hoạt nó, nhưng khi cài đặt FreeBSD thông thường, repository chính thức “FreeBSD” cũng sẽ được bật. Trộn các gói đã cài đặt từ các nguồn khác nhau là một cách dễ dàng khiến phần mềm production của bạn gặp sự cố tại một số điểm do các version phần mềm không tương thích hoặc các tùy chọn ABI, API hoặc bản dựng khác nhau. Tất cả các gói trên một server lưu trữ phải xuất phát từ cùng một nguồn.
 Cấu hình mặc định của repository  chính thức được lưu trữ trong /etc/pkg/FreeBSD.conf .  File  này thuộc về hệ thống cơ sở và không nên chạm vào. Tuy nhiên, bạn có thể overrides  cài đặt của nó — cụ thể là,  ta  muốn vô hiệu hóa hoàn toàn repository  — bằng cách thêm cờ tương ứng vào file  cấu hình trong /usr/local/etc/pkg/repos , nơi cũng  cấu hình  repository   của bạn . Vui lòng tạo file  mới /usr/local/etc/pkg/repos/FreeBSD.conf bằng  editor  và sử dụng nội dung sau để vô hiệu hóa repository  FreeBSD:
- sudo ee /usr/local/etc/pkg/repos/FreeBSD.conf 
 
FreeBSD: {     enabled: no } Nếu bạn đang sử dụng  server  gói hoàn toàn nguyên sơ, chưa có gói nào được cài đặt và bạn có thể bắt đầu sử dụng ngay  repository  của riêng mình. Tuy nhiên, nếu thậm chí chỉ một gói được cài đặt từ một nguồn khác, bạn nên gỡ cài đặt các gói đó và bắt đầu lại từ đầu bằng nguồn của chính mình. Bản thân trình quản lý gói pkg được cài đặt dưới dạng một gói — để giải quyết vấn đề gà và trứng, hệ thống cơ sở của FreeBSD cung cấp một file  thực thi nhỏ /usr/sbin/pkg , có thể khởi động trình quản lý gói. Đó là,  download  gói pkg và cài đặt nó dưới dạng gói đầu tiên trên hệ thống. Kể từ thời điểm đó, file  thực thi /usr/local/sbin/pkg của gói đó hỗ trợ bạn  với quyền  là trình quản lý gói toàn diện.
 Chạy lệnh sau để bootstrap pkg :
- sudo pkg bootstrap 
 
Trong  kết quả  của pkg bootstrap , bạn sẽ thấy rằng các gói được lấy từ  repository   của bạn  mà  ta  gọi là ci trong file  cấu hình. Nếu bạn đang sử dụng khóa ký gói,  kết quả  cũng sẽ gợi ý về xác minh bảo mật.
OutputThe package management tool is not yet installed on your system. Do you want to fetch and install it now? [y/N]: y Bootstrapping pkg from https://your-domain/packages/112amd64-2019Q2, please wait... Verifying signature with public key /usr/local/etc/pkg/repos/ci.pub... done Installing pkg-1.10.5_5... Extracting pkg-1.10.5_5: 100% Nếu bạn thấy kết quả này thành công, vui lòng chuyển sang khối ghi chú tiếp theo. Tuy nhiên, nếu trình quản lý gói hoặc các gói khác đã được cài đặt từ một nguồn khác và bạn gặp lỗi này:
Outputpkg already bootstrapped at /usr/local/sbin/pkg Sau đó hãy làm theo hướng dẫn trong ghi chú.
Lưu ý - chỉ khi trình quản lý gói đã được khởi động:
 Bạn có thể liệt kê các gói đã cài đặt với pkg info . Trong trường hợp này, bạn nên gỡ cài đặt tất cả chúng bao gồm cả pkg và cài đặt lại sau. Để làm điều đó, trước tiên hãy liệt kê các gói được cài đặt thủ công với pkg query -e "%a==0" "%n" . Hãy nhớ bạn muốn cài đặt lại chúng sau này. Ví dụ: nếu bạn sử dụng một  shell  không phải là một phần của hệ thống cơ sở (ví dụ: bash là một gói bên ngoài),  bạn cần  cài đặt lại nó sau hoặc bạn không thể đăng nhập lại.
 Các lệnh sau sẽ xóa tất cả các gói hiện có và trình quản lý gói, khởi động lại trình quản lý gói từ  repository   của bạn  và đưa ra ví dụ về cài đặt lại các gói mong muốn của bạn chẳng hạn như bash. Mặc dù vậy,  lưu ý  bạn sẽ chỉ có thể cài đặt các gói mà bạn đã xây dựng thông qua CI, tức là được liệt kê trong cấu hình chính Buildbot (biến PORTS_TO_BUILD ).
 Trước tiên, hãy mở  shell  gốc trước khi  gỡ gói cài đặt  sudo , nếu không, bạn có thể không nhận được  quyền  của  user  siêu cấp nữa. Giữ nó mở cho đến khi bạn đã khởi động pkg thông qua quá trình của hướng dẫn và cài đặt lại thành công sudo :
- sudo sh 
 
Gỡ cài đặt tất cả các gói, bao gồm cả pkg :
- pkg delete --all --force 
 
Khởi động trình quản lý gói:
- pkg bootstrap 
 
Xác nhận để khởi động trình quản lý gói bằng cách nhấn y , sau đó nhấn ENTER .
 Trong trường hợp có khả năng bạn  cài đặt   server  gói  của bạn  bằng certificate  Let's Encrypt cho HTTPS, bạn sẽ gặp sự cố gà và trứng trong đó  server  gói của bạn không  tin cậy  nhưng bạn cần cài đặt gói ca_root_nss (chứa root  tin cậy  tổ chức phát hành certificate ) để tin tưởng Let's Encrypt CA và do đó cũng tin tưởng  server  lưu trữ các gói tùy chỉnh của bạn. Vấn đề tương tự sẽ phát sinh nếu bạn sử dụng CA nội bộ (do bạn hoặc công ty của bạn tự ký). Lỗi xác minh certificate  sẽ dẫn đến lỗi  kết quả  như thế này khi khởi động trình quản lý gói:
OutputThe package management tool is not yet installed on your system. Do you want to fetch and install it now? [y/N]: y Bootstrapping pkg from https://example.com/packages/112amd64-2019Q2, please wait... Certificate verification failed for /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 34389740104:error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed:/usr/src/crypto/openssl/ssl/s3_clnt.c:1269: [...] Nếu bạn thấy lỗi này, vui lòng làm theo hướng dẫn trong ghi chú bên dưới. Nếu không, bạn đã sẵn sàng và có thể bỏ qua phần này và tiếp tục sau phần ghi chú.
Lưu ý - chỉ khi sử dụng HTTPS và xác minh certificate không thành công:
 Có một cách giải quyết đơn giản: tin tưởng tính bảo mật của khóa ký gói, do đó khởi động pkg và cài đặt gói ca_root_nss thông qua HTTP không được mã hóa. Vì đây không phải lúc nào cũng là một tùy chọn vì lo ngại về quyền riêng tư, các cổng HTTP bị chặn, v.v.,  ta  nên chọn cách "thực hành tốt nhất" hơn. Kho lưu trữ FreeBSD chính thức cũng được ký bởi Let's Encrypt, vì vậy  ta  không thể đơn giản cài đặt gói ca_root_nss từ đó. Cho dù đó là CA nào, bạn nên  cài đặt  các  ứng dụng client  gói  của bạn  với một bộ HTTPS CA cố định để tin cậy. Bạn có thể đạt được chính xác điều đó trong vài hướng dẫn tiếp theo.  Ta  sẽ giả định điều này là dành cho Let's Encrypt, nhưng các hướng dẫn sẽ hoạt động theo cách tương tự đối với CA tự ký  của bạn  (bạn  cần  có chuỗi certificate  của nó).
 Trong  trình duyệt web , hãy truy cập danh sách certificate  của Let's Encrypt tại https://letsencrypt.org/certificates/ . Đảm bảo rằng trang web được trình duyệt tin cậy.  Download  các certificate  trong Chứng chỉ root > Hoạt động> ISRG Gốc X1 (tự ký) và Chứng chỉ trung gian> Hoạt động> Let's Encrypt Authority X3 (Do ISRG Root X1 ký) ở định dạng PEM thành /tmp/root.pem và /tmp/intermediate.pem trên máy tính local  của bạn, tương ứng.
Sau khi download thành công, hãy nối các file vào một chuỗi certificate :
- cat /tmp/intermediate.pem /tmp/root.pem >/tmp/letsencrypt-chain.pem 
 
- scp /tmp/letsencrypt-chain.pem package-client:/tmp/. 
 
Quay lại  shell  của  ứng dụng client  gói , bây giờ bạn cần chỉ định chuỗi tin cậy này trong cấu hình trình quản lý gói /usr/local/etc/pkg.conf để nó được sử dụng để xác minh TLS. Thêm các dòng này bằng  editor  và tạo file  nếu file  chưa tồn tại:
- sudo ee /usr/local/etc/pkg.conf 
 
pkg_env: {     SSL_CA_CERT_FILE: "/usr/local/etc/pkg/repos/letsencrypt-chain.pem", } Di chuyển chuỗi CA vào vị trí:
- sudo mv /tmp/letsencrypt-chain.pem /usr/local/etc/pkg/repos/. 
 
Nếu bạn vẫn ở trong  shell  root  cho đến bây giờ vì gói sudo đã bị gỡ bỏ, lệnh này phải được chạy mà không có sudo . Điều tương tự cũng áp dụng cho lệnh tiếp theo trong ghi chú này.
 Với cài đặt này, bạn có thể thử khởi động lại    và sẽ không gặp thêm lỗi TLS nào nữa. Có một vấn đề nhỏ: FreeBSD tích hợp /usr/sbin/pkg , khởi động trình quản lý gói đầy đủ, không tuân theo cài đặt pkg_env  cấu hình , vì vậy  ta  phải overrides  biến môi trường tương ứng cho lần này duy nhất, bằng cách sử dụng cùng giá trị như đã  cấu hình :
- sudo env SSL_CA_CERT_FILE=/usr/local/etc/pkg/repos/letsencrypt-chain.pem pkg bootstrap 
 
Nếu trước đây bạn đã xóa các gói hiện có, thì đây là thời điểm tốt để cài đặt lại các công cụ thiết yếu ngay bây giờ (ví dụ: sudo), cùng với bất kỳ gói mong muốn nào khác.
- pkg install bash sudo 
 
Và thả ra khỏi shell root , nếu điều đó vẫn xảy ra:
- exit 
 
Để kiểm tra xem mọi thứ có hoạt động hay không, hãy cài đặt các gói từ danh sách được chỉ định trong cấu hình chính Buildbot (biến PORTS_TO_BUILD ). Ví dụ, Bash shell và sudo:
- sudo pkg install bash sudo tmux 
 
  , xác nhận cài đặt bằng cách nhấn y và sau đó ENTER . Cài đặt gói sẽ chạy qua mà không có bất kỳ vấn đề nào.
 Bạn có thể sử dụng pkg info để liệt kê các gói hiện đang được cài đặt (bao gồm cả các gói phụ thuộc, nếu có). Để  xác minh  không có gói nào từ các nguồn khác được cài đặt, có thể gây ra xung đột hoặc không tương thích, bạn có thể liệt kê các gói đã cài đặt với các chi tiết này bằng cách sử dụng pkg query "%n: autoinstalled=%a from repo=%R" .  Lưu ý  pkg sẽ được hiển thị dưới dạng bootstrapped từ unknown-repository — đây là lý do tại sao trước đây, bạn đã xác minh  kết quả  bootstrapping để thấy rằng bản thân trình quản lý gói cũng được lấy từ  repository   của bạn .
 Trong bước cuối cùng này, bạn đã  cấu hình  quyền truy cập vào  repository  của CI trên client , tùy chọn kích hoạt xác minh chữ ký gói cho các mục đích bảo mật,  đảm bảo  các gói chỉ đến từ một nguồn duy nhất để tránh các vấn đề tương thích, khởi động trình quản lý gói pkg và cài đặt mong muốn của bạn các gói do CI xây dựng.
Kết luận
Trong hướng dẫn này, bạn đã cài đặt và cấu hình Poudriere, các bản dựng gói đang chạy tự động và cấu hình quyền truy cập an toàn vào repository từ một client , kết thúc bằng các gói được xây dựng mới nhất được cài đặt từ một nguồn trung tâm. Việc cài đặt đặt bạn vào một vị trí tuyệt vời để giữ cho server của bạn nhất quán và cập nhật cũng như quản lý các nâng cấp version của các gói phần mềm bên ngoài.
Để nâng cao hơn nữa cài đặt hiện tại của bạn, bạn có thể xem xét chọn các bước tiếp theo:
- Chỉ truy cập riêng tư : Theo mặc định, Server có địa chỉ IP công khai trên internet. Ngoài ra, Buildbot hỗ trợ xác thực nhưng không được bảo vệ theo mặc định.
 - Cảnh báo về sự cố xây dựng : Xem cách cài đặt báo cáo Buildbot để bắt đầu.
 - Luôn cập nhật cây cổng : Trong các ví dụ từ hướng dẫn, nhánh hàng quý 2019Q2 đã được sử dụng, nhưng cuối cùng bạn nên chuyển sang cây mới hơn hoặc sử dụng repository do version kiểm soát của bạn để áp dụng các bản vá mong muốn.
 - Thêm bản dựng cho các dự án riêng : Sổ tay FreeBSD Porter giải thích cách viết công thức xây dựng (một cổng ) nếu bạn muốn xây dựng và cài đặt phần mềm nội bộ của bạn dưới dạng gói FreeBSD.
 -  Theo dõi các gói đã lỗi thời trên client  : Bạn có thể so sánh các gói đã cài đặt trên client  với các gói mới nhất hiện có trên CI bằng cách sử dụng  kết quả  của 
sudo pkg update -q && sudo pkg version -q --not-like "="để in tất cả các gói có version không khớp chính xác. Xem trang chủ của version pkg để biết thêm chi tiết. -  Thêm công việc dọn dẹp : Theo thời gian, ngục tù Buildbot sẽ chạy đầy các file  log  bản dựng cũ, tarball nguồn và các gói có thể không dùng nữa. Sử dụng các lệnh 
poudriere {logclean,distclean,pkgclean}để dọn dẹp (xem manpage của poudriere ). 
Các tin liên quan

