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環境のセットアップ

  1. SUVMライセンスを取得します。

    1. CIで稼働しているビルド・サーバーは通常、取り壊される(つまり破壊される)ので、ビルド・ジョブが終了すると、最大同時ビルド・ジョブをサポートするのに十分なコアのSUVMライセンスが必要になります。詳細は、SUVM (Single-Use Virtual Machine) Licenses を参照してください。

  2. システム環境にIncredibuildをデプロイします。

    1. Incredibuild Coordinatorをデプロイします(K8S内でも外でも可)。

    2. Incredibuild Helperマシンのセット、別名ヘルパーグリッドをK8Sクラスタの外部にデプロイすします。これは、ベアメタル、VM、クラウドのいずれでも構いません。

    3. 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は、ゴールデン イメージを作成するコマンドで始まり、コンパイル コマンド(ソース コードの取得とコンパイル)で終わります。

  1. 以下の行を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
  2. コンテナ上で イニシエータエージェント のユーザーインターフェース(ビルドモニタ、ビルド履歴など)を使用する場合は、コンテナ上で外部アクセス用の HTTP および/または HTTPS ポートが開かれているか確認します。詳細は、Modifying Port を参照してください。

  3. コンパイル コマンドに、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;
  4. [make] コマンドを次の[ib_console] コマンドでラッピングし、プロジェクトの可能性とヘルパーコアの利用可能性に応じてビルドの並列度をあげます。

    コピー
    ib_console -f make -j 100 ALL;
  5. 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 ビルドオプションに注意してください。

バージョンの更新

  1. Incredibuild Coordinatorをアップグレードしてください。このプロセスが終了すると、Coordinator に接続されているヘルパーエージェントは自動的にアップグレードされます。

  2. Kubernetesのゴールデンイメージを更新し、今後のヘルパーエージェントが最新バージョンのIncredibuildを使用してインストールされるようにします。
    これを行わない場合、Coordinatorに接続された時点でアップグレードされてしまいます。しかし、これはデプロイを大幅に遅らせることになります。