著者はhttps://www.brightfunds.org/funds/foss-nonprofits [無料およびオープンソース基金]を選択して、https://do.co/w4do-cta [Donationsのために書く]の一部として寄付を受け取りましたプログラム。

前書き

FreeBSDのポートとパッケージのコレクション(以降_ports tree_と呼ばれる)は、外部ソフトウェア用のFreeBSDのビルドシステムです。 Makefileベースの一貫したパッケージ構築方法を提供します。 _port_は、ビルドレシピ、つまりMakefileと関連ファイルを指します。 _package_は、1つのポートをパッケージファイルとそのメタ情報のバイナリ(圧縮)アーカイブに構築する出力です。

`+ make install +`を使用して、30,000以上のポートのサブセットまたはすべてを手動で構築およびインストールできます。 ただし、ビルドはクリーンな環境ではなく、サーバーの1つで実行されます。 本番ユースケースの場合、手動ビルドは、各ホストが同じリビジョンのポートツリーを必要とし、すべてのパッケージを自分用にコンパイルする必要があることも意味します。 これは、人間とサーバーによる繰り返しエラーが発生しやすい作業を意味します。 各ホストで同一のビルド済みバイナリパッケージを取得して使用し、中央の安全なパッケージリポジトリから提供することをお勧めします。

これを実現するために、https://github.com/freebsd/poudriere/wiki [Poudriere]は、パッケージのビルド、テスト、監査、およびパッケージリポジトリの保守を行うFreeBSDの標準ツールです。 各ビルドは、新しいhttps://www.digitalocean.com/community/tutorials/how-to-install-buildbot-freebsd#step-1-%E2%80%93-setting-up-jails-forで分離して実行されます-the-buildbot-master-and-worker [jail]、目的のバージョンのFreeBSDを実行し、パッケージがインストールされていない状態で起動します。 クリーンビルドでは、ベースシステムと明示的に指定された依存関係のみを使用できます。 Poudriereは、必要に応じてパッケージを再構築し、ビルドの完了後にパッケージリポジトリを更新します。 `+ poudriere +`コマンドラインツールは、さまざまなポートツリー、FreeBSDバージョン、ポートビルドオプションの管理、そして最後にビルドの実行の中心です。

このチュートリアルでは、Poudriereを構成し、必要なパッケージのセットを構築し、HTTPベースのパッケージホスティングをセットアップし、継続的な統合プラットフォームとしてhttps://buildbot.net/[Buildbot]を使用してビルドを自動化します。 最後に、クライアントマシンからパッケージに安全にアクセスします。

前提条件

このガイドを始める前に、次のものが必要です。

  • FreeBSD 11.2を実行しているサーバー。 FreeBSDを初めて使用する場合は、https://www.digitalocean.com/community/tutorials/how-to-get-started-with-freebsdのガイドに従ってこのサーバーをカスタマイズすると役立つ場合があります[ FreeBSDの使用を開始する方法]。
    *注意:*現在、FreeBSD 12.0にはhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id=231773 [ネストされたjailの問題]があり、これは12.xを使用する前に最初に修正する必要がありますチュートリアル。

  • パッケージとログを保存するのに十分な容量を確保するには、10 GB以上の空きディスク容量。

  • FreeBSDでBuildbotをセットアップする方法チュートリアルを完了することによる基本的なBuildbotのセットアップ。

  • 同じバージョンのFreeBSDを実行している別のサーバー。クライアントとして使用して、HTTP / HTTPSベースのパッケージリポジトリで自動的にビルドおよびホストするパッケージを取得およびインストールします。

手順1-Buildbot Workerで使用するPoudriereのインストール

前提条件のチュートリアルを完了すると、ビルドボットのマスターとワーカーの刑務所とNginxのセットアップが機能するようになります。 次の手順で、この既存のセットアップに基づいて構築します。 この最初のステップでは、ビルドツールのPoudriereをワーカー刑務所内にインストールします。ビルドボットワーカープロセスがビルドを後でトリガーする場所だからです。

Buildbotをホストしているサーバーに接続し、次のコマンドを使用してワーカーjailで* root *シェルを開きます。

sudo jexec buildbot-worker0 csh

Poudriereをパッケージとしてインストールします。

pkg install poudriere

次に、「+ y 」を押してから「 ENTER +」を押してインストールを確認します。

最新のPoudriereツールと依存関係が正常にインストールされました。 次のいくつかの手順では、Poudriereを構成するための準備を行います。

手順2-パッケージ署名キーの作成(オプション)

セキュリティを強化するために、ビルドされたパッケージにデジタル署名を設定することをお勧めします。 インストールを後で、または別の方法で保護する場合は、この手順をスキップします。 それ以外の場合は、パッケージに署名するために使用するキーペアを作成し(秘密キーを使用)、パッケージを検証します(パブリックパーツを使用)。

デフォルトでは、パッケージは + .txz +`ファイルとしてビルドされます。これは、パッケージの内容を強く圧縮したtarballです。 圧縮ファイルのチェックサムは、HTTP / HTTPS(TCPチェックサム)を介してファイルを提供するとともに、破損データに対する保護をすでに提供しています。 パッケージの内容は通常、ファイルとディレクトリに加えて、パッケージ名、バージョン、その他のオプションなどのメタ情報で構成されます。 ファイルにはhttps://en.wikipedia.org/wiki/Setuid#Security[+setuid+`-able Programs]( `+ sudo +`パッケージで見られるように、_sudo_はFreeBSDには組み込まれていません)を含めることもできます。インストール時スクリプトは* root *ユーザーとして実行されます。 したがって、未検証のソースからインストールすると、セキュリティ上のリスクが生じます。

HTTPS経由でパッケージを提供することにより、誰かがディスク上のパッケージを改ざんしたかどうかを検出できません。 パッケージの整合性と信頼性は、RSA秘密キーでパッケージリポジトリに署名するようにPoudriereを構成することで追加できます。 署名されたダイジェストと対応する公開キーは、パッケージリポジトリの `+ digests.txz +`ファイルに保存されます。 必要なキーペア(RSA秘密キーと公開キー)は、秘密キーが紛失または侵害されない限り、長期間変更されないようにすることができます。

