12.3. Jenkins エージェント

OpenShift Container Platform では、Jenkins エージェントとして使用するのに適したイメージを 3 つのイメージ (BaseMaven、および Node.js) を提供します。

1 番目は、Jenkins エージェントのベースイメージです。

  • 必須のツール (ヘッドレス Java、Jenkins JNLP クライアント) と有用なツール (gittarzipnss など) の両方を取り入れます。
  • JNLP エージェントをエントリーポイントとして確立します。
  • Jenkins ジョブ内からコマンドラインの操作を呼び出す oc クライアントツールが含まれます。
  • Red Hat Enterprise Linux (RHEL) および localdev イメージの両方の Dockerfile を提供します。

ベースイメージを拡張するイメージがさらに 2 つ提供されます。

  • Maven v3.5 イメージ
  • Node.js v10 イメージおよび Node.js v12 イメージ

Maven および Node.js Jenkins エージェントイメージは、新しいエージェントイメージをビルドする際に参照できる Universal Base Image (UBI) 用の Dockerfile を提供します。contrib および contrib/bin サブディレクトリーにも注目してください。このサブディレクトリーでは、イメージの設定ファイルや実行可能なスクリプトの挿入が可能です。

重要

OpenShift Container Platform のバージョンに適したエージェントイメージバージョンを使用し、継承します。エージェントイメージに埋め込まれた oc クライアントバージョンが OpenShift Container Platform バージョンと互換性がない場合、予期しない動作が発生する可能性があります。

12.3.1. Jenkins エージェントイメージ

OpenShift Container Platform Jenkins エージェントイメージは Quay.io または registry.redhat.io で利用できます。

Jenkins イメージは、Red Hat レジストリーから入手できます。

$ docker pull registry.redhat.io/openshift4/ose-jenkins:<v4.5.0>
$ docker pull registry.redhat.io/openshift4/jenkins-agent-nodejs-10-rhel7:<v4.5.0>
$ docker pull registry.redhat.io/openshift4/jenkins-agent-nodejs-12-rhel7:<v4.5.0>
$ docker pull registry.redhat.io/openshift4/ose-jenkins-agent-maven:<v4.5.0>
$ docker pull registry.redhat.io/openshift4/ose-jenkins-agent-base:<v4.5.0>

これらのイメージを使用するには、Quay.io または registry.redhat.io から直接アクセスするか、これらを OpenShift Container Platform コンテナーイメージレジストリーにプッシュします。

12.3.2. Jenkins エージェントの環境変数

各 Jenkins エージェントコンテナーは、以下の環境変数で設定できます。

変数定義値と設定の例

JAVA_MAX_HEAP_PARAMCONTAINER_HEAP_PERCENTJENKINS_MAX_HEAP_UPPER_BOUND_MB

これらの値は Jenkins JVM の最大ヒープサイズを制御します。JAVA_MAX_HEAP_PARAM が設定されている場合は、その値が優先されます。設定されていない場合は、最大ヒープサイズは、コンテナーメモリー制限の CONTAINER_HEAP_PERCENT として動的に計算され、オプションで JENKINS_MAX_HEAP_UPPER_BOUND_MB MiB を上限とします。

デフォルトでは Jenkins JVM の最大ヒープサイズは、上限なしでコンテナーメモリー制限の 50% に設定されます。

JAVA_MAX_HEAP_PARAM の設定例: -Xmx512m

CONTAINER_HEAP_PERCENT のデフォルト: 0.5 (50%)

JENKINS_MAX_HEAP_UPPER_BOUND_MB の設定例: 512 MiB

JAVA_INITIAL_HEAP_PARAMCONTAINER_INITIAL_PERCENT

これらの値は Jenkins JVM の初期ヒープサイズを制御します。JAVA_INITIAL_HEAP_PARAM が設定されている場合は、その値が優先されます。設定されていない場合は、初期ヒープサイズは、動的に計算される最大ヒープサイズの CONTAINER_INITIAL_PERCENT として動的に計算されます。

デフォルトでは、JVM は初期のヒープサイズを設定します。

JAVA_INITIAL_HEAP_PARAM の設定例: -Xmx32m

CONTAINER_INITIAL_PERCENT の設定例: 0.1 (10%)

CONTAINER_CORE_LIMIT

設定されている場合には、内部の JVM スレッドのサイジング数に使用するコアの数を整数で指定します。

設定例: 2

JAVA_TOOL_OPTIONS

このコンテナーで実行中のすべての JVM に適用するオプションを指定します。この値の上書きは推奨していません。

デフォルト: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Dsun.zip.disableMemoryMapping=true

JAVA_GC_OPTS

