9.3. Jenkins エージェント
OpenShift Container Platform では、Jenkins エージェントとして使用するのに適したイメージを 3 つのイメージ (Base、Maven、および Node.js) を提供します。
1 番目は、Jenkins エージェントのベースイメージです。
-
必須のツール (ヘッドレス Java、Jenkins JNLP クライアント) と有用なツール (
git
、tar
、zip
、nss
など) の両方を取り入れます。 - JNLP エージェントをエントリーポイントとして確立します。
-
Jenkins ジョブ内からコマンドラインの操作を呼び出す
oc
クライアントツールが含まれます。 -
Red Hat Enterprise Linux (RHEL) および
localdev
イメージの両方の Dockerfile を提供します。
ベースイメージを拡張するイメージがさらに 2 つ提供されます。
- Maven v3.5 イメージ
- Node.js v8 イメージ
Maven および Node.js Jenkins エージェントイメージは、新しいエージェントイメージをビルドする際に参照できる Universal Base Image (UBI) 用の Dockerfile を提供します。contrib
および contrib/bin
サブディレクトリーにも注目してください。このサブディレクトリーでは、イメージの設定ファイルや実行可能なスクリプトの挿入が可能です。
OpenShift Container Platform のバージョンに適したエージェントイメージバージョンを使用し、継承します。エージェントイメージに埋め込まれた oc
クライアントバージョンが OpenShift Container Platform バージョンと互換性がない場合、予期しない動作が発生する可能性があります。
9.3.1. Jenkins エージェントイメージ
OpenShift Container Platform Jenkins エージェントイメージは quay.io
または registry.redhat.io
で利用できます。
Jenkins イメージは、Red Hat レジストリーから入手できます。
$ docker pull registry.redhat.io/openshift4/ose-jenkins:<v4.1.4> $ docker pull registry.redhat.io/openshift4/ose-jenkins-agent-nodejs:<v4.1.4> $ docker pull registry.redhat.io/openshift4/ose-jenkins-agent-maven:<v4.1.4> $ docker pull registry.redhat.io/openshift4/ose-jenkins-agent-base:<v4.1.4>
これらのイメージを使用するには、quay.io
または registry.redhat.io
から直接アクセスするか、これらを OpenShift Container Platform コンテナーイメージレジストリーにプッシュします。
9.3.2. Jenkins エージェントの環境変数
各 Jenkins エージェントコンテナーは、以下の環境変数で設定できます。
変数 | 定義 | 値と設定の例 |
---|---|---|
|
これらの値は Jenkins JVM の最大ヒープサイズを制御します。 デフォルトでは Jenkins JVM の最大ヒープサイズは、上限なしでコンテナーメモリー制限の 50% に設定されます。 |
|
|
これらの値は Jenkins JVM の初期ヒープサイズを制御します。 デフォルトでは、JVM は初期のヒープサイズを設定します。 |
|
| 設定されている場合には、内部の JVM スレッドのサイジング数に使用するコアの数を整数で指定します。 |
設定例: |
| このコンテナーで実行中のすべての JVM に適用するオプションを指定します。この値の上書きは推奨していません。 |
デフォルト: |
| Jenkins JVM ガーベッジコレクションのパラメーターを指定します。この値の上書きは推奨していません。 |
デフォルト: |
| Jenkins JVM の追加オプションを指定します。これらのオプションは、上記の Java オプションを含む、その他すべてのオプションに追加され、必要に応じてそれらのいずれかを上書きするために使用できます。追加オプションがある場合には、スペースで区切ります。オプションにスペース文字が含まれる場合には、バックスラッシュでエスケープしてください。 |
設定例: |
9.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% をヒープに使用します。多くのビルドワークロードにおいて、この制限の調整が必要になる場合があります。
9.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_OPTS
、JAVA_OPTS
、またはJAVA_TOOL_OPTIONS
環境変数で、Gradle JVM メモリーパラメーターを上書きします。 -
buile.gradle
のmaxHeapSize
およびjvmArgs
設定を定義するか、-Dorg .gradle. jvmargs
コマンドライン引数を使用して、Gradle テスト JVM に最大ヒープサイズと JVM の引数を設定します。
9.3.5. Jenkins エージェント Pod の保持
Jenkins エージェント Pod (別名: スレーブ Pod) は、ビルドが完了するか、または停止された後にデフォルトで削除されます。この動作は、Kubernetes プラグインの Pod Retention (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 は実行し続け、リソースクォータに対してカウントされる可能性があります。