4.3. Jenkins スレーブ
4.3.1. 概要
OpenShift Online では、Jenkins スレーブとして使用するのに適したイメージを 3 つ (Base、Maven および Node.js) 提供します。
1 番目は、Jenkins スレーブのベースイメージです。
- 必須のツール (ヘッドレス Java、Jenkins JNLP クライアント) および役立つツール (git、tar、zip、nss など) の両方を取り入れます。
- JNLP スレーブをエントリーポイントとして確立します。
-
Jenkins ジョブ内からコマンドラインの操作を呼び出す
oc
クライアントツールが含まれます。 - CentOS および RHEL イメージ両方に対して Dockerfile を提供します。
ベースイメージを拡張するイメージがさらに 2 つ以上提供されます。
Maven および Node.js Jenkins スレーブイメージには、CentOS および RHEL 両方用の Dockerfiles が含まれており、新規スレーブイメージをビルドする場合に参照できます。contrib
および contrib/bin
サブディレクトリーにも注目してください。このサブディレクトリーでは、イメージの設定ファイルや実行可能なスクリプトの挿入が可能です。
使用する OpenShift Online バージョンに適したスレーブイメージのバージョンを使用、継承するようにしてください。スレーブイメージに埋め込まれた oc
クライアントバージョンが OpenShift Online バージョンと互換性がない場合には、予期せぬ動作が発生する可能性があります。
4.3.2. イメージ
RHEL 7 イメージは、Red Hat レジストリーから入手できます。
$ docker pull registry.access.redhat.com/openshift3/jenkins-slave-base-rhel7 $ docker pull registry.access.redhat.com/openshift3/jenkins-slave-maven-rhel7 $ docker pull registry.access.redhat.com/openshift3/jenkins-slave-nodejs-rhel7
4.3.3. 設定およびカスタマイズ
4.3.3.1. 環境変数
各 Jenkins スレーブコンテナーは、以下の環境変数で設定できます。
OPENSHIFT_JENKINS_JVM_ARCH
x86_64
またはi386
に設定して、Jenkins スレーブエージェントのホストに使用する JVM を上書きします。メモリー効率を確保するため、メモリー制限が 2 GiB のコンテナーで実行される場合には、Jenkins スレーブイメージはデフォルトで 32 ビットの JVM を動的に使用します。JAVA_MAX_HEAP_PARAM
CONTAINER_HEAP_PERCENT
(デフォルト:0.5
、50%)
JNLP_MAX_HEAP_UPPER_BOUND_MB
これらの値は Jenkins スレーブエージェントの JVM の最大ヒープサイズを制御します。
JAVA_MAX_HEAP_PARAM
が設定されている場合には (設定例:-Xmx512m
)、この値が優先されます。設定されていない場合には、最大ヒープサイズは動的に、コンテナーメモリー制限のCONTAINER_HEAP_PERCENT
% (設定例:0.5
、50%) として計算され、オプションでJNLP_MAX_HEAP_UPPER_BOUND_MB
MiB (設定例:512
) を上限とします。デフォルトでは Jenkins スレーブエージェントの JVM の最大ヒープサイズは、上限なしで、コンテナーメモリー制限の 50% に設定されます。
JAVA_INITIAL_HEAP_PARAM
CONTAINER_INITIAL_PERCENT
これらの値は Jenkins スレーブエージェントの JVM の初期ヒープサイズを制御します。
JAVA_INITIAL_HEAP_PARAM
が設定されている場合には (設定例:-Xmx32m
)、この値が優先されます。設定されていない場合には、初期ヒープサイズは動的に、コンテナーメモリー制限のCONTAINER_INITIAL_PERCENT
% (設定例:0.1
、10%) として計算されます。デフォルトでは、初期のヒープサイズは JVM に依存します。
CONTAINER_CORE_LIMIT
設定されている場合には、内部の JVM スレッドのサイジング数に使用するコアの数を整数で指定します。設定例:
2
JAVA_TOOL_OPTIONS
(デフォルト:-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Dsun.zip.disableMemoryMapping=true
)対象のコンテナーで実行中のすべての JVM が従うオプションを指定します。この値の上書きは推奨していません。
JAVA_GC_OPTS
(デフォルト:-XX:+UseParallelGC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90
)Jenkins スレーブエージェントの JVM ガーベッジコレクションのパラメーターを指定します。この値の上書きは推奨していません。
JNLP_JAVA_OVERRIDES
Jenkins スレーブエージェントの JVM の追加オプションを指定します。これらのオプションは、上記の Java オプションなどその他すべてのオプションに追加され、必要に応じてそれらの値のいずれかを上書きするのに使用できます。追加オプションがある場合には、スペースで区切ります。オプションにスペース文字が含まれる場合には、バックスラッシュでエスケープしてください。設定例:
-Dfoo -Dbar
;-Dfoo=first\ value -Dbar=second\ value
4.3.4. 使用法
4.3.4.1. メモリーの要件
Jenkins JNLP エージェントのホストや、Java アプリケーション (例: javac
、Maven または Gradle) の実行に、Jenkins スレーブのすべてにおいて JVM を使用します。Jenkins スレーブが使用する JVM のチューニングについての背景情報は、 OpenShift Online での OpenJDK のサイジングについて参照してください。
メモリー効率に関して、メモリー制限が 2 GiB 以下に指定されたコンテナーで実行中の場合には、デフォルトで Jenkins イメージが動的に 32 ビットの JVMを使用します。この動作は、OPENSHIFT_JENKINS_JVM_ARCH
環境変数で上書きできます。JVM の選択は、デフォルトでスレーブトコンテナー内の Jenkins JNLP エージェントおよびその他の Java プロセスの両方に適用されます。
デフォルトでは、Jenkins JVM エージェントはヒープにコンテナーメモリー制限の 50% を使用します。この値は、CONTAINER_HEAP_PERCENT
の環境変数で変更可能です。また、上限を指定することも、すべて上書きすることも可能です。詳しい情報は、「環境変数」を参照してください。
デフォルトでは、パイプラインから実行されるシェルスクリプトや oc
コマンドなど、Jenkins スレーブコンテナーで実行される他の全プロセスでは、OOM kill を呼び出さずに、メモリー制限の残り 50% を超えたメモリーを使用できる可能性が低い点を考慮してください。
デフォルトでは、Jenkins スレーブコンテナーで実行される他の JVM プロセスは、最大でコンテナーメモリー制限の 25% をヒープに使用します。これは、多くのビルドワークロード用にチューニングする必要がある場合があります。詳細は、OpenShift Online での OpenJDK のサイジングについて参照してください。
Jenkins スレーブコンテナーのメモリー要求や制限の指定に関する情報は、Jenkins ドキュメントを参照してください。
4.3.4.1.1. Gradle ビルド
OpenShift の Jenkins スレーブで Gradle ビルドをホストすると、Jenkins JNLP エージェントおよび Gradle JVM に加え、Gradle が 3 番目の JVM を起動してテストを実行するので、複雑性が増します。
OpenShift での JVM のチューニングに関する参考情報は、OpenShift Online での OpenJDK のサイジングについて参照してください。
以下の設定は、OpenShift 上のメモリーに制約がある Jenkins スレーブで Gradle ビルドを実行する場合の開始点として推奨されます。必要に応じて、後で設定を緩和することができます。
-
gradle.properties ファイルに
org.gradle.daemon=false
を追加して、long-lived gradle デーモンを無効にするようにします。 -
gradle.properties ファイルで
org.gradle.parallel=true
が設定されていないこと、また、コマンドラインの引数として--parallel
が指定されていないことを確認して、並行ビルドの実行を無効にします。 -
build.gradle ファイルでの
java { options.fork = false }
を設定して、プロセス以外で Java がコンパイルされないようにします。 -
build.gradle ファイルで
test { maxParallelForks = 1 }
が設定されていることを確認して、複数の追加テストプロセスを無効にします。 - OpenShift Online での OpenJDK のサイジングに従い、GRADLE_OPTS, JAVA_OPTS または JAVA_TOOL_OPTIONS の環境変数で、gradle JVM メモリーパラメーターを上書きします。
-
buile.gradle の maxHeapSize および jvmArgs の設定、または
-Dorg.gradle.jvmargs
コマンドラインの引数で、Gradle テスト JVM に最大ヒープサイズおよび JVM の引数を設定します。