1.9. Jenkins Kubernetes 플러그인 사용
다음 예에서는 openshift-jee-sample
BuildConfig
오브젝트로 인해 Jenkins Maven 에이전트 pod가 동적으로 프로비저닝됩니다. pod는 일부 Java 소스 코드를 복제하고 WAR 파일을 빌드하며 두 번째 BuildConfig
인 openshift-jee-sample-docker
가 실행되도록 합니다. 두 번째 BuildConfig
는 컨테이너 이미지에 새 WAR 파일의 계층을 지정합니다.
AWS 4.11의 Red Hat OpenShift Service는 OpenShift Jenkins Maven 및 NodeJS Agent 이미지를 페이로드에서 제거했습니다. Red Hat은 더 이상 이러한 이미지를 생성하지 않으며 registry.redhat.io
의 ocp-tools-4
리포지토리에서 사용할 수 없습니다. Red Hat은 AWS 라이프사이클 정책의 Red Hat OpenShift Service에 따라 중요한 버그 수정 또는 보안 CVE에 대해 4.10 및 이전 버전의 이미지를 유지 관리합니다.
자세한 내용은 다음 "추가 리소스" 섹션의 "OpenShift Jenkins 이미지에 대한 중요한 변경 사항" 링크를 참조하십시오.
Jenkins Kubernetes 플러그인을 사용하는 BuildConfig
예
kind: List apiVersion: v1 items: - kind: ImageStream apiVersion: image.openshift.io/v1 metadata: name: openshift-jee-sample - kind: BuildConfig apiVersion: build.openshift.io/v1 metadata: name: openshift-jee-sample-docker spec: strategy: type: Docker source: type: Docker dockerfile: |- FROM openshift/wildfly-101-centos7:latest COPY ROOT.war /wildfly/standalone/deployments/ROOT.war CMD $STI_SCRIPTS_PATH/run binary: asFile: ROOT.war output: to: kind: ImageStreamTag name: openshift-jee-sample:latest - kind: BuildConfig apiVersion: build.openshift.io/v1 metadata: name: openshift-jee-sample spec: strategy: type: JenkinsPipeline jenkinsPipelineStrategy: jenkinsfile: |- node("maven") { sh "git clone https://github.com/openshift/openshift-jee-sample.git ." sh "mvn -B -Popenshift package" sh "oc start-build -F openshift-jee-sample-docker --from-file=target/ROOT.war" } triggers: - type: ConfigChange
동적으로 생성된 Jenkins 에이전트 pod의 사양을 재정의할 수도 있습니다. 다음은 이전 예를 수정하여 컨테이너 메모리를 재정의하고 환경 변수를 지정했습니다.
Jenkins Kubernetes 플러그인을 사용하여 메모리 제한 및 환경 변수를 지정하는 BuildConfig
샘플
kind: BuildConfig apiVersion: build.openshift.io/v1 metadata: name: openshift-jee-sample spec: strategy: type: JenkinsPipeline jenkinsPipelineStrategy: jenkinsfile: |- podTemplate(label: "mypod", 1 cloud: "openshift", 2 inheritFrom: "maven", 3 containers: [ containerTemplate(name: "jnlp", 4 image: "openshift/jenkins-agent-maven-35-centos7:v3.10", 5 resourceRequestMemory: "512Mi", 6 resourceLimitMemory: "512Mi", 7 envVars: [ envVar(key: "CONTAINER_HEAP_PERCENT", value: "0.25") 8 ]) ]) { node("mypod") { 9 sh "git clone https://github.com/openshift/openshift-jee-sample.git ." sh "mvn -B -Popenshift package" sh "oc start-build -F openshift-jee-sample-docker --from-file=target/ROOT.war" } } triggers: - type: ConfigChange
- 1
mypod
라는 새로운 pod 템플릿이 동적으로 정의됩니다. 새 pod 템플릿 이름이 노드 스탠자에서 참조됩니다.- 2
cloud
값은openshift
로 설정되어야 합니다.- 3
- 새 pod 템플릿은 기존 pod 템플릿의 구성을 상속할 수 있습니다. 이 경우, AWS의 Red Hat OpenShift Service에 의해 미리 정의된 Maven pod 템플릿에서 상속됩니다.
- 4
- 이 예에서는 기존 컨테이너의 값을 재정의하며, 이름별로 지정해야 합니다. AWS의 Red Hat OpenShift Service와 함께 제공되는 모든 Jenkins 에이전트 이미지는 컨테이너 이름
jnlp
를 사용합니다. - 5
- 컨테이너 이미지 이름을 다시 지정하십시오. 이것은 확인된 문제입니다.
- 6
512 Mi
메모리 요청이 지정되었습니다.- 7
512 Mi
메모리 제한이 지정되었습니다.- 8
- 값이
0.25
인 환경 변수CONTAINER_HEAP_PERCENT
가 지정되었습니다. - 9
- 노드 스탠자는 정의된 pod 템플릿의 이름을 참조합니다.
기본적으로 pod는 빌드가 완료되면 삭제됩니다. 이 동작은 플러그인 또는 파이프라인 Jenkinsfile 내에서 수정할 수 있습니다.
업스트림 Jenkins는 최근에 파이프라인과 함께 podTemplate
파이프라인 DSL을 정의하는 YAML 선언 형식을 도입했습니다. AWS Jenkins 이미지의 Red Hat OpenShift Service에 정의된 샘플 java-builder
pod 템플릿을 사용하여 이 형식의 예입니다.
def nodeLabel = 'java-buidler' pipeline { agent { kubernetes { cloud 'openshift' label nodeLabel yaml """ apiVersion: v1 kind: Pod metadata: labels: worker: ${nodeLabel} spec: containers: - name: jnlp image: image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest args: ['\$(JENKINS_SECRET)', '\$(JENKINS_NAME)'] - name: java image: image-registry.openshift-image-registry.svc:5000/openshift/java:latest command: - cat tty: true """ } } options { timeout(time: 20, unit: 'MINUTES') } stages { stage('Build App') { steps { container("java") { sh "mvn --version" } } } } }