12.3. Jenkins 에이전트
OpenShift Container Platform은 Jenkins 에이전트가 사용하기에 적합한 세 개의 이미지 Base
, Maven
, Node.js
를 제공합니다.
첫 번째는 Jenkins 에이전트를 위한 기본 이미지입니다.
-
필수 도구, 헤드리스 Java, Jenkins JNLP 클라이언트 그리고
git
,tar
,zip
,nss
등 유용한 도구를 모두 가져옵니다. - JNLP 에이전트를 진입점으로 설정합니다.
-
Jenkins 작업 내에서 명령줄 작업을 호출하는 데 필요한
oc
클라이언트 도구가 포함되어 있습니다. -
RHEL(Red Hat Enterprise Linux) 및
localdev
이미지 둘 다에 대해 Dockerfile을 제공합니다.
기본 이미지를 확장하는 이미지도 두 개 더 제공합니다.
- Maven v3.5 이미지
- Node.js v10 이미지 및 Node.js v12 이미지
Maven 및 Node.js Jenkins 에이전트 이미지는 새 에이전트 이미지를 빌드하는 경우 참조할 수 있는 UBI(Universal Base Image)에 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 Registry를 통해 사용할 수 있습니다.
$ 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 에이전트 컨테이너는 다음 환경 변수를 사용하여 구성할 수 있습니다.
변수 | 정의 | 값 및 설정 예 |
---|---|---|
|
이 값은 Jenkins JVM의 최대 힙 크기를 제어합니다. 기본적으로 Jenkins JVM의 최대 힙 크기는 제한 없이 컨테이너 메모리 제한의 50%로 설정됩니다. |
|
|
이 값은 Jenkins JVM의 초기 힙 크기를 제어합니다. 기본적으로 JVM은 초기 힙 크기를 설정합니다. |
|
| 설정되는 경우 내부 JVM 스레드 수를 조정하는 데 사용되는 정수 코어 수를 지정합니다. |
설정 예: |
| 이 컨테이너에서 실행되는 모든 JVM에 적용할 옵션을 지정합니다. 이 값은 재정의하지 않는 것이 좋습니다. |
Default: |
| Jenkins JVM 가비지 컬렉션 매개변수를 지정합니다. 이 값은 재정의하지 않는 것이 좋습니다. |
Default: |
| Jenkins JVM에 대한 추가 옵션을 지정합니다. 이러한 옵션은 위의 Java 옵션을 포함하여 다른 모든 옵션에 추가되며 필요한 경우 옵션을 재정의하는 데 사용될 수 있습니다. 각각의 추가 옵션을 공백으로 구분하고 옵션에 공백 문자가 포함되어 있으면 백슬래시로 이스케이프합니다. |
설정 예: |
|
컨테이너에서 에이전트를 실행하는 데 사용할 Java 버전의 버전을 지정합니다. 컨테이너 기본 이미지에는 |
기본값은
설정 예: |
12.3.3. Jenkins 에이전트 메모리 요구 사항
JVM은 모든 Jenkins 에이전트에서 Jenkins JNLP 에이전트를 호스트하고 javac
, Maven 또는 Gradle 같은 Java 애플리케이션을 실행하는 데 사용됩니다.
기본적으로 Jenkins JNLP 에이전트 JVM은 힙에 대해 컨테이너 메모리 제한의 50%를 사용합니다. 이 값은 CONTAINER_HEAP_PERCENT
환경 변수를 통해 수정할 수 있습니다. 상한값으로 제한하거나 완전히 재정의할 수도 있습니다.
파이프라인에서 실행되는 쉘 스크립트나 oc
명령과 같이 Jenkins 에이전트 컨테이너에서 실행되는 다른 모든 프로세스는 기본적으로 OOM을 종료하지 않고는 나머지 50%의 메모리 제한을 초과하여 사용할 수 없습니다.
기본적으로 Jenkins 에이전트 컨테이너에서 실행되는 각각의 추가 JVM 프로세스는 힙에 대해 컨테이너 메모리 제한의 최대 25%를 사용합니다. 많은 빌드 워크로드에 대해 이 제한을 튜닝해야 할 수도 있습니다.
12.3.4. Jenkins 에이전트 Gradle 빌드
OpenShift Container Platform의 Jenkins 에이전트에서 Gradle 빌드를 호스트하면 Jenkins JNLP 에이전트 및 Gradle JVM 외에도 여러 빌드가 지정된 경우 테스트를 실행하는 세 번째 JVM을 Gradle이 생성하므로 복잡성이 더욱 가중됩니다.
다음은 OpenShift Container Platform의 메모리가 제한된 Jenkins 에이전트에서 Gradle 빌드를 실행하기 위한 시작점으로 제안된 설정입니다. 필요에 따라 이러한 설정을 수정할 수 있습니다.
-
org.gradle.daemon=false
를gradle.properties
파일에 추가하여 오래된 Gradle 데몬이 비활성화되었는지 확인합니다. -
org.gradle.parallel=true
가gradle.properties
파일에서 설정되지 않았고--parallel
이 명령줄 인수로 설정되지 않았음을 확인하여 병렬 빌드 실행을 비활성화합니다. -
Java 컴파일이 프로세스 외부에서 실행되지 않도록 하려면
build.gradle
파일에서java { options.fork = false }
를 설정합니다. -
build.gradle
파일에서test { maxParallelForks = 1 }
가 설정되었는지 확인하여 여러 추가 테스트 프로세스를 비활성화합니다. -
GRADLE_OPTS
,JAVA_OPTS
또는JAVA_TOOL_OPTIONS
환경 변수를 통해 Gradle JVM 메모리 매개변수를 재정의합니다. -
maxHeapSize
및jvmArgs
설정을build.gradle
에서 정의하거나-Dorg.gradle.jvmargs
명령줄 인수를 통해 Gradle 테스트 JVM에 대한 최대 힙 크기 및 JVM 인수를 설정합니다.
12.3.5. Jenkins 에이전트 pod 보존
Jenkins 에이전트 pod는 빌드가 완료되거나 중지되면 기본적으로 삭제됩니다. 이 동작은 Kubernetes 플러그인 pod 보존 설정을 통해 변경할 수 있습니다. pod 보존은 각 pod 템플릿에 대한 재정의를 통해 모든 Jenkins 빌드에 대해 설정할 수 있습니다. 지원되는 동작은 다음과 같습니다.
-
Always
는 빌드 결과에 관계없이 빌드 pod를 유지합니다. -
Default
는 플러그인 값을 사용합니다. 이 값은 pod 템플릿만 사용합니다. -
Never
는 pod를 항상 삭제합니다. -
On Failure
는 빌드 중 실패하면 pod를 유지합니다.
pod 보존은 Pipeline Jenkinsfile에서 재정의할 수 있습니다.
podTemplate(label: "mypod",
cloud: "openshift",
inheritFrom: "maven",
podRetention: onFailure(), 1
containers: [
...
]) {
node("mypod") {
...
}
}
- 1
podRetention
에 대해 허용되는 값은never()
,onFailure()
,always()
및default()
입니다.
보존된 pod를 계속 실행하면서 리소스 할당량에 대한 계산에 반영할 수 있습니다.