5.3. Jenkins에서 OpenShift Pipelines 또는 Tekton으로 마이그레이션
Tekton 프로젝트를 기반으로 하는 클라우드 네이티브 CI/CD 환경인 Jenkins에서 Red Hat OpenShift Pipelines 로 CI/CD 워크플로를 마이그레이션할 수 있습니다.
5.3.1. Jenkins 및 OpenShift Pipelines 개념 비교
Jenkins 및 OpenShift Pipelines에서 사용되는 다음과 같은 동등한 용어를 검토하고 비교할 수 있습니다.
5.3.1.1. Jenkins 용어
Jenkins는 공유 라이브러리 및 플러그인을 사용하여 확장할 수 있는 선언적 및 스크립팅된 파이프라인을 제공합니다. Jenkins의 몇 가지 기본 용어는 다음과 같습니다.
- pipeline: Groovy 구문을 사용하여 애플리케이션을 빌드, 테스트 및 배포하는 전체 프로세스를 자동화합니다.
- Node: 스크립팅된 파이프라인을 오케스트레이션하거나 실행할 수 있는 시스템입니다.
- Stage: 파이프라인에서 수행되는 작업의 개념적으로 구별되는 하위 집합입니다. 플러그인 또는 사용자 인터페이스는 종종 이 블록을 사용하여 작업의 상태 또는 진행 상황을 표시합니다.
- Step: 명령 또는 스크립트를 사용하여 수행할 정확한 작업을 지정하는 단일 작업입니다.
5.3.1.2. OpenShift Pipelines 용어
OpenShift Pipelines는 선언적 파이프라인에 YAML 구문을 사용하고 작업으로 구성됩니다. OpenShift Pipelines의 몇 가지 기본 용어는 다음과 같습니다.
- Pipeline: 일련의 직렬, 병렬 또는 둘 다에 있는 작업 세트입니다.
- Task: 명령, 바이너리 또는 스크립트로 구성된 일련의 단계입니다.
- PipelineRun: 하나 이상의 작업이 있는 파이프라인 실행입니다.
TaskRun: 하나 이상의 단계로 작업을 실행합니다.
참고매개변수 및 작업 영역과 같은 입력 세트로 PipelineRun 또는 TaskRun을 시작하고 실행 결과 출력 및 아티팩트 세트가 생성됩니다.
Workspace: OpenShift Pipelines에서 작업 공간은 다음과 같은 목적을 제공하는 개념적 블록입니다.
- 입력, 출력 및 빌드 아티팩트의 저장.
- 작업 간에 데이터를 공유하는 공용 공간.
- 시크릿에 보유된 인증 정보, 구성 맵에 저장된 구성 및 조직에서 공유하는 공통 툴의 마운트 지점.
참고Jenkins에는 OpenShift Pipelines 작업 공간에 직접 해당하는 작업 공간이 없습니다. 복제된 코드 리포지토리를 저장하고 기록 및 아티팩트를 빌드하므로 컨트롤 노드를 작업 영역으로 간주할 수 있습니다. 작업이 다른 노드에 할당되면 복제된 코드와 생성된 아티팩트가 해당 노드에 저장되지만 제어 노드는 빌드 기록을 유지합니다.
5.3.1.3. 개념 매핑
Jenkins 및 OpenShift Pipelines의 구성 요소는 동일하지 않으며 특정 비교에서는 기술적으로 정확한 매핑을 제공하지 않습니다. Jenkins 및 OpenShift Pipelines의 다음 용어 및 개념은 일반적으로 상관 관계가 있습니다.
표 5.1. Jenkins 및 OpenShift Pipelines - 기본 비교
| Jenkins | OpenShift Pipelines |
|---|---|
| Pipeline | Pipeline 및 PipelineRun |
| Stage | Task |
| Step | 작업의 단계 |
5.3.2. Jenkins에서 OpenShift Pipelines로 샘플 파이프라인 마이그레이션
다음 동등한 예제를 사용하여 Jenkins에서 OpenShift Pipelines로 파이프라인을 마이그레이션, 테스트 및 배포할 수 있습니다.
5.3.2.1. Jenkins 파이프라인
빌드, 테스트 및 배포를 위해 Groovy로 작성된 Jenkins 파이프라인을 고려하십시오.
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make'
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml'
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}5.3.2.2. OpenShift Pipelines 파이프라인
이전 Jenkins 파이프라인과 동일한 OpenShift Pipelines에서 파이프라인을 생성하려면 다음 세 가지 작업을 생성합니다.
빌드 작업 YAML 정의 파일 예
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: myproject-build
spec:
workspaces:
- name: source
steps:
- image: my-ci-image
command: ["make"]
workingDir: $(workspaces.source.path)
테스트 작업 YAML 정의 파일 예
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: myproject-test
spec:
workspaces:
- name: source
steps:
- image: my-ci-image
command: ["make check"]
workingDir: $(workspaces.source.path)
- image: junit-report-image
script: |
#!/usr/bin/env bash
junit-report reports/**/*.xml
workingDir: $(workspaces.source.path)
배포 작업 YAML 정의 파일 예
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: myprojectd-deploy
spec:
workspaces:
- name: source
steps:
- image: my-deploy-image
command: ["make deploy"]
workingDir: $(workspaces.source.path)
세 가지 작업을 순차적으로 결합하여 OpenShift Pipelines에서 파이프라인을 구성할 수 있습니다.
예: 빌드, 테스트 및 배포를 위한 OpenShift Pipelines 파이프라인
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: myproject-pipeline
spec:
workspaces:
- name: shared-dir
tasks:
- name: build
taskRef:
name: myproject-build
workspaces:
- name: source
workspace: shared-dir
- name: test
taskRef:
name: myproject-test
workspaces:
- name: source
workspace: shared-dir
- name: deploy
taskRef:
name: myproject-deploy
workspaces:
- name: source
workspace: shared-dir
5.3.3. Jenkins 플러그인에서 Tekton Hub 작업으로 마이그레이션
플러그인을 사용하여 Jenkins의 기능을 확장할 수 있습니다. OpenShift Pipelines에서 유사한 확장성을 얻으려면 Tekton Hub 에서 사용할 수 있는 작업을 사용합니다.
예를 들어 Jenkins의 git plugin 에 해당하는 Tekton Hub의 git-clone 작업을 고려하십시오.
예: Tekton Hub에서 git-clone 작업
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: demo-pipeline
spec:
params:
- name: repo_url
- name: revision
workspaces:
- name: source
tasks:
- name: fetch-from-git
taskRef:
name: git-clone
params:
- name: url
value: $(params.repo_url)
- name: revision
value: $(params.revision)
workspaces:
- name: output
workspace: source
5.3.4. 사용자 정의 작업 및 스크립트를 사용하여 OpenShift Pipelines 기능 확장
OpenShift Pipelines에서 Tekton Hub에서 올바른 작업을 찾지 못하거나 작업을 더 잘 제어해야 하는 경우 사용자 정의 작업 및 스크립트를 생성하여 OpenShift Pipelines의 기능을 확장할 수 있습니다.
예: maven test 명령을 실행하는 사용자 지정 작업
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: maven-test
spec:
workspaces:
- name: source
steps:
- image: my-maven-image
command: ["mvn test"]
workingDir: $(workspaces.source.path)
예: 경로를 제공하여 사용자 정의 쉘 스크립트 실행
...
steps:
image: ubuntu
script: |
#!/usr/bin/env bash
/workspace/my-script.sh
...
예: YAML 파일에 작성하여 사용자 정의 Python 스크립트 실행
...
steps:
image: python
script: |
#!/usr/bin/env python3
print(“hello from python!”)
...
5.3.5. Jenkins 및 OpenShift Pipelines 실행 모델 비교
Jenkins 및 OpenShift Pipelines는 유사한 기능을 제공하지만 아키텍처 및 실행에서는 다릅니다.
표 5.2. Jenkins 및 OpenShift Pipelines의 실행 모델 비교
| Jenkins | OpenShift Pipelines |
|---|---|
| Jenkins에는 컨트롤러 노드가 있습니다. Jenkins는 파이프라인을 실행하고 중앙 집중적으로 단계를 실행하거나 다른 노드에서 실행되는 작업을 오케스트레이션합니다. | OpenShift Pipelines는 서버리스 및 분산되어 있으며 실행을 위한 중앙 종속성이 없습니다. |
| 컨테이너는 파이프라인을 통해 Jenkins 컨트롤러 노드에서 시작됩니다. | OpenShift Pipelines는 모든 단계가 pod의 컨테이너로 실행되는 '컨테이너 우선' 접근 방식을 채택합니다(Jenkins의 노드와 동일합니다). |
| 확장성은 플러그인을 사용하여 달성합니다. | 확장성은 Tekton Hub의 작업을 사용하거나 사용자 지정 작업 및 스크립트를 생성하여 달성됩니다. |
5.3.6. 일반적인 사용 사례 예
Jenkins 및 OpenShift Pipelines는 다음과 같은 일반적인 CI/CD 사용 사례를 위한 기능을 제공합니다.
- Apache Maven을 사용하여 이미지 컴파일, 빌드 및 배포
- 플러그인을 사용하여 코어 기능 확장
- 공유 가능한 라이브러리 및 사용자 정의 스크립트 재사용
5.3.6.1. Jenkins 및 OpenShift Pipelines에서 Maven 파이프라인 실행
이미지를 컴파일, 빌드 및 배포하기 위해 Jenkins 및 OpenShift Pipelines 워크플로에서 Maven을 사용할 수 있습니다. 기존 Jenkins 워크플로를 OpenShift Pipelines에 매핑하려면 다음 예를 고려하십시오.
예: 이미지를 컴파일하고 빌드하고 Jenkins에서 Maven을 사용하여 OpenShift에 배포합니다.
#!/usr/bin/groovy
node('maven') {
stage 'Checkout'
checkout scm
stage 'Build'
sh 'cd helloworld && mvn clean'
sh 'cd helloworld && mvn compile'
stage 'Run Unit Tests'
sh 'cd helloworld && mvn test'
stage 'Package'
sh 'cd helloworld && mvn package'
stage 'Archive artifact'
sh 'mkdir -p artifacts/deployments && cp helloworld/target/*.war artifacts/deployments'
archive 'helloworld/target/*.war'
stage 'Create Image'
sh 'oc login https://kubernetes.default -u admin -p admin --insecure-skip-tls-verify=true'
sh 'oc new-project helloworldproject'
sh 'oc project helloworldproject'
sh 'oc process -f helloworld/jboss-eap70-binary-build.json | oc create -f -'
sh 'oc start-build eap-helloworld-app --from-dir=artifacts/'
stage 'Deploy'
sh 'oc new-app helloworld/jboss-eap70-deploy.json' }
예: 이미지를 컴파일하고 빌드한 후 OpenShift Pipelines에서 Maven을 사용하여 OpenShift에 배포합니다.
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: maven-pipeline
spec:
workspaces:
- name: shared-workspace
- name: maven-settings
- name: kubeconfig-dir
optional: true
params:
- name: repo-url
- name: revision
- name: context-path
tasks:
- name: fetch-repo
taskRef:
name: git-clone
workspaces:
- name: output
workspace: shared-workspace
params:
- name: url
value: "$(params.repo-url)"
- name: subdirectory
value: ""
- name: deleteExisting
value: "true"
- name: revision
value: $(params.revision)
- name: mvn-build
taskRef:
name: maven
runAfter:
- fetch-repo
workspaces:
- name: source
workspace: shared-workspace
- name: maven-settings
workspace: maven-settings
params:
- name: CONTEXT_DIR
value: "$(params.context-path)"
- name: GOALS
value: ["-DskipTests", "clean", "compile"]
- name: mvn-tests
taskRef:
name: maven
runAfter:
- mvn-build
workspaces:
- name: source
workspace: shared-workspace
- name: maven-settings
workspace: maven-settings
params:
- name: CONTEXT_DIR
value: "$(params.context-path)"
- name: GOALS
value: ["test"]
- name: mvn-package
taskRef:
name: maven
runAfter:
- mvn-tests
workspaces:
- name: source
workspace: shared-workspace
- name: maven-settings
workspace: maven-settings
params:
- name: CONTEXT_DIR
value: "$(params.context-path)"
- name: GOALS
value: ["package"]
- name: create-image-and-deploy
taskRef:
name: openshift-client
runAfter:
- mvn-package
workspaces:
- name: manifest-dir
workspace: shared-workspace
- name: kubeconfig-dir
workspace: kubeconfig-dir
params:
- name: SCRIPT
value: |
cd "$(params.context-path)"
mkdir -p ./artifacts/deployments && cp ./target/*.war ./artifacts/deployments
oc new-project helloworldproject
oc project helloworldproject
oc process -f jboss-eap70-binary-build.json | oc create -f -
oc start-build eap-helloworld-app --from-dir=artifacts/
oc new-app jboss-eap70-deploy.json
5.3.6.2. 플러그인을 사용하여 Jenkins 및 OpenShift Pipelines의 핵심 기능 확장
Jenkins는 광범위한 사용자 기반에 의해 수년 동안 개발 된 수많은 플러그인의 대규모 에코 시스템의 이점을 가지고 있습니다. Jenkins 플러그인 색인 에서 플러그인을 검색하고 검색할 수 있습니다.
OpenShift Pipelines에는 커뮤니티 및 엔터프라이즈 사용자가 개발하고 제공하는 많은 작업이 있습니다. 재사용 가능한 OpenShift Pipelines 작업 공개적으로 사용 가능한 카탈로그는 Tekton Hub 에서 사용할 수 있습니다.
또한 OpenShift Pipelines는 핵심 기능 내에 Jenkins 에코 시스템의 많은 플러그인을 통합합니다. 예를 들어 권한 부여는 Jenkins 및 OpenShift Pipelines 모두에서 중요한 기능입니다. Jenkins는 역할 기반 권한 부여 전략 플러그인을 사용하여 권한 부여를 수행하는 반면, OpenShift Pipelines는 OpenShift의 기본 제공 역할 기반 액세스 제어 시스템을 사용합니다.
5.3.6.3. Jenkins 및 OpenShift Pipelines에서 재사용 가능한 코드 공유
Jenkins 공유 라이브러리 는 Jenkins 파이프라인의 일부에 재사용 가능한 코드를 제공합니다. 라이브러리는 Jenkinsfile 간에 공유되어 코드 반복 없이 고도로 모듈식 파이프라인을 생성합니다.
OpenShift Pipelines에는 Jenkins 공유 라이브러리와 직접 동등하지 않지만 사용자 지정 작업 및 스크립트와 함께 Tekton Hub 의 작업을 사용하여 유사한 워크플로를 수행할 수 있습니다.