5.4. 파이프라인 빌드
파이프라인 빌드 전략은 OpenShift Container Platform 4에서 더 이상 사용되지 않습니다. 동등하고 향상된 기능은 Tekton 기반 OpenShift Container Platform Pipelines에 있습니다.
OpenShift Container Platform의 Jenkins 이미지는 완전히 지원되며 사용자는 Jenkins 사용 설명서를 따라 작업에 jenkinsfile
을 정의하거나 소스 제어 관리 시스템에 저장해야 합니다.
Pipeline 빌드 전략을 사용하면 개발자가 Jenkins 파이프라인 플러그인에서 사용할 Jenkins 파이프라인을 정의할 수 있습니다. 다른 빌드 유형과 동일한 방식으로 OpenShift Container Platform에서 빌드를 시작, 모니터링, 관리할 수 있습니다.
파이프라인 워크플로는 빌드 구성에 직접 포함하거나 Git 리포지토리에 제공하는 방식으로 jenkinsfile
에 정의하고 빌드 구성에서 참조합니다.
5.4.1. OpenShift Container Platform 파이프라인 이해
파이프라인 빌드 전략은 OpenShift Container Platform 4에서 더 이상 사용되지 않습니다. 동등하고 향상된 기능은 Tekton 기반 OpenShift Container Platform Pipelines에 있습니다.
OpenShift Container Platform의 Jenkins 이미지는 완전히 지원되며 사용자는 Jenkins 사용 설명서를 따라 작업에 jenkinsfile
을 정의하거나 소스 제어 관리 시스템에 저장해야 합니다.
파이프라인을 사용하면 OpenShift Container Platform에서 애플리케이션의 빌드, 배포, 승격을 제어할 수 있습니다. Jenkins Pipeline 빌드 전략, jenkinsfiles
및 Jenkins 클라이언트 플러그인에서 제공하는 OpenShift Container Platform DSL(Domain Specific Language)의 조합을 사용하면 모든 시나리오에 대한 고급 빌드, 테스트, 배포, 승격 파이프라인을 생성할 수 있습니다.
OpenShift Container Platform Jenkins 동기화 플러그인
OpenShift Container Platform Jenkins 동기화 플러그인은 Jenkins 작업 및 빌드와 동기화된 빌드 구성 및 빌드 오브젝트를 유지하고 다음 기능을 제공합니다.
- Jenkins에서 동적 작업 및 실행 생성
- 이미지 스트림, 이미지 스트림 태그 또는 구성 맵에서 에이전트 Pod 템플릿 동적 생성
- 환경 변수입니다.
- OpenShift Container Platform 웹 콘솔의 파이프라인 시각화
- OpenShift Container Platform 빌드의 커밋 정보를 Jenkins Git 플러그인에 전달하는 Jenkins Git 플러그인과 통합됩니다.
- Jenkins 인증 정보 항목에 대한 시크릿 동기화.
OpenShift Container Platform Jenkins 클라이언트 플러그인
OpenShift Container Platform Jenkins 클라이언트 플러그인은 Jenkins 플러그인 중 하나로, OpenShift Container Platform API 서버와의 다양한 상호 작용을 위해 읽기 쉽고 간결하고 포괄적이며 유창한 Jenkins Pipeline 구문을 제공하기 위한 것입니다. 플러그인은 OpenShift Container Platform 명령줄 툴인 oc
를 사용하는데 스크립트를 실행하는 노드에서 이 툴을 사용할 수 있어야 합니다.
Jenkins 클라이언트 플러그인은 애플리케이션의 jenkinsfile
내에서 OpenShift Container Platform DSL을 사용할 수 있도록 Jenkins 마스터에 설치해야 합니다. 이 플러그인은 OpenShift Container Platform Jenkins 이미지를 사용할 때 기본적으로 설치 및 활성화됩니다.
프로젝트 내 OpenShift Container Platform Pipeline의 경우 Jenkins Pipeline 빌드 전략을 사용해야 합니다. 이 전략에서는 기본적으로 소스 리포지토리의 루트에서 jenkinsfile
을 사용하지만 다음과 같은 구성 옵션을 제공합니다.
-
빌드 구성 내의 인라인
jenkinsfile
필드 -
소스
contextDir
에 상대적으로 사용할jenkinsfile
의 위치를 참조하는, 빌드 구성 내의jenkinsfilePath
필드
선택적 jenkinsfilePath
필드는 소스 contextDir
에 상대적으로 사용할 파일의 이름을 지정합니다. contextDir
이 생략된 경우 기본값은 리포지토리의 루트입니다. jenkinsfilePath
가 생략된 경우 기본값은 jenkinsfile
입니다.
5.4.2. 파이프라인 빌드를 위한 Jenkins 파일 제공
파이프라인 빌드 전략은 OpenShift Container Platform 4에서 더 이상 사용되지 않습니다. 동등하고 향상된 기능은 Tekton 기반 OpenShift Container Platform Pipelines에 있습니다.
OpenShift Container Platform의 Jenkins 이미지는 완전히 지원되며 사용자는 Jenkins 사용 설명서를 따라 작업에 jenkinsfile
을 정의하거나 소스 제어 관리 시스템에 저장해야 합니다.
jenkinsfile
에서는 표준 Groovy 언어 구문을 사용하여 애플리케이션의 구성, 빌드, 배포를 세부적으로 제어할 수 있습니다.
다음 방법 중 하나로 jenkinsfile
을 제공할 수 있습니다.
- 소스 코드 리포지토리에 있는 파일
-
jenkinsfile
필드를 사용하여 빌드 구성의 일부로 포함
첫 번째 옵션을 사용하는 경우 다음 위치 중 하나의 애플리케이션 소스 코드 리포지토리에 jenkinsfile
을 포함해야 합니다.
-
리포지토리 루트에 있는
jenkinsfile
이라는 파일 -
리포지토리의 소스
contextDir
루트에 있는jenkinsfile
이라는 파일 -
BuildConfig의
JenkinsPipelineStrategy
섹션에 있는jenkinsfilePath
필드를 통해 지정되는 파일 이름(제공되는 경우 소스contextDir
에 상대적이고 제공되지 않는 경우 기본값은 리포지토리의 루트임)
jenkinsfile
은 Jenkins 에이전트 Pod에서 실행됩니다. OpenShift Container Platform DSL을 사용하려면 해당 Pod에 사용 가능한 OpenShift Container Platform 클라이언트 바이너리가 있어야 합니다.
프로세스
다음 중 하나를 수행하여 Jenkins 파일을 제공할 수 있습니다.
- 빌드 구성에 Jenkins 파일 포함
- 빌드 구성에 Jenkins 파일이 포함된 Git 리포지토리에 대한 참조 포함
포함된 정의
kind: "BuildConfig" apiVersion: "v1" metadata: name: "sample-pipeline" spec: strategy: jenkinsPipelineStrategy: jenkinsfile: |- node('agent') { stage 'build' openshiftBuild(buildConfig: 'ruby-sample-build', showBuildLogs: 'true') stage 'deploy' openshiftDeploy(deploymentConfig: 'frontend') }
Git 리포지토리에 대한 참조
kind: "BuildConfig"
apiVersion: "v1"
metadata:
name: "sample-pipeline"
spec:
source:
git:
uri: "https://github.com/openshift/ruby-hello-world"
strategy:
jenkinsPipelineStrategy:
jenkinsfilePath: some/repo/dir/filename 1
- 1
- 선택적
jenkinsfilePath
필드는 소스contextDir
에 상대적으로 사용할 파일의 이름을 지정합니다.contextDir
이 생략된 경우 기본값은 리포지토리의 루트입니다.jenkinsfilePath
가 생략된 경우 기본값은jenkinsfile
입니다.
5.4.3. 파이프라인 빌드에 환경 변수 사용
파이프라인 빌드 전략은 OpenShift Container Platform 4에서 더 이상 사용되지 않습니다. 동등하고 향상된 기능은 Tekton 기반 OpenShift Container Platform Pipelines에 있습니다.
OpenShift Container Platform의 Jenkins 이미지는 완전히 지원되며 사용자는 Jenkins 사용 설명서를 따라 작업에 jenkinsfile
을 정의하거나 소스 제어 관리 시스템에 저장해야 합니다.
파이프라인 빌드 프로세스에서 환경 변수를 사용할 수 있도록 하려면 빌드 구성의 jenkinsPipelineStrategy
정의에 환경 변수를 추가하면 됩니다.
정의된 환경 변수는 빌드 구성과 관련된 모든 Jenkins 작업의 매개변수로 설정됩니다.
프로세스
빌드 중 사용할 환경 변수를 정의하려면 YAML 파일을 다음과 같이 편집합니다.
jenkinsPipelineStrategy: ... env: - name: "FOO" value: "BAR"
oc set env
명령을 사용하면 빌드 구성에 정의된 환경 변수도 관리할 수 있습니다.
5.4.3.1. BuildConfig 환경 변수 및 Jenkins 작업 매개변수 간 매핑
파이프라인 전략 빌드 구성의 변경 사항에 따라 Jenkins 작업이 생성되거나 업데이트되면 빌드 구성의 모든 환경 변수가 Jenkins 작업 매개 변수 정의에 매핑됩니다. 여기서 Jenkins 작업 매개변수 정의의 기본값은 연결된 환경 변수의 현재 값입니다.
Jenkins 작업의 초기 생성 후에도 Jenkins 콘솔에서 작업에 매개변수를 추가할 수 있습니다. 매개변수 이름은 빌드 구성의 환경 변수 이름과 다릅니다. 매개변수는 해당 Jenkins 작업에 대한 빌드가 시작될 때 적용됩니다.
Jenkins 작업의 빌드를 시작하는 방법에 따라 매개변수 설정 방법이 결정됩니다.
-
oc start-build
로 시작하는 경우 빌드 구성의 환경 변수 값은 해당 작업 인스턴스에 설정된 매개변수입니다. Jenkins 콘솔에서 매개변수 기본값을 변경하면 해당 변경 사항이 무시됩니다. 빌드 구성 값이 우선합니다. oc start-build -e
로 시작하는 경우-e
옵션에 지정된 환경 변수의 값이 우선합니다.- 빌드 구성에 나열되지 않은 환경 변수를 지정하면 Jenkins 작업 매개변수 정의로 추가됩니다.
-
Jenkins 콘솔에서 환경 변수에 해당하는 매개변수를 변경하면 해당 변경 사항이 무시됩니다. 빌드 구성 및
oc start-build -e
로 지정하는 항목이 우선합니다.
- Jenkins 콘솔에서 Jenkins 작업을 시작하면 작업의 빌드를 시작하는 과정의 일부로 Jenkins 콘솔을 사용하여 매개변수 설정을 제어할 수 있습니다.
빌드 구성에서 작업 매개변수와 연결할 수 있는 모든 환경 변수를 지정하는 것이 좋습니다. 이렇게 하면 디스크 I/O가 줄어들고 Jenkins 처리 중 성능이 향상됩니다.
5.4.4. 파이프라인 빌드 튜토리얼
파이프라인 빌드 전략은 OpenShift Container Platform 4에서 더 이상 사용되지 않습니다. 동등하고 향상된 기능은 Tekton 기반 OpenShift Container Platform Pipelines에 있습니다.
OpenShift Container Platform의 Jenkins 이미지는 완전히 지원되며 사용자는 Jenkins 사용 설명서를 따라 작업에 jenkinsfile
을 정의하거나 소스 제어 관리 시스템에 저장해야 합니다.
이 예제에서는 nodejs-mongodb.json
템플릿을 사용하여 Node.js/MongoDB
애플리케이션을 빌드, 배포, 확인할 OpenShift Container Platform Pipeline을 생성하는 방법을 보여줍니다.
프로세스
Jenkins 마스터를 생성합니다.
$ oc project <project_name>
사용할 프로젝트를 선택하거나
oc new-project <project_name>
을 사용하여 새 프로젝트를 생성합니다.$ oc new-app jenkins-ephemeral 1
영구 스토리지를 사용하려면 대신
jenkins-persistent
를 사용합니다.다음 콘텐츠를 사용하여
nodejs-sample-pipeline.yaml
이라는 파일을 생성합니다.참고이 과정에서 Jenkins Pipeline 전략을 사용하여
Node.js/MongoDB
예제 애플리케이션을 빌드, 배포, 스케일링하는BuildConfig
오브젝트가 생성됩니다.kind: "BuildConfig" apiVersion: "v1" metadata: name: "nodejs-sample-pipeline" spec: strategy: jenkinsPipelineStrategy: jenkinsfile: <pipeline content from below> type: JenkinsPipeline
jenkinsPipelineStrategy
를 사용하여BuildConfig
오브젝트를 생성한 후에는 인라인jenkinsfile
을 사용하여 파이프라인에 수행할 작업을 지시합니다.참고이 예에서는 애플리케이션에 대한 Git 리포지토리를 설정하지 않습니다.
다음
jenkinsfile
콘텐츠는 OpenShift Container Platform DSL을 사용하여 Groovy로 작성됩니다. 소스 리포지토리에jenkinsfile
을 포함하는 것이 기본 방법이지만 이 예제에서는 YAML 리터럴 스타일을 사용하여BuildConfig
오브젝트에 인라인 콘텐츠를 포함합니다.def templatePath = 'https://raw.githubusercontent.com/openshift/nodejs-ex/master/openshift/templates/nodejs-mongodb.json' 1 def templateName = 'nodejs-mongodb-example' 2 pipeline { agent { node { label 'nodejs' 3 } } options { timeout(time: 20, unit: 'MINUTES') 4 } stages { stage('preamble') { steps { script { openshift.withCluster() { openshift.withProject() { echo "Using project: ${openshift.project()}" } } } } } stage('cleanup') { steps { script { openshift.withCluster() { openshift.withProject() { openshift.selector("all", [ template : templateName ]).delete() 5 if (openshift.selector("secrets", templateName).exists()) { 6 openshift.selector("secrets", templateName).delete() } } } } } } stage('create') { steps { script { openshift.withCluster() { openshift.withProject() { openshift.newApp(templatePath) 7 } } } } } stage('build') { steps { script { openshift.withCluster() { openshift.withProject() { def builds = openshift.selector("bc", templateName).related('builds') timeout(5) { 8 builds.untilEach(1) { return (it.object().status.phase == "Complete") } } } } } } } stage('deploy') { steps { script { openshift.withCluster() { openshift.withProject() { def rm = openshift.selector("dc", templateName).rollout() timeout(5) { 9 openshift.selector("dc", templateName).related('pods').untilEach(1) { return (it.object().status.phase == "Running") } } } } } } } stage('tag') { steps { script { openshift.withCluster() { openshift.withProject() { openshift.tag("${templateName}:latest", "${templateName}-staging:latest") 10 } } } } } } }
- 1
- 사용할 템플릿의 경로입니다.
- 1 2
- 생성할 템플릿의 이름입니다.
- 3
- 이 빌드를 실행할
node.js
에이전트 Pod를 구동합니다. - 4
- 이 파이프라인에 타임아웃을 20분으로 설정합니다.
- 5
- 이 템플릿 라벨이 있는 모든 항목을 삭제합니다.
- 6
- 이 템플릿 라벨을 사용하여 모든 보안을 삭제합니다.
- 7
templatePath
에서 새 애플리케이션을 생성합니다.- 8
- 빌드가 완료될 때까지 최대 5분 동안 기다립니다.
- 9
- 배포가 완료될 때까지 최대 5분 정도 기다립니다.
- 10
- 다른 모든 과정이 성공하면
$ {templateName}:latest
이미지에$ {templateName}-staging:latest
태그를 지정합니다. 스테이징 환경에 대한 파이프라인 빌드 구성에서는$ {templateName}-staging:latest
이미지가 변경될 때까지 기다린 다음 해당 이미지를 스테이징 환경에 배포할 수 있습니다.
참고위 예제는 선언적 파이프라인 스타일로 작성되었지만 기존에 스크립팅된 파이프라인 스타일도 지원됩니다.
OpenShift Container Platform 클러스터에서 파이프라인
BuildConfig
를 생성합니다.$ oc create -f nodejs-sample-pipeline.yaml
자체 파일을 생성하지 않으려면 다음을 실행하여 원래 리포지토리의 샘플을 사용하면 됩니다.
$ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/jenkins/pipeline/nodejs-sample-pipeline.yaml
파이프라인을 시작합니다.
$ oc start-build nodejs-sample-pipeline
참고또는 빌드
파이프라인 섹션으로 이동하여 파이프라인 시작을 클릭하거나 Jenkins 콘솔을 방문하여 생성한 파이프라인으로 이동한 다음 지금 빌드를 클릭하여 OpenShift Container Platform 웹 콘솔에서 파이프라인을 시작할 수 있습니다. 파이프라인이 시작되면 프로젝트 내에서 수행되는 다음 작업이 표시되어야 합니다.
- Jenkins 서버에서 작업 인스턴스가 생성됩니다.
- 파이프라인에 필요한 경우 에이전트 Pod가 시작됩니다.
파이프라인은 에이전트 Pod에서 실행되지만 에이전트가 필요하지 않은 경우에는 마스터에서 실행됩니다.
-
template=nodejs-mongodb-example
라벨을 사용하여 이전에 생성한 리소스는 삭제됩니다. -
새 애플리케이션 및 이 애플리케이션의 모든 관련 리소스는
nodejs-mongodb-example
템플릿에서 생성됩니다. nodejs-mongodb-example
BuildConfig
를 사용하여 빌드가 시작됩니다.- 파이프라인은 빌드가 완료될 때까지 기다린 후 다음 단계를 트리거합니다.
배포는
nodejs-mongodb-example
배포 구성을 사용하여 시작됩니다.- 파이프라인은 배포가 완료될 때까지 기다린 후 다음 단계를 트리거합니다.
-
빌드 및 배포가 성공하면
nodejs-mongodb-example:latest
이미지에nodejs-mongodb-example:stage
태그가 지정됩니다.
-
파이프라인에 필요한 경우 에이전트 pod가 삭제됩니다.
참고파이프라인 실행을 시각화하는 가장 좋은 방법은 OpenShift Container Platform 웹 콘솔에서 확인하는 것입니다. 웹 콘솔에 로그인하고 빌드
파이프라인으로 이동하여 파이프라인을 확인할 수 있습니다.