この手順では、ビルドが実行されるキーペア(作業員の刑務所)を作成し、パッケージクライアントで後で使用するために公開部分をダウンロードします(後の手順で説明します)。

まだワーカーjail * root *シェルにいることを確認してください。

新しいRSA秘密鍵を作成します。

openssl genrsa -out /usr/local/etc/poudriere.key 4096

秘密鍵ファイルは、* root * -Poudriereを実行するユーザーのみがアクセスできる必要があります。 アクセス許可を保護します。

chmod 0600 /usr/local/etc/poudriere.key

後で、パッケージの署名を検証するためにクライアントで利用可能な公開キー部分が必要になります。 ここで公開鍵を抽出しましょう。

openssl rsa -in /usr/local/etc/poudriere.key -pubout -out /tmp/poudriere.pub

最後に、自分のコンピューターから公開鍵ファイルをダウンロードします。

scp :/usr/jails/buildbot-worker0/tmp/poudriere.pub /tmp/poudriere.pub

これで、パッケージ署名用のキーペアのオプションの作成が完了します。 後でPoudriereを使用して実際の署名を構成し、クライアントでダウンロードした公開鍵ファイルを使用して検証します。

別のオプションのステップが続きます。ZFSファイルシステムを使用する場合、Poudriereはそれを利用してビルドを高速化できます。 それ以外の場合は、https://www.digitalocean.com/community/tutorials/how-to-build-and-deploy-packages-for-your-freebsd-servers-using-buildbot-and-poudriere#step-にスキップできます。 4-%E2%80%94-configuring-poudriere、-the-build-jail、-and-the-ports-tree [Step 4]は、最初のビルドを実行する準備をするためにPoudriereを構成します。

手順3-ZFSのセットアップ(オプション)

このステップは、https://en.wikipedia.org/wiki/ZFS [ZFS filesystem]の上でFreeBSDシステムを実行する場合にのみ適用されます。 たとえば、DigitalOcean Dropletを使用している場合、画像には* x64 zfs *(FreeBSD用)というラベルが付けられます。 このステップでは、刑務所の作成と管理を高速化するためにPoudriereが使用できるファイルシステムを作成し、ビルドを高速化する可能性があります。

プールを一覧表示すると、ZFSを使用しているかどうかを確認できます。 刑務所内ではなく、サーバーのシェル上にいることを確認してください。

exit

次のコマンドを実行して、zpoolをリストします。

sudo zpool list

プールが利用可能な場合、それに関する情報を出力します:

OutputNAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot   148G  94.4G  54.1G        -         -    66%    63%  1.00x  ONLINE  -

それ以外の場合、ZFSサポートが利用できない場合、ツールは「+ no pools available 」、または「 failed to initialize ZFS library +」を出力します。 これは、どのシステムもZFSを使用していないことを意味します。この場合、次の手順にスキップします。 UFSファイルシステムなど、別のディスクまたはストレージタイプを使用することにした場合は、次の手順に進むこともできます。

ZFSを使用する予定がある場合は、ビルド関連データを保存する印刷されたプール名を覚えておいてください。 数ギガバイトのストレージを計画する必要があります。

ZFSは、ビルド刑務所、ポートツリー、ログ、パッケージ、その他のデータなど、Poudriereのさまざまなデータセットを分離するのに役立ちます。 これらは独立して保存され、その結果、空きスペースや痕跡を残さないという確実性を持って、迅速に削除できます。

PoudriereがZFSを使用するには、3つのことを行う必要があります。親ZFSデータセットを作成し、ZFSデータセットの作成と削除を許可します(Buildbotワーカーjailまたは他のjailはデフォルトでは実行できません)。それに応じてPoudriereの構成。

前提条件のチュートリアルでは、 `+ / etc / jail.buildbot-worker0.conf `でBuildbotワーカーjailを設定しました。 任意のテキストエディタでこのファイルを開き、次の強調表示された行を追加して親データセットを委任し、刑務所が親の下のZFSデータセットを管理できるようにします。 ` zroot +`を目的のプール名に置き換えてください:

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;


}

この記事では、ビルド関連のデータをZFSプールの「+ zroot +」に保存します。別の名前のプールを選択した場合は、このZFS関連の構成をここおよび記事の残りの部分で調整してください。

このコンテンツを追加したら、エディターを保存して終了します。 `+ ee `を使用している場合は、 ` CTRL + C `を押し、 ` exit `を入力して、 ` ENTER +`を押します。

構成ファイルに記載されている親ZFSデータセットを作成します。

sudo zfs create zroot/pdr
sudo zfs create zroot/pdr/w0

これは、将来さらにワーカーを追加する可能性があることを意図的に想定しているため、最初のワーカーのサブデータセットを作成します。 FreeBSDの古いバージョン(12.0より前)は88文字のマウント名制限があるため、データセット名は意図的に短くなっています。

刑務所が親データセットを制御し、子を管理するには、データセットに次のフラグを付ける必要があります。

sudo zfs set jailed=on zroot/pdr/w0

前提条件が満たされると、jailは新しい構成で正しく開始されます。

sudo service jail restart buildbot-worker0

これらの手順により、必要なファイルシステム(ZFSデータセット)が正常に作成され、刑務所が親データセットを管理できるようになりました。 次のステップでは、Poudriereを構成します。これには、ビルド関連データの保存に使用する選択されたzpoolとデータセットの指定が含まれます。

手順4-Poudriere、Build Jail、およびPorts Treeの構成

ここまで、Poudriereをインストールし、オプションでパッケージ署名とZFSの要件をカバーしました。 Poudriereを「jail化」された方法で実行できるようにするには、つまり、Buildbotワーカーjail内から正しく機能するには、jailに特定のアクセス許可を与える必要があります。 たとえば、ZFSを使用する場合は、刑務所による使用と管理のために親データセットを既に委任しています。

