5.2. Jenkins エージェント
OpenShift Container Platform は、Jenkins エージェントとして使用するベースイメージを提供します。
Jenkins エージェントのベースイメージは次のことを行います。
-
必須のツール (ヘッドレス Java、Jenkins JNLP クライアント) と有用なツール (
git
、tar
、zip
、nss
など) の両方を取り入れます。 - JNLP エージェントをエントリーポイントとして確立します。
-
Jenkins ジョブ内からコマンドラインの操作を呼び出す
oc
クライアントツールが含まれます。 -
Red Hat Enterprise Linux (RHEL) および
localdev
イメージの両方の Dockerfile を提供します。
OpenShift Container Platform リリースバージョンに適したバージョンのエージェントイメージを使用してください。OpenShift Container Platform バージョンと互換性のない oc
クライアントバージョンを埋め込むと、予期しない動作が発生する可能性があります。
OpenShift Container Platform Jenkins イメージは、Jenkins Kubernetes プラグインでエージェントイメージを使用する方法を示すために、次のサンプル java-builder
Pod テンプレートも定義します。
java-builder
Pod テンプレートは、次の 2 つのコンテナーを使用します。
-
OpenShift Container Platform Base エージェントイメージを使用し、Jenkins エージェントの起動と停止のための JNLP 契約を処理する
jnlp
コンテナー。 -
java
OpenShift Container Platform サンプル ImageStream を使用するjava
コンテナー。これには、コードをビルドするための Maven バイナリーmvn
を含むさまざまな Java バイナリーが含まれています。
5.2.1. Jenkins エージェントイメージ
OpenShift Container Platform Jenkins エージェントイメージは Quay.io または registry.redhat.io で利用できます。
Jenkins イメージは、Red Hat レジストリーから入手できます。
$ docker pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>
$ docker pull registry.redhat.io/ocp-tools-4/jenkins-agent-base-rhel8:<image_tag>
これらのイメージを使用するには、Quay.io または registry.redhat.io から直接アクセスするか、これらを OpenShift Container Platform コンテナーイメージレジストリーにプッシュします。
5.2.2. Jenkins エージェントの環境変数
各 Jenkins エージェントコンテナーは、以下の環境変数で設定できます。
変数 | 定義 | 値と設定の例 |
---|---|---|
|
これらの値は Jenkins JVM の最大ヒープサイズを制御します。 デフォルトでは Jenkins JVM の最大ヒープサイズは、上限なしでコンテナーメモリー制限の 50% に設定されます。 |
|
|
これらの値は Jenkins JVM の初期ヒープサイズを制御します。 デフォルトでは、JVM は初期のヒープサイズを設定します。 |
|
| 設定されている場合は、内部の JVM スレッドのサイジング数に使用するコアの数を整数で指定します。 |
設定例: |
| このコンテナーで実行中のすべての JVM に適用するオプションを指定します。この値の上書きは推奨されません。 |
デフォルト: |
| Jenkins JVM ガーベッジコレクションのパラメーターを指定します。この値の上書きは推奨されません。 |
デフォルト: |
| Jenkins JVM の追加オプションを指定します。これらのオプションは、上記の Java オプションを含む、その他すべてのオプションに追加され、必要に応じてそれらのいずれかを上書きするために使用できます。追加オプションがある場合は、スペースで区切ります。オプションにスペース文字が含まれる場合は、バックスラッシュでエスケープしてください。 |
設定例: |
|
コンテナーでエージェントを実行するために使用する Java バージョンのバージョンを指定します。コンテナーの基本イメージには、 |
デフォルト値は
設定例: |
5.2.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% をヒープに使用します。多くのビルドワークロードにおいて、この制限の調整が必要になる場合があります。
5.2.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_OPTS
、JAVA_OPTS
、またはJAVA_TOOL_OPTIONS
環境変数で、Gradle JVM メモリーパラメーターを上書きします。 -
build.gradle
のmaxHeapSize
およびjvmArgs
設定を定義するか、-Dorg.gradle.jvmargs
コマンドライン引数を使用して、Gradle テスト JVM に最大ヒープサイズと JVM の引数を設定します。
5.2.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 は実行し続け、リソースクォータに対してカウントされる可能性があります。