Jenkins JVM ガーベッジコレクションのパラメーターを指定します。この値の上書きは推奨していません。

デフォルト: -XX:+UseParallelGC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90

JENKINS_JAVA_OVERRIDES

Jenkins JVM の追加オプションを指定します。これらのオプションは、上記の Java オプションを含む、その他すべてのオプションに追加され、必要に応じてそれらのいずれかを上書きするために使用できます。追加オプションがある場合には、スペースで区切ります。オプションにスペース文字が含まれる場合には、バックスラッシュでエスケープしてください。

設定例: -Dfoo -Dbar; -Dfoo=first\ value -Dbar=second\ value

USE_JAVA_VERSION

コンテナーでエージェントを実行するために使用する Java バージョンのバージョンを指定します。コンテナーの基本イメージには、java-11java-1.8.0 の 2 つのバージョンの Java がインストールされています。コンテナーの基本イメージを拡張する場合は、関連付けられた接尾辞を使用して、Java の任意の代替バージョンを指定できます。

デフォルト値は java-11 です。

設定例: java-1.8.0

12.3.3. Jenkins エージェントのメモリー要件

JVM はすべての Jenkins エージェントで使用され、Jenkins JNLP エージェントをホストし、javac、Maven、または Gradle などの Java アプリケーションを実行します。

デフォルトで、Jenkins JNLP エージェントの JVM はヒープにコンテナーメモリー制限の 50% を使用します。この値は、CONTAINER_HEAP_PERCENT の環境変数で変更可能です。上限を指定することも、すべて上書きすることも可能です。

デフォルトでは、シェルスクリプトや oc コマンドをパイプラインから実行するなど、Jenkins エージェントコンテナーで実行される他のプロセスはすべて、OOM kill を呼び出さずに残りの 50% メモリー制限を超えるメモリーを使用することはできません。

デフォルトでは、Jenkins エージェントコンテナーで実行される他の各 JVM プロセスは、最大でコンテナーメモリー制限の 25% をヒープに使用します。多くのビルドワークロードにおいて、この制限の調整が必要になる場合があります。

12.3.4. Jenkins エージェントの Gradle ビルド

OpenShift Container Platform の Jenkins エージェントで Gradle ビルドをホストすると、Jenkins JNLP エージェントおよび Gradle JVM に加え、テストが指定されている場合に Gradle が 3 番目の JVM を起動してテストを実行するので、さらに複雑になります。

以下の設定は、OpenShift Container Platform でメモリーに制約がある Jenkins エージェントの Gradle ビルドを実行する場合の開始点として推奨されます。必要に応じて、これらの設定を変更することができます。

  • gradle.properties ファイルに org.gradle.daemon=false を追加して、有効期間の長い (long-lived) Gradle デーモンを無効にするようにします。
  • gradle.properties ファイルで org.gradle.parallel=true が設定されていないこと、また、コマンドラインの引数として --parallel が設定されていないことを確認して、並行ビルドの実行を無効にします。
  • java { options.fork = false }build.gradle ファイルに設定して、プロセス以外で Java がコンパイルされないようにします.
  • build.gradle ファイルで test { maxParallelForks = 1 } が設定されていることを確認して、複数の追加テストプロセスを無効にします。
  • GRADLE_OPTSJAVA_OPTS、または JAVA_TOOL_OPTIONS 環境変数で、Gradle JVM メモリーパラメーターを上書きします。
  • build.gradlemaxHeapSize および jvmArgs 設定を定義するか、-Dorg.gradle.jvmargs コマンドライン引数を使用して、Gradle テスト JVM に最大ヒープサイズと JVM の引数を設定します。

12.3.5. Jenkins エージェント Pod の保持

Jenkins エージェント Pod は、ビルドが完了するか、または停止された後にデフォルトで削除されます。この動作は、Kubernetes プラグイン Pod の保持設定で変更できます。Pod の保持は、すべての Jenkins ビルドについて各 Pod テンプレートの上書きで設定できます。以下の動作がサポートされます。

  • Always は、ビルドの結果に関係なくビルド Pod を維持します。
  • Default はプラグイン値を使用します (Pod テンプレートのみ)。
  • Never は常に Pod を削除します。
  • On Failure は Pod がビルド時に失敗した場合に Pod を維持します。

Pod の保持はパイプライン Jenkinsfile で上書きできます。

podTemplate(label: "mypod",
  cloud: "openshift",
  inheritFrom: "maven",
  podRetention: onFailure(), 1
  containers: [
    ...
  ]) {
  node("mypod") {
    ...
  }
}
1
podRetention に許可される値は、never()onFailure()always()、および default() です。
警告

保持される Pod は実行し続け、リソースクォータに対してカウントされる可能性があります。