最初にループバックIPとすべてのアクセス許可を構成してから、変更に続いてそれぞれの意味をステップ実行します。

Poudriereは、ビルドごとに2つのビルド刑務所を開始したいと考えています。1つはループバックのみのネットワークで、もう1つはインターネットアクセスです。 インターネットに到達することになっているビルドステージのみが後者を使用します。 たとえば、「+ fetch 」はソースtarballをダウンロードできますが、「 build 」フェーズではインターネットアクセスが許可されません。 ワーカーjailの既存の設定には、インターネットアクセスを許可する ` ip4.addr =” lo1 | 10.0.0.3/24 “`があります。 Poudriereがループバックアドレスを新たに開始されたビルド刑務所に割り当てることができるようにするには、IPをその親(ワーカー刑務所)に渡す必要もあります。 これが機能するためには、前提条件のチュートリアルのファイアウォール設定ファイルの最新バージョン「 / usr / local / etc / ipfw.rules +」を適用していることを確認してください。 NAT経由。

強調表示された行をワーカーjail構成に追加します。

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;

   # 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";













}

ここに次を追加しました(https://www.freebsd.org/cgi/man.cgi?jail(8)[jail(8)manpage]も参照してください):

  • `+ ip4.addr + =” lo0 | 127.0.0.3 “`は、別のIPv4アドレスを刑務所に追加します。 後でPoudriereの ` LOIP4 `変数を設定して、このループバックアドレスを割り当てて、 ` build `フェーズなどでインターネットやネットワーク内の他のマシンと通信しないはずの刑務所を構築します。 ビルド中にインターネットアクセスが必要なビルドがある場合、Poudriereは回避策として変数 ` ALLOW_NETWORKING_PACKAGES `をサポートします。 ただし、Poudriereがインターネットアクセスを許可している「 fetch +」フェーズでは、ベストプラクティスに従って、ダウンロードやその他のインターネット向けタスクを早期に実行することが望ましいです。

  • `+ allow.chflags `を使用すると、Poudriereは ` / bin / sh +`のような特定のシステムファイルをビルドjailで不変にできます。

  • `+ allow.mount `および他の ` allow.mount。* +`オプションにより、Poudriereは特定の必要なファイルシステムをビルドjailにマウントできます。

  • 生のソケットの使用を許可する「+ allow.raw_sockets 」、および任意のソケットアドレスファミリの使用を許可する「 allow.socket_af 」は、両方ともインターネット対応のビルド刑務所に適用されます。 これは、ビルド刑務所に入って問題をデバッグするときなど、対話モードで ` ping +`のようなツールを実行できるようにするのに役立ちます。

  • 「+ allow.sysvipc 」は廃止され、3つの個別の設定「 sysvmsg + / + sysvsem + / + sysvshm + `が採用され、jailが(「SYS V」IPCプリミティブを介して)共有メモリオブジェクトのみを参照できるように制限されます。 しかし、Poudriereは3つ​​の個別のパラメーター(FreeBSD 11.2の時点)に関連するsysctl情報を読み取ることができないため、jailをビルドするために `+ allow.sysvipc +`のみを渡すことができます。 この非推奨の構成では、jailはjailの外部のプロセスの共有メモリを読み取ることができます。 これは、PostgreSQLなどのIPC機能に依存する特定のソフトウェアにのみ関連するため、セキュリティに影響を及ぼす可能性はわずかです。 ビルド中に必要なポートに依存しない限り、この構成を削除できます。

  • `+ children.max = 16 `は、ワーカーの刑務所の下に16のサブ刑務所を許可します。 多数のCPUがあり、Poudriereが許可されているよりも多くのビルドjailを作成しようとする場合、この数値を後で上げることができます。 各Poudriereビルドは、「ジョブ」ごとに参照jailと2つのビルドjailを作成しようとします。デフォルトでは、CPUの数( ` sysctl -n hw.ncpu +`の出力として)をジョブカウントとして使用します。

  • 特定のファイルシステムをマウントするには、「+ enforce_statfs = 1 」と「 allow.mount +」が必要です。

構成ファイルを保存して終了します。

構成をすぐに有効にするために、jailを再起動します。

sudo service jail restart buildbot-worker0

Poudriereがマウントを実行できるように、それぞれのカーネルモジュールをロードする必要があります。 次のコマンドを実行して、ブート時にモジュールをすぐにロードします。

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

サンプルファイル `+ / usr / local / etc / poudriere.conf.sample `を ` / usr / local / etc / poudriere.conf +`にコピーした、以前にPoudriereパッケージをインストールしました。 次に、構成ファイルを編集します。 可能なすべての構成変数は既にサンプルに存在するため、ファイル内の各行のコメントを解除するか適応させて、変数を特定の値に設定します。

次のコマンドについては、ワーカーjailの* root *シェルにいることを確認してください。

sudo jexec buildbot-worker0 csh

次のコマンドでファイルを開きます。

ee /usr/local/etc/poudriere.conf

ZFSを使用することに決めた場合は、目的のzpoolと親データセットを入力してください。

/usr/local/etc/poudriere.conf(スニペット)

. . .
# 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.
#


### NO ZFS
# To not use ZFS, define NO_ZFS=yes


# root of the poudriere zfs filesystem, by default /poudriere

. . .

それ以外の場合、ZFSを使用しないことに決めた場合は、ZFSサポートを無効にしてください。

/usr/local/etc/poudriere.conf(スニペット)

. . .
# 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


# root of the poudriere zfs filesystem, by default /poudriere
# ZROOTFS=/poudriere
. . .

後でPoudriereにFreeBSDベースシステムをダウンロードして、最初のビルドjailをブートストラップするように指示します。 これには、ダウンロードホストを指定する必要があります。次の強調表示された行を追加します。

/usr/local/etc/poudriere.conf(スニペット)

. . .
# 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

Poudriereは投獄されるので、jailのフルパス `+ / usr / jails / buildbot-worker0 `は各マウントパスの一部であるため、12.0より前のFreeBSDバージョンの88文字というマウント名の制限は特に有害です。 制限を超えるとビルドが致命的に破損するため、パスの長さを短くするように注意してください。 典型的なディレクトリ ` / usr / local / poudriere `の代わりに、次のように ` / pdr +`を使用できます。

/usr/local/etc/poudriere.conf(スニペット)

. . .
# The directory where poudriere will store jails and ports

次に、そのディレクトリを作成します。

mkdir /pdr

`+ poudriere.conf +`のエディターに再び切り替えます。

ee /usr/local/etc/poudriere.conf

Poudriereは、すべてのビルダーが同じキャッシュを共有するように、ビルドの実行中に_distファイル_(各ポートのソースコードtarball)の中央ディレクトリをマウントします。 デフォルトのディレクトリは次のとおりです。

/usr/local/etc/poudriere.conf(スニペット)

. . .
# 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.

次に、そのディレクトリを作成します。

mkdir -p /usr/ports/distfiles

ステップ2に従ってパッケージリポジトリ署名キーを作成した場合は、エディターを再度入力して指定してください。

ee /usr/local/etc/poudriere.conf

/usr/local/etc/poudriere.conf(スニペット)

. . .
# Path to the RSA key to sign the PKG repo with. See pkg-repo(8)

次回にC / C ++コンパイラとリンカの出力をキャッシュすると、ビルドははるかに高速に実行されます。 ポートツリーは、ツールhttps://ccache.dev/[ccache]を活用してこれを直接サポートします。 少なくとも5GB以上のスペース(デフォルトのキャッシュサイズ)を確保できる場合は、有効にして、それぞれのキャッシュディレクトリを作成してください。

/usr/local/etc/poudriere.conf(スニペット)

. . .
# 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.
mkdir /var/cache/ccache

Linuxソフトウェアのビルドと実行は一般的ではないため、必要になるまで無効にしてください。

ee /usr/local/etc/poudriere.conf

/usr/local/etc/poudriere.conf(スニペット)

. . .
# Disable linux support

刑務所にはループバックアドレスが割り当てられている必要があります。そうでない場合、Poudriereはそれについて警告します。 ループバック専用のネットワークインターフェース( + lo1 +)上にあるため、jailのIPを継承できます。 このため、構成ファイルの最後に次の行を追加してください。

/usr/local/etc/poudriere.conf(スニペット)

構成ファイルを保存して終了します。

ビルドを実行するには、さらに2つのリソースが必要です。ビルドjailテンプレートとして使用するFreeBSDベースシステムと、最新のポートツリーです。 対象のFreeBSDバージョンを選択します。 このチュートリアルでは、アーキテクチャ用にFreeBSDをダウンロードするようにPoudriereに指示します。 ジェイルには好きな名前を付けることができますが、 `+ 112amd64 `のような一貫した命名スキームをお勧めします。 また、四半期ごとの安定したポートツリーブランチ(ここでは、「 2019Q2 +」を使用)と、更新後にビルドが時々壊れる可能性のある最先端の「ヘッド」ブランチを選択することにも留意してください。 サーバー上のバージョンよりも新しいFreeBSDバージョンは、ビルド刑務所では使用できません。

ビルド刑務所をダウンロードして作成します。

poudriere jail -c -j  -v  -a

最後に、ポートツリーをダウンロードしましょう。 デフォルトのダウンロード方法はhttps://www.freebsd.org/cgi/man.cgi?portsnap(8)[portsnap]で、履歴情報なしでツリーの圧縮スナップショットを使用します。 アップストリームの変更をマージしたり、貢献したりするには、SubversionまたはGitのいずれかをお勧めします。 これは、バージョン管理システムでカスタムの自己ホスト型ツリーを使用する場合にも重要です。 次のコマンドで、現在の年と四半期を入力してください。

アップストリームの公式ポートツリーから始めたい場合:

poudriere ports -c -p  -m  -B

メソッド `+ svn + https +`は、FreeBSD Subversionホスト(https://svnweb.freebsd.org/ports/ [こちらからオンラインで表示可能])から同期します。 代替ソースを使用する予定がある場合は、次のメモを読んでください。それ以外の場合はスキップしてください。

利用可能なツリーは `+ poudriere ports -l +`で一覧表示でき、次のような一覧を出力します:

OutputPORTSTREE METHOD    TIMESTAMP           PATH
2019Q2    svn+https 2019-04-20 19:23:19 /pdr/ports/2019Q2

これで、Poudriereの構成とリソースのセットアップが完了しました。 最初のビルドをトリガーするために必要なデータでPoudriereを構成し、刑務所がサブ刑務所を作成できるようにしました。 次に、最初のビルドを手動で実行して、セットアップが機能していることを確認します。

ステップ5-手動テストビルドの実行

コマンド `+ poudriere bulk `を使用して、1つ以上のパッケージとそのすべての依存関係を構築できます。 パッケージの最初のビルド後、Poudriereは、再構築が必要かどうかを自動的に検出するか、既存のパッケージファイルをそのまま残します。 ` bulk `サブコマンドはパッケージのみをビルドしますが、 ` poudriere testport +`を使用してビルドを実行すると、ポートのMakefileで指定された「testing」の定義を使用して指定されたポートもテストします。 この記事の範囲では、クライアントへのインストール用パッケージの提供にのみ関心があるため、バルクビルドを使用しています。

Poudriereをインストールしたワーカー刑務所のルートシェルにいることを確認してください。 後で、Buildbotワーカープロセスがビルドを自動的に実行する場所にもなります。

ビルドを実行し、先ほど選択したビルドjail名とポートツリー名をプレースホルダーに入力します。

poudriere bulk -j  -p  ports-mgmt/pkg

これにより、ポート `+ ports-mgmt / pkg `が構築されます。 公式ツリーのポートは ` <category> / <name> +`階層に格納され、それらのパス(_package origin_と呼ばれる)はどのパッケージをビルドする必要があるかをPoudriereに伝えるために使用されます。 最初に、パッケージマネージャー_pkg_のみをビルドすることを選択しました。これは、サードパーティの依存関係がないため、構成をすばやく簡単に確認できます。 すべてが正常に実行されると、次のような出力が表示されます。

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:
/etc/resolv.conf -> /pdr/data/.m/112amd64-2019Q2/ref/etc/resolv.conf
[00:00:06] Starting jail 112amd64-2019Q2
[00:00:07] Logs:
[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:
[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:]   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

この出力は、ビルド後にパッケージが移動する場所と、リビルドする必要がない場合に既存のパッケージを取得する場所を示しています(ここでは、「+ / pdr / data / packages / 112amd64-2019Q2 」)。 また、出力にはPoudriereの実行中に実行中のビルドの概要が表示されます(インタラクティブシェルで「 CTRL + T 」を押して進行状況を印刷できます)。 最終概要では、1つのパッケージが作成されたことがわかります。 ログディレクトリ( ` / pdr / data / logs / bulk / 112amd64-2019Q2 / * +`)で詳細なビルド出力を表示できます。

この出力は、ビルドが成功したことを確認します。 Poudriereが少なくとも1つのパッケージを正常にビルドした場合、パッケージリポジトリに自動的にコミットします。 これは、他のパッケージがビルドに失敗した場合でも、すべてのビルドが完了した後にのみパッケージが利用できることを意味します。 Buildbot worker刑務所内の `+ / pdr / data / packages / 112amd64-2019Q2 +`に作業パッケージリポジトリがあります。

作業中のPoudriereビルドを返すために必要なすべての構成が完了し、手動ビルドで正常に検証されました。 Buildbotで一括ビルドを自動化すると、この同じ出力がチュートリアルの後半で表示されます。 さらに、詳細なログを表示するリンクには、Webインターフェイスからアクセスできます。 これを実現し、パッケージリポジトリをクライアントに提供するには、次にWebサーバーをセットアップします。

手順6-Poudriere Webインターフェイスとパッケージリポジトリを提供するためのNginxの構成

Poudriereは、Webサーバーを使用してホストするいくつかの出力アーティファクトを提供します。

  • *パッケージリポジトリ*は、HTTPSまたはHTTPをトランスポートとして使用して、通常の `+ pkg update `および ` pkg install +`コマンドでクライアントにアクセスできるように、クライアントが利用できるようになります。

  • *詳細なビルドログ*は、開発者が問題のあるビルドをデバッグしたり、ビルド出力を調査したりするのに役立ちます。 それらはパッケージごと、およびビルドごとに最後のステップからのPoudriere出力に保存され、ログはビルドごとに1つのディレクトリに保存され、日付と時刻のラベルが付けられていることがわかりました。

  • * Poudriereの組み込みウェブインターフェース*は、WebSocketを使用してページに表示されるステータスを定期的に更新する、ビルドごとの小さな単一のHTMLページです。 これは、ビルドがどれだけ遠くにあるか、どの依存関係が他のパッケージビルドの失敗を引き起こしたか、最後にコマンドライン出力の代わりとして、より明確に概要を把握するのに役立ちます。現在のビルドの進行状況。

Nginxの構成の変更は短く、静的ファイルのみを提供する必要があります。 それらを外部の世界に提供するので、今度はサーバーの既存のNginxインスタンスをjailの外側に設定して、前述のファイルをワーカーjail内のパスから提供します。

サーバーで作業するため、jailシェルを終了してください。

exit

Nginx設定 `+ / usr / local / etc / nginx / nginx.conf +`でエディターを開きます:

sudo ee /usr/local/etc/nginx/nginx.conf

`+ server {+`ブロック内に次の場所を追加します。

/usr/local/etc/nginx/nginx.conf

. . .
http {
   . . .
   server {
       . . .
       location / {
           root /usr/local/www/nginx;
           index index.html index.htm;
       }




















       location /buildbot/ {
           proxy_pass http://10.0.0.2:8010/;
       }

       . . .
   }
}
. . .

Nginx構成ファイルを保存して閉じます。 次に、Nginxサービスをリロードします。

sudo service nginx reload

最初の手動ビルドで作成されたアーティファクトを確認しましょう。 リソースにアクセスするには、ローカルマシンで好みのWebブラウザを開きます。

*パッケージリポジトリ*は + http:/// packages / +(または + http:/// +)の下にあります。 ルートディレクトリにメタ情報があります。 + 112amd64-2019Q2 +、およびサブディレクトリ `+ All +`内のすべてのビルドパッケージ:

image:https://assets.digitalocean.com/articles/buildbot_poudriere/step6a.png [パッケージリポジトリリスト]

詳細なビルドログ*および Poudriereの組み込みWebインターフェース*は、 `+ http:/// logs / `の下にあります。 ディレクトリ階層をクリックして、以前の手動ビルドのデータにアクセスします。 この例では、 ` http:/// logs / 112amd64-2019Q2 / latest / build.html +`のようなURLになります。

image:https://assets.digitalocean.com/articles/buildbot_poudriere/step6b.png [Poudriere Webインターフェイス]

サーバーのドメイン名を設定しなかった場合、これらの例ではサーバーのパブリックIPアドレスを入力する必要があります。 + http:/// logs / +

これで、作業ビルドを取得し、出力(パッケージとログ)を可視化するためのすべての手動セットアップが終了します。 今後、ビルドを自動化してhttps://www.digitalocean.com/community/tutorials/an-introduction-to-continuous-integration-delivery-and-deployment[continuous integration]を実現します。

ステップ7-パッケージ用のBuildbot Builderのセットアップ

この手順の目標は、既存のBuildbotサンプル構成に手動で追加することで、既に手動でPoudriereを実行することにより、一括パッケージビルドを自動化することです。 このステップの終わりまでに、Buildbotは、portsツリーの選択されたブランチが変更されるたびにパッケージビルドをトリガーします。 このチュートリアルの例では、四半期分岐「+ 2019Q2 +」になります。

必要な変更はすべてBuildbotマスター構成で行われるため、マスターjailで* root *シェルを開いてください。

sudo jexec buildbot-master csh

最初に、ビルドを実行するために実行されるコマンドとアクションを記述する_builder_を定義する必要があります。 既存の設定 + / var / buildbot-master / master.cfg +`には、セクション `+ BUILDERS +-エディタが開き、次の見出しが始まるまでセクション全体が*置換*されます。 `+ …​ +`で、次の設定で:

ee /var/buildbot-master/master.cfg

/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))
. . .

