5.2. 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 이미지는 기본 이미지를 확장합니다. 새 에이전트 이미지를 빌드할 때 참조할 수 있는 UBI(Universal Base Image)에 Dockerfile을 제공합니다. 또한 contrib
및 contrib/bin
하위 디렉터리에 주의하여 이미지에 대한 구성 파일과 실행 가능한 스크립트를 삽입할 수 있습니다.
OpenShift Container Platform 릴리스 버전에 적합한 에이전트 이미지 버전을 사용합니다. OpenShift Container Platform 버전과 호환되지 않는 oc
클라이언트 버전을 포함하면 예기치 않은 동작이 발생할 수 있습니다.
OpenShift Container Platform Jenkins 이미지는 Jenkins Kubernetes 플러그인에서 이러한 에이전트 이미지를 사용하는 방법을 설명하기 위해 다음 샘플 Pod 템플릿도 정의합니다.
-
OpenShift Container Platform Maven Jenkins 에이전트 이미지를 사용하는 단일 컨테이너를 사용하는
maven
pod 템플릿. -
nodejs
pod 템플릿은 OpenShift Container Platform Node.js Jenkins 에이전트 이미지를 사용하는 단일 컨테이너를 사용합니다. -
두 개의 컨테이너를 사용하는
java-builder
포드 템플릿. 하나는jnlp
컨테이너입니다. OpenShift Container Platform Base 에이전트 이미지를 사용하고 Jenkins 에이전트를 시작하고 중지하기 위해 JNLP 계약을 처리합니다. 두 번째는 코드를 빌드하기 위해 Maven 바이너리mvn
을 포함하여 다양한 Java 바이너리가 포함된java
-
두 개의 컨테이너를 사용하는
nodejs-builder
포드 템플릿. 하나는jnlp
컨테이너입니다. OpenShift Container Platform Base 에이전트 이미지를 사용하고 Jenkins 에이전트를 시작하고 중지하기 위해 JNLP 계약을 처리합니다. 두 번째는 코드를 빌드하기 위한npm
바이너리를 포함하여 다양한 Node.js 바이너리를 포함하는nodejs
OpenShift Container Platform Sample ImageStream을 사용하는nodejs
컨테이너입니다.
5.2.1. Jenkins 에이전트 이미지
OpenShift Container Platform Jenkins 에이전트 이미지는 Quay.io 또는 registry.redhat.io 에서 사용할 수 있습니다.
Jenkins 이미지는 Red Hat Registry를 통해 사용할 수 있습니다.
$ 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에 적용할 옵션을 지정합니다. 이 값은 재정의하지 않는 것이 좋습니다. |
Default: |
| Jenkins JVM 가비지 컬렉션 매개변수를 지정합니다. 이 값은 재정의하지 않는 것이 좋습니다. |
Default: |
| 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을 종료하지 않고는 나머지 50%의 메모리 제한을 초과하여 사용할 수 없습니다.
기본적으로 Jenkins 에이전트 컨테이너에서 실행되는 각각의 추가 JVM 프로세스는 힙에 대해 컨테이너 메모리 제한의 최대 25%를 사용합니다. 많은 빌드 워크로드에 대해 이 제한을 튜닝해야 할 수도 있습니다.
5.2.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 인수를 설정합니다.
5.2.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를 계속 실행하면서 리소스 할당량에 대한 계산에 반영할 수 있습니다.