Thứ sáu, 20/09/2019 | 00:00 GMT+7

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ó:

Output
NAME 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
/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
/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ủa LOIP4 để 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ạn build . 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ến ALLOW_NETWORKING_PACKAGES như 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ạn fetch mà Poudriere cho phép truy cập internet.
  • allow.chflags cho phép Poudriere hiển thị các file hệ thống nhất định như /bin/sh không thể thay đổi trong bản dựng.
  • allow.mount và các tùy chọn allow.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_sockets cho phép sử dụng các socket thô và allow.socket_af cho 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.sysvipc không được dùng nữa vì có ba cài đặt riêng biệt sysvmsg / 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ền allow.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=16 cho 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ủa sysctl -n hw.ncpu ) làm số lượng công việc.
  • enforce_statfs=1 là bắt buộc cùng với allow.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:

/usr/local/etc/poudriere.conf (đoạn trích)
. . . # 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:

/usr/local/etc/poudriere.conf (đoạn trích)
. . . # 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:

/usr/local/etc/poudriere.conf (đoạn trích)
. . . # 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:

/usr/local/etc/poudriere.conf (đoạn trích)
. . . # 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à:

/usr/local/etc/poudriere.conf (đoạn trích)
. . . # 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
/usr/local/etc/poudriere.conf (đoạn trích)
. . . # 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):

/usr/local/etc/poudriere.conf (đoạn trích)
. . . # 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
/usr/local/etc/poudriere.conf (đoạn trích)
. . . # 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:

/usr/local/etc/poudriere.conf (đoạn trích)
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ư:

Output
PORTSTREE 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 update thông thường và lệnh pkg 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:

/usr/local/etc/nginx/nginx.conf
. . . 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 :

Danh sách  repository

Bạn có thể tìm thấy nhật ký xây dựng chi tiếtgiao 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 .

Giao diện web Poudriere

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
/var/buildbot-master/master.cfg (đoạn mã)
. . . ####### 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ý 2019Q2 nê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 :

/var/buildbot-master/master.cfg (đoạn mã)
# -*- 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 yENTER .

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:

/usr/local/etc/sudoers.d/buildbot-worker
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
/var/buildbot-master/master.cfg (đoạn mã)
. . . ####### 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:

/var/buildbot-master/master.cfg (đoạn mã)
. . . ####### 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.

Trang trình tạo hàng loạt - chưa có 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.

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ựngcá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.

Danh sách  repository

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:

/usr/local/etc/pkg/repos/ci.conf
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:

/usr/local/etc/pkg/repos/ci.conf
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
/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.

Output
The 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:

Output
pkg 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:

Output
The 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ý)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/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
/usr/local/etc/pkg.conf (đoạn mã)
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 ).

Tags:

Các tin liên quan