これにより、Buildbotの拡張性がどのように利用されるかに注意してください。カスタムクラスは、Poudriereのログ出力からの情報を観察および解析するために使用されます。 つまり、「+ PoudriereLogLineObserver +」が「ログオブザーバー」として追加されます。 ビルド中に新しいログ行が出力されるたびに呼び出されます。 このクラスは、ログディレクトリでログを検索し、それをハイパーリンクに変換します。 これらのリンクはビルドステップの横に表示され、ユーザーをPoudriereのウェブインターフェースとログに直接誘導します。

最初のビルド手順「ポートツリーの更新」では、Poudriereの組み込み更新コマンド( + ports -u +)を使用して、ポートツリーの最新バージョンを取得します。 これにより、以前に構成された方法が自動的に使用されます(SVN / Gitなど)。 このようにして、パッケージが常に最新のコミットされたツリーに対してビルドされることを確認できます。これは、ソフトウェアバージョンとパッチを管理する独自のバージョン管理されたリポジトリがある場合に特に役立ちます。

上部のリスト「+ PORTS_TO_BUILD +」は、構築するポートを指定します。 ブロックの下部に指定されている_build factory_のステップで使用されます。 ビルドファクトリは、ビルドのインスタンス化に使用されるテンプレートです。 Buildbotは、トリガーされるたびに一意のビルドを作成し、ビルドはその時点でビルドファクトリに対して定義されたステップのコピーを使用します。 この場合、正確に2つのステップを構成しました。

  • ポートツリーを更新します。 この例では、四半期ごとの分岐「+ 2019Q2 +」を使用しているため、変更を頻繁に受け取ることはありません(通常はセキュリティとビルドの修正のみ)。

  • 同じツリーを使用してバルクビルドを実行します。

