Building from source
====================

TPAは、Postgresおよびその他の必要なコンポーネントをソースからビルドし、デフォルトのパッケージインストールの場合とまったく同じ構成でクラスターを展開できます。この機能により、ソースから繰り返し展開して、アーキテクチャやプラットフォームに関係なく、特定のセットアップのあらゆる側面を再現する現実的な完全に構成されたクラスターで変更をすばやくテストできます。

特定のコンポーネントのパッケージインストールを他のコンポーネントのソースビルドと組み合わせることもできます。たとえば、パッケージからPostgresをインストールし、ソースからpglogicalとPGDをコンパイルできます。ただし、パッケージの依存関係により、ソースからpglogicalをインストールし、パッケージからPGDをインストールできません。

ソースビルドは、開発、テスト、およびサポート操作で使用することを目的としています。

クイックスタート
----------------

2ndQPostgres、pglogical3、およびbdrはすべて安定したブランチからビルドされたものを使用してクラスターをセットアップします。

.. code:: bash

   $ tpaexec configure ~/clusters/speedy -a BDR-Always-ON          \
       --layout bronze                                             \
       --harp-consensus-protocol etcd                              \
       --install-from-source                                       \
         2ndqpostgres:2QREL_13_STABLE_dev                          \
         pglogical3:REL3_7_STABLE                                  \
         bdr3:REL3_7_STABLE

Sockerクラスターでは、リモートgitリポジトリの代わりにローカルワークツリーからコンポーネントをビルドすることもできます。

.. code:: bash

   $ tpaexec configure ~/clusters/speedy                           \
       --architecture BDR-Always-ON --layout bronze                \
       --harp-consensus-protocol etcd                              \
       --platform docker                                           \
       --install-from-source 2ndqpostgres:2QREL_13_STABLE_dev      \
         pglogical3 bdr3                                           \
       --local-source-directories                                  \
         pglogical3:~/src/pglogical bdr3:~/src/bdr

クラスターを展開した後、後続の実行で\ ``tpaexec deploy … --skip-tags build-clean``
を使用して、ビルドディレクトリを再利用できます。それ以外の場合、ビルドディレクトリはビルドを開始する前に空にされます。

BDR、およびカスタムの場所とビルドパラメーターを使用するその他のコンポーネント。

構成
----

ソースビルドの構成には2つの側面があります。

クラスターで特定のソースの組み合わせを実行する場合は、
``tpaexec configure``
を実行して、選択したコンポーネントをダウンロード、コンパイル、およびインストールするための合理的なデフォルトで構成を生成します。
 :ref:`クイックスタート <クイックスタート>` の例にあるように、 PostgresまたはPostgres
Extended、pglogical、およびBDRをビルドし、ビルドの元のブランチ名を指定できます。

基になるメカニズムは、コマンドラインオプションで許可される以上の機能を備えています。
``config.yml``
を編集することにより、さまざまなソースリポジトリのクローンを作成したり、ビルドの場所を変更したり、別のconfigureまたはbuildパラメーターを指定したり、buildコマンドを完全に再定義したりできます。したがって、
Postgres、pglogical、およびBDR以外のものをビルドできます。

使用可能なオプションについては、以下を参照してください。

-  :ref:`Building Postgres from source <Postgres source installation>` 

-  :ref:`Building extensions with `install_from_source` <Installing from source>` 

ローカルソースディレクトリ
--------------------------

TPAを使用して、GitリポジトリからではなくローカルソースディレクトリからPostgresと拡張機能をビルドするDockerコンテナをプロビジョニングできます。

``--install-from-source``
を使用して、ビルドするものを宣言しているとします。

.. code:: bash

   $ tpaexec configure ~/clusters/speedy                           \
       --architecture BDR-Always-ON --layout bronze                \
       --harp-consensus-protocol etcd                              \
       --platform docker                                           \
       --install-from-source 2ndqpostgres:2QREL_13_STABLE_dev      \
         pglogical3:REL3_7_STABLE bdr3:REL3_7_STABLE               \
         …

デフォルトでは、このコマンドは、 ``tpaexec deploy`` を使用してPostgres
Extended、pglogical3、およびbdr3の既知のリポジトリをクローンし、指定されたブランチをチェックアウトして、ビルドするクラスター構成になります。ただし、
``--local-source-directories``
を追加して、代わりにホストマシンからソースを直接取得するように指定できます。

.. code:: bash

   $ tpaexec configure ~/clusters/speedy                           \
       --architecture BDR-Always-ON --layout bronze                \
       --harp-consensus-protocol etcd                              \
       --platform docker                                           \
       --install-from-source 2ndqpostgres:2QREL_13_STABLE_dev      \
         pglogical3 bdr3                                           \
       --local-source-directories                                  \
         pglogical3:~/src/pglogical bdr3:~/src/bdr                 \
       …

この構成では、リポジトリからPostgres
Extendedをインストールしますが、ホスト上の指定されたディレクトリからpglogical3およびbdr3ソースを取得します。これらのディレクトリは、gitリポジトリがクローン作成されるのと同じ場所にあるDockerコンテナに読み取り専用でバインドマウントされ、デフォルトのツリー外ビルドが通常のように続行されます。

コンポーネントのローカルソースディレクトリを指定する場合、ビルドするブランチを指定することはできません。前述の例の\ ``--install-from-source``
の\ ``pglogical3:REL3_7_STABLE`` と\ ``plogical3``
を参照してください。ソースディレクトリはコンテナに読み取り専用でマウントされているため、TPAは\ ``git pull``
または\ ``git checkout``
を使用して更新できません。ローカルにチェックアウトされたブランチを取得します。コミットされていない変更を含みます。

``--local-source-directories`` を使用すると、\ ``config.yml``
にDockerボリューム定義のリストが含まれます。

.. code:: yaml

   local_source_directories:
     - /home/ams/src/pglogical:/opt/postgres/src/pglogical:ro
     - /home/ams/src/bdr:/opt/postgres/src/bdr:ro
     - ccache-bdr_src_36-20200828200021:/root/.ccache:rw

ccache
^^^^^^

TPAは、すべての種類のソースビルドにデフォルトでccacheをインストールします。ローカルソースディレクトリでDockerクラスターを使用している場合、デフォルトでは、新しいDockerボリュームがクラスターのコンテナに接続され、共有ccacheディレクトリとして機能します。このボリュームはホストから完全に分離され、クラスターがプロビジョニング解除されるときに削除されます。

``--shared-ccache /path/to/host/ccache``
configureオプションを使用して、有効期間の長い共有ccacheディレクトリを指定します。このディレクトリは、コンテナに読み取り/書き込みでバインドマウントされ、そのコンテンツはホストとコンテナの間で共有されます。

デザインとして、ホストでコンパイルされたバイナリをコンテナに直接インストールする方法はありません。

リビルド
--------

ソースからビルドされたコンポーネントを使用してクラスターを展開した後、
``tpaexec rebuild-sources``
を実行して、これらのコンポーネントのみをすばやくリビルドおよび再展開します。このコマンドは、
``tpaexec deploy``
を実行するよりも高速ですが、構成変更は適用されません。
