Kubernetes
Incredibuild では、利用可能な Incredibuild Helper マシンに CI プロセスを分配することで、CI プロセスを高速化できます。ビルドサーバーのコンテナイメージに Incredibuild Initiator をインストールし、それを Kubernetes (K8S) の外にある Incredibuild Helper マシンを接続する Incredibuild Coordinator に接続します。
この記事では、K8Sを使った典型的なCI環境を説明し、ビルドプロセスにIncredibuildを統合する方法を説明します。すでに(Incredibuildを使わない)稼働中のCI環境があると仮定します。
注意: このドキュメントの利用者は、K8Sクラスタ、ポッド、コンテナの管理経験が十分にあるDevOpsエンジニアを対象としています。また、利用者はIncredibuildに精通しており、K8S以外でも使用したことがあると仮定します。
制限事項
-
K8S 内で実行できるのは、Incredibuild Coordinator と イニシエータエージェント のみです。Incredibuild Coordinator は K8S 内でも K8S 外でも構いません。Incredibuild ヘルパーエージェントはK8Sには含まれません。
-
Build Cache は、K8S で動作するイニシエータではサポートされません。
-
K8S を使用してスピンアップされたイニシエータは、自動的に Default Build Group に関連付けられます。K8Sマシン用の他のBuild Groupを使用するには、CLI を使用します。
-
通常、ビルド ジョブが終了すると、CIで稼働しているビルド サーバーは取り壊されます(つまり破棄されます)。
-
ビルド履歴データベースとビルドログは、これらを収集してログ収集リポジトリに保存しない限り、失われます。
-
ビルド モニターはビルド中にのみ利用可能で、コンテナが終了するとエージェントはコーディネータ エージェント リストから消去されます。
-
Incredibuild環境のセットアップ
-
SUVMライセンスを取得します。
-
CIで稼働しているビルド・サーバーは通常、取り壊される(つまり破壊される)ので、ビルド・ジョブが終了すると、最大同時ビルド・ジョブをサポートするのに十分なコアのSUVMライセンスが必要になります。詳細は、SUVM (Single-Use Virtual Machine) Licenses を参照してください。
-
-
システム環境にIncredibuildをデプロイします。
-
Incredibuild Coordinatorをデプロイします(K8S内でも外でも可)。
-
Incredibuild Helperマシンのセット、別名ヘルパーグリッドをK8Sクラスタの外部にデプロイすします。これは、ベアメタル、VM、クラウドのいずれでも構いません。
-
Incredibuildイニシエータエージェント(K8S内部)は、Coordinatorとすべてのヘルパーエージェントへのネットワーク アクセスが必要です。ハードウェアとネットワークの必要条件を確認し、関連するTCP/IPポートを必ず開放してください。
-
注意: ビルドサーバーポッドの過剰プロビジョニングは避けてください。Incredibuild アクセラレーションが動作していても、CPU やその他のリソースが飢餓状態になると、ビルドのパフォーマンスが低下する可能性があります。
Incredibuild InitiatorをデプロイするためのKubernetesイメージの修正または作成
Linuxディストリビューション、コンパイラー、makeシステムを備えたビルド サーバーのゴールデン イメージがあると思われます。以下のDockerfileは、典型的なビルド サーバーのゴールデン イメージ(Incredibuildなし)を表しています。
#######################################################
# build-image.Dockerfile
#######################################################
FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/GMT
RUN apt-get update
RUN apt-get install -y gcc make git bzip2
#######################################################
# The compilation commands executed during each CI job
#######################################################
CMD bash -c " \
git clone https://github.com/gilnadel/Sample.git; \
cd Sample; \
make -j 10 ALL; "
上記のDockerfileは、ゴールデン イメージを作成するコマンドで始まり、コンパイル コマンド(ソース コードの取得とコンパイル)で終わります。
-
以下の行をDockerfileに追加して、コンパイル コマンドの前にIncredibuildをインストールしますが、IB_VERSIONとIB_COORDINATORはIncredibuild Coordinatorに合わせて変更してください。
コピー#######################################################
# Install IB4Linux
#######################################################
ENV IB_VERSION=4.0
ENV IB_COORDINATOR=192.168.10.50
EXPOSE 8080
EXPOSE 8081
WORKDIR /root
ADD https://www.incredibuild.com/downloads/incredibuild_$IB_VERSION.run ./incredibuild.run
RUN chmod a+x ./incredibuild.run
RUN sudo ./incredibuild.run --action install --initiator enabled --coordinator-machine $IB_COORDINATOR --data-dir /etc/ --license-type SUVM -
コンテナ上で イニシエータエージェント のユーザーインターフェース(ビルドモニタ、ビルド履歴など)を使用する場合は、コンテナ上で外部アクセス用の HTTP および/または HTTPS ポートが開かれているか確認します。詳細は、Modifying Port を参照してください。
-
コンパイル コマンドに、CI中にポッドが実行されたときにIncredibuildエージェントを起動する以下の行を追加します。これらのコマンドは、起動したIncredibuildエージェントがSUVMライセンス制限から一定のCPUコア数を消費することを確認します。1番目のコマンドの値8を、コンテナ化ビルド サーバーがビルドに実際に使用するコア数に合わせて変更します。(このコア数は、通常、コンテナに割り当てるCPU数と一致するはずです)。
コピー# Change the parameters below to fit the size of your pod
/opt/incredibuild/management/set_agent_params.py max-initiator-cores 8;
/opt/incredibuild/etc/init.d/incredibuild start;
sleep 10; -
[make] コマンドを次の[ib_console] コマンドでラッピングし、プロジェクトの可能性とヘルパーコアの利用可能性に応じてビルドの並列度をあげます。
コピーib_console -f make -j 100 ALL;
-
Incredibuildがビルド操作を診断できるようにするには、ビルド出力をKubernetes外の場所(ログ収集リポジトリなど)にアップロードするためのCollecting Build Logs の指示に従います。ログのエクスポートおよび保存を実行しな場合、Incredibuild はビルドの失敗やパフォーマンスの低下に対するサポートを提供できません。
Incredibuildによる完全なDockerfileのサンプル
環境はそれぞれ異なるので、この例は、お客様のシステム環境 に合わせて調整する必要があるかもしれません。
#######################################################
# build-image.Dockerfile
#######################################################
FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/GMT
RUN apt-get update
RUN apt-get install -y gcc make git
#######################################################
# Install IB4Linux
#######################################################
ENV IB_VERSION=4.0
ENV IB_COORDINATOR=192.168.10.50
EXPOSE 8080
EXPOSE 8081
WORKDIR /root
ADD https://www.incredibuild.com/downloads/incredibuild_$IB_VERSION.run ./incredibuild.run
RUN chmod a+x ./incredibuild.run
RUN sudo ./incredibuild.run --action install --initiator enabled --coordinator-machine $IB_COORDINATOR --data-dir /etc/ --license-type SUVM
#######################################################
# Compilation step, including IB agent startup
#######################################################
CMD bash -c -x " \
/opt/incredibuild/management/set_agent_params.py max-initiator-cores 8; \
/opt/incredibuild/etc/init.d/incredibuild start; sleep 10; \
git clone https://github.com/gilnadel/Sample.git; \
cd Sample; \
ib_console -f -p gcc.xml --no-cgroups make -j 100 ALL; \ "
間違いのないイメージの構築
コンテナのゴールデンイメージをビルドし、イメージ リポジトリにプッシュします。以下のサンプルDockerコマンドを参照してください。
docker build -f build-image.Dockerfile -t build-image:latest --ulimit nofile=100000:100000 .
必要なulimit ビルドオプションに注意してください。
バージョンの更新
-
Incredibuild Coordinatorをアップグレードしてください。このプロセスが終了すると、Coordinator に接続されているヘルパーエージェントは自動的にアップグレードされます。
-
Kubernetesのゴールデンイメージを更新し、今後のヘルパーエージェントが最新バージョンのIncredibuildを使用してインストールされるようにします。
これを行わない場合、Coordinatorに接続された時点でアップグレードされてしまいます。しかし、これはデプロイを大幅に遅らせることになります。