追加したコードブロックを機能させるには、必要なインポートをファイルの先頭に追加してください。

/var/buildbot-master/master.cfg(スニペット)

# -*- python -*-
# ex: set filetype=python:



from buildbot.plugins import *

Pythonの + re +`ライブラリは、文字列の一部を検索または置換する機能である_正規表現_を実装します。+ PoudriereLogLineObserver + クラスはそれを使用して、行 + Logs:/ pdr / data / logs / …​を検索します。 + `ログディレクトリについて言及しています。

ビルドコマンドは、「+ sudo 」を使用して特定のコマンドを実行します。 これは、ビルドjailを作成、管理、および破棄するためにビルドインを実行するときにPoudriereがスーパーユーザー特権を必要とするためです。また、Poudriereが管理するポートツリーは所有者としてrootユーザーで作成されます 前のチュートリアルでは、 ` sysrc buildbot_worker_uid = buildbot-worker `でBuildbotワーカープロセスを実行するユーザーを設定しました。 したがって、 ` buildbot-worker `ユーザーが必要なコマンドをrootとして正確に実行できるようにしたいが、他のコマンドは実行できないようにします(セキュリティ上の理由から)。 ` sudo +`プログラムをインストールし、それに応じて設定しましょう。

これは、マスターではなくワーカー刑務所で行う必要があります。 マスターjailシェルを終了し、ワーカーjailを入力してください:

