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을 제공합니다. 또한 contribcontrib/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 에이전트 컨테이너는 다음 환경 변수를 사용하여 구성할 수 있습니다.

변수정의값 및 설정 예

JAVA_MAX_HEAP_PARAM, CONTAINER_HEAP_PERCENT, JENKINS_MAX_HEAP_UPPER_BOUND_MB

이 값은 Jenkins JVM의 최대 힙 크기를 제어합니다. JAVA_MAX_HEAP_PARAM이 설정된 경우 해당 값이 우선합니다. 설정되지 않은 경우 최대 힙 크기는 컨테이너 메모리 제한의 CONTAINER_HEAP_PERCENT로 동적으로 계산되며, 선택적으로 JENKINS_MAX_HEAP_UPPER_BOUND_MBMiB로 제한될 수 있습니다.

기본적으로 Jenkins JVM의 최대 힙 크기는 제한 없이 컨테이너 메모리 제한의 50%로 설정됩니다.

JAVA_MAX_HEAP_PARAM 설정 예: -Xmx512m

CONTAINER_HEAP_PERCENT 기본값: 0.5 또는 50%

JENKINS_MAX_HEAP_UPPER_BOUND_MB 설정 예: 512 MiB

JAVA_INITIAL_HEAP_PARAM, CONTAINER_INITIAL_PERCENT

이 값은 Jenkins JVM의 초기 힙 크기를 제어합니다. JAVA_INITIAL_HEAP_PARAM이 설정된 경우 해당 값이 우선합니다. 설정되지 않은 경우 초기 힙 크기는 동적으로 계산된 최대 힙 크기의 CONTAINER_INITIAL_PERCENT로 동적으로 계산됩니다.

기본적으로 JVM은 초기 힙 크기를 설정합니다.

JAVA_INITIAL_HEAP_PARAM 설정 예: -Xms32m

CONTAINER_INITIAL_PERCENT 설정 예: 0.1 또는 10%

CONTAINER_CORE_LIMIT

설정되는 경우 내부 JVM 스레드 수를 조정하는 데 사용되는 정수 코어 수를 지정합니다.

설정 예: 2

JAVA_TOOL_OPTIONS

이 컨테이너에서 실행되는 모든 JVM에 적용할 옵션을 지정합니다. 이 값은 재정의하지 않는 것이 좋습니다.

Default: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Dsun.zip.disableMemoryMapping=true

JAVA_GC_OPTS

Jenkins JVM 가비지 컬렉션 매개변수를 지정합니다. 이 값은 재정의하지 않는 것이 좋습니다.

Default: -XX:+UseParallelGC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90

JENKINS_JAVA_OVERRIDES

Jenkins JVM에 대한 추가 옵션을 지정합니다. 이러한 옵션은 위의 Java 옵션을 포함하여 다른 모든 옵션에 추가되며 필요한 경우 옵션을 재정의하는 데 사용될 수 있습니다. 각각의 추가 옵션을 공백으로 구분하고 옵션에 공백 문자가 포함되어 있으면 백슬래시로 이스케이프합니다.

설정 예: -Dfoo -Dbar; -Dfoo=first\ value -Dbar=second\ value

USE_JAVA_VERSION

컨테이너에서 에이전트를 실행하는 데 사용할 Java 버전의 버전을 지정합니다. 컨테이너 기본 이미지에는 java-11java-1.8.0 의 두 가지 버전이 설치되어 있습니다. 컨테이너 기본 이미지를 확장하는 경우 관련 접미사를 사용하여 java의 대체 버전을 지정할 수 있습니다.

기본값은 java-11 입니다.

설정 예: java-1.8.0

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=falsegradle.properties 파일에 추가하여 오래된 Gradle 데몬이 비활성화되었는지 확인합니다.
  • org.gradle.parallel=truegradle.properties 파일에서 설정되지 않았고 --parallel이 명령줄 인수로 설정되지 않았음을 확인하여 병렬 빌드 실행을 비활성화합니다.
  • Java 컴파일이 프로세스 외부에서 실행되지 않도록 하려면 build.gradle 파일에서 java { options.fork = false }를 설정합니다.
  • build.gradle 파일에서 test { maxParallelForks = 1 }가 설정되었는지 확인하여 여러 추가 테스트 프로세스를 비활성화합니다.
  • GRADLE_OPTS, JAVA_OPTS 또는 JAVA_TOOL_OPTIONS 환경 변수를 통해 Gradle JVM 메모리 매개변수를 재정의합니다.
  • maxHeapSizejvmArgs 설정을 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를 계속 실행하면서 리소스 할당량에 대한 계산에 반영할 수 있습니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.