exit
sudo jexec buildbot-worker0 csh

`+ sudo +`パッケージをインストールします。

pkg install sudo

`+ y `と ` ENTER +`でインストールを確認します。

FreeBSDでは、_sudo_パッケージはデフォルトで `+ / usr / local / etc / sudoers.d / +`から設定ファイルを読み取ります。 エディターを開いて、新しい構成ファイルを作成します。

env EDITOR=ee visudo /usr/local/etc/sudoers.d/buildbot-worker

`+ visudo +`の使用は意図的なものです。構文エラーについて警告し、不適切な設定をコミットする代わりに修正できるようにするためです。

`+ buildbot-worker +`ユーザーがパスワードなしでrootとして実行できるコマンドを指定します。

/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 *

ファイルを保存し、さらに必要なBuildbotマスターの構成のためにマスターjailに切り替えます。

exit
sudo jexec buildbot-master csh

バルクビルドを機能させるための要件を満たしました。 ただし、前述したように、各ビルドを実行するには「トリガー」する必要があります。 Buildbotは、ビルドがいつトリガーされ、どのブランチが変更されたかなどの追加情報を定義するオブジェクトに対して、_scheduler_という用語を使用します。 設定ファイルから既存のセクション「+ SCHEDULERS 」を「削除」し、「 BUILDERS +」セクションの後に「*」*を置いて、コードが既存のすべてのビルダー名を使用できるようにしてください。

ee /var/buildbot-master/master.cfg

/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']))
. . .

これにより、すべてのビルダーに* force *ボタンが表示されるようにサンプル構成が置き換えられます。 そして最も重要なのは、指定された + project + / `+ branch `に関連するすべての変更を監視し、変更ごとにビルドをトリガーするスケジューラーを作成することです。 ただし、このような変更イベントは発生しません。まず、_change source_を作成する必要があります。 通常、それらは、ブランチ上の変更を検出できるSVNやGitのような_version control systems_です。 Buildbotは最も人気のあるものをサポートしているため、その機能を使用して、選択したアップストリームポートツリーリポジトリをソースとして追加できます。 セクション「 CHANGESOURCES +」を次の構成に完全に置き換えます。

/var/buildbot-master/master.cfg(スニペット)

. . .
####### 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))
. . .

これにより、Buildbotマスターで4時間ごとにSVNリポジトリがポーリングされ、新しい(以前は見られなかった)変更が一致するスケジューラーに転送され、最終的に単一のBuildbotワーカーで実行されるようにディスパッチされます。 ポートツリーは非常に大きく、最初にこれらのポーラーは完全な履歴(Gitの場合、指定されたブランチのみ)をダウンロードします。これには数分かかり、かなりのスペース(数ギガバイト)が必要です。

Buildbotを再起動して、新しい構成ファイルを適用します。

service buildbot restart

この例では、 `+ svn:// svn.freebsd.org / ports / `のアップストリームポートコレクションを使用しており、ブランチ ` 2019Q2 +`が変更されるたびにビルドがスケジュールされます。 前述のように、四半期ごとのブランチはほとんど安定しており、更新を頻繁に受信しません。 おそらく、ビルドが最初にトリガーされる前に、そのような変更が行われるのを待ちたくないので、手作業で一度実行してみましょう。

Buildbot Webインターフェース( + http:/// buildbot / +)を開き、* Builds> Builders> bulk-112amd64-2019Q2 *に移動します。 ビルドはまだ表示されません。

image:https://assets.digitalocean.com/articles/buildbot_poudriere/step7a.png [バルクビルダーページ-ビルドはまだありません]

右上の[* force ]ボタンをクリックし、[ Build *]をクリックします。 これにより、デフォルト設定を使用してビルドがトリガーされます。 reason、branch、およびその他の値はオーバーライドされません。 「ポートツリーの更新」ステップの実行には1分かかる場合があり、最終的にはPoudriereビルドも正常に実行されるはずです。 Webインターフェイスには、ビルドが成功したことが表示されます。

image:https://assets.digitalocean.com/articles/buildbot_poudriere/step7b.png [Successful build]

リンク(* Poudriereビルド*および* Poudriereログ*)のいずれかをクリックすると、それぞれ特定のビルドのPoudriere Webインターフェイスとビルドログが表示されます(ステップ6を参照)。 * make bulk の横にある矢印をクリックして展開し、 stdio>すべての…行を表示*して、 `+ poudriere bulk …​ +`コマンドの完全な出力を表示します。

最初のビルドが完了すると、ステップ6でNginxで構成されたパッケージが利用可能になります。 ブラウザで + http:/// packages / +(または + http:/// packages / +)に移動し、Poudriereによって作成されたパッケージリポジトリをクリックします。 リポジトリのいずれかを入力して、 + All / +`サブディレクトリに移動すると、実際のパッケージファイル( `+ *。txz +)を見つけることができます。

image:https://assets.digitalocean.com/articles/buildbot_poudriere/step7c.png [パッケージリポジトリのリスト]

パッケージがHTTPS(または決定した場合はHTTP)を介して利用可能であり、ポートツリーの変更に基づいて自動的に構築されるようになったため、これらのパッケージを使用するように1つ以上のホストを構成できます。

手順8-パッケージクライアントの構成

このステップでは、2番目のFreeBSDサーバーが必要であり、CIサーバー上に構築されたパッケージを取得してインストールできるようにセットアップします。 この2番目のサーバーを*パッケージクライアント*と呼びます。

  • client *ホストにSSHで接続します。 このセクションの残りのほとんどの手順は、*クライアント*で実行されます。

ssh

カスタムパッケージリポジトリ設定用のディレクトリを作成します。

sudo mkdir -p /usr/local/etc/pkg/repos
  • root *ユーザーとして、エディターを開いてファイル `+ / usr / local / etc / pkg / repos / ci.conf +`を作成し、パッケージを取得する方法と場所を指定します。

sudo ee /usr/local/etc/pkg/repos/ci.conf

パッケージ署名を選択した場合は、次のコンテンツを使用します。

/usr/local/etc/pkg/repos/ci.conf

ci: {
   url: "http:///packages/",
   signature_type: "pubkey",
   pubkey: "/usr/local/etc/pkg/repos/ci.pub",
   enabled: yes
}

または、パッケージの署名なしで行うことにした場合は、次のように署名チェックを無効にします。

/usr/local/etc/pkg/repos/ci.conf

ci: {
   url: "http:///packages/",
   signature_type: "none",
   enabled: yes
}

パッケージリポジトリの構成を完了して有効にしましたが、通常のFreeBSDインストールでは、公式のパッケージリポジトリ「FreeBSD」も有効になります。 異なるソースからインストールされたパッケージを混在させることは、互換性のないソフトウェアバージョンまたは異なるABI、API、またはビルドオプションのために、ある時点で本番ソフトウェアをクラッシュさせる簡単な方法です。 ホスト上のすべてのパッケージは同じソースから派生する必要があります。

公式リポジトリのデフォルト設定は `+ / etc / pkg / FreeBSD.conf `に保存されています。 このファイルは基本システムに属しているため、変更しないでください。 ただし、その設定をオーバーライドできます。つまり、独自のリポジトリも設定されている ` / usr / local / etc / pkg / repos `の下の設定ファイルにそれぞれのフラグを追加することで、リポジトリを完全に無効にする必要があります。 エディタで新しいファイル ` / usr / local / etc / pkg / repos / FreeBSD.conf +`を作成し、次の内容を使用してFreeBSDリポジトリを無効にしてください:

sudo ee /usr/local/etc/pkg/repos/FreeBSD.conf

/usr/local/etc/pkg/repos/FreeBSD.conf

FreeBSD: {
   enabled: no
}

完全に初期状態の*パッケージクライアント*ホストを使用している場合、パッケージはまだインストールされていないため、独自のパッケージリポジトリの使用をすぐに開始できます。 ただし、1つのパッケージだけが別のソースからインストールされた場合、それらのパッケージをアンインストールし、独自のソースを使用してゼロから始めることをお勧めします。 パッケージマネージャー `+ pkg `は、鶏肉と卵の問題を解決するためにパッケージとしてインストールされます。FreeBSDのベースシステムには、パッケージマネージャーをブートストラップできる小さな実行可能ファイル ` / usr / sbin / pkg `が同梱されています。 つまり、 ` pkg `パッケージをダウンロードして、システムの最初のパッケージとしてインストールします。 その時点から、そのパッケージの実行可能ファイル ` / usr / local / sbin / pkg +`は、本格的なパッケージマネージャーとしてサポートします。

次のコマンドを実行して、 `+ pkg +`をブートストラップします。

sudo pkg bootstrap

+ package bootstrap`の出力では、設定ファイルで + ci + `と呼ばれる独自のパッケージリポジトリからパッケージが取得されていることがわかります。 パッケージ署名キーを使用している場合は、セキュリティ検証に関するヒントも出力されます。

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 http:///packages/, please wait...
... done
Installing pkg-1.10.5_5...
Extracting pkg-1.10.5_5: 100%

この成功した出力が表示された場合は、次のノートブロックにスキップしてください。 ただし、パッケージマネージャーまたは他のパッケージが別のソースから既にインストールされている場合、次のエラーが表示されます。

Outputpkg already bootstrapped at /usr/local/sbin/pkg

次に、メモの指示に従ってください。

HTTPS用のLet’s Encrypt証明書を使用してパッケージホストをセットアップする場合、パッケージホストが信頼されない鶏肉と卵の問題が発生しますが、パッケージ `+ ca_root_nss +`をインストールする必要があります(信頼できるルート認証局を含む)、Let’s Encrypt CAを信頼することにより、カスタムビルドパッケージをホストするサーバーも信頼します。 内部CA(あなたまたはあなたの会社が自己署名)を使用した場合も、同じ問題が発生します。 証明書検証エラーは、パッケージマネージャーのブートストラップ時に次のようなエラー出力になります。

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:
[...]

このエラーが表示された場合は、以下のメモの指示に従ってください。 それ以外の場合は、すべて設定されているので、この部分をスキップして、ノートの後に続行できます。

以前に既存のパッケージを削除した場合は、今すぐ重要なツールを再インストールするのが良いタイミングです(例: sudo)、およびその他の必要なパッケージ。

pkg install bash sudo

そして、それでも問題が解決しない場合は、ルートシェルから削除します。

exit

すべてが機能するかどうかをテストするために、Buildbotマスター設定(変数 + PORTS_TO_BUILD +)で指定されたリストからパッケージをインストールします。 たとえば、Bashシェルとsudo:

sudo pkg install bash sudo tmux

再度、「+ y 」を押してから「 ENTER +」を押して、インストールを確認します。 パッケージのインストールは問題なく実行されます。

`+ pkg info `を使用して、現在インストールされているパッケージを一覧表示できます(存在する場合は依存関係も含む)。 他のソースからのパッケージがインストールされていないことを確認して、クラッシュや非互換性を引き起こす可能性がある場合、 ` pkg query”%n:autoinstalled =%a from repo =%R “`を使用して、これらの詳細を含むインストール済みパッケージを一覧表示できます。 ` pkg `は ` unknown-repository +`からブートストラップされて表示されることに注意してください。これが以前にブートストラップ出力を検証して、パッケージマネージャー自体も独自のパッケージリポジトリから取得されることを確認したためです。

この最後のステップでは、クライアント上のCIのパッケージリポジトリへのアクセスを設定し、オプションでセキュリティ目的でパッケージ署名検証を有効にし、互換性の問題を回避するためにパッケージが単一のソースからのみ来るようにし、パッケージマネージャー「+ pkg +」をブートストラップし、 CIによってビルドされた目的のパッケージをインストールしました。

結論

このチュートリアルでは、Poudriereのインストールと設定、自動実行パッケージビルド、およびクライアントホストからパッケージリポジトリへの安全なアクセスの設定を行い、単一の中央ソースからインストールされた最新のビルドパッケージを作成しました。 このセットアップにより、サーバーの一貫性と最新性を維持し、外部ソフトウェアパッケージのバージョンアップグレードを管理するための優れたポジションが得られます。

現在の設定をさらに強化するには、次の選択手順を検討することができます。

  • プライベートアクセスのみ:デフォルトでは、Dropletsにはインターネット上のパブリックIPアドレスがあります。 また、Buildbotはhttp://docs.buildbot.net/latest/developer/auth.html [認証をサポート]ですが、デフォルトでは保護されていません。

  • ビルドの問題に関するアラート:https://docs.buildbot.net/latest/manual/configuration/reporters.html[Buildbot reporters]をセットアップして開始する方法を確認してください。

  • 最新のポートツリーを維持:チュートリアルの例では、https://wiki.freebsd.org/Ports/QuarterlyBranch [quarterly branch] 2019Q2が使用されましたが、最終的には新しいツリーに切り替えるか、独自のバージョン管理リポジトリを使用して、必要なパッチを適用します。

  • 独自のプロジェクト用にビルドを追加する:https://www.freebsd.org/doc/en/books/porters-handbook/[FreeBSD Porter’s Handbook]は、ビルドする場合のビルドレシピ(port)の書き方を説明しています内部ソフトウェアをFreeBSDパッケージとしてインストールします。

  • クライアント上の古いパッケージを監視: `+ sudo pkg update -q && sudo pkg version -q –not-like” = “+の出力を使用して、クライアントにインストールされたパッケージをCIで利用可能な最新のパッケージと比較できます。 `バージョンが完全に一致しないすべてのパッケージを出力します。 詳細については、https://www.freebsd.org/cgi/man.cgi?query = pkg-version&sektion = 8&n = 1 [pkg-versionのマンページ]を参照してください。

  • クリーンアップジョブの追加:時間が経つにつれて、Buildbotワーカーのjailは古いビルドログファイル、ソースtarball、および非推奨のパッケージでいっぱいになります。 コマンド `+ poudriere {logclean、distclean、pkgclean} +`を使用してクリーンアップします(https://www.freebsd.org/cgi/man.cgi?query=poudriere&sektion=8&manpath=freebsd-release-ports [ poudriere])。