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의 다음 용어 및 개념은 일반적으로 상관 관계가 있습니다.
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는 유사한 기능을 제공하지만 아키텍처 및 실행에서는 다릅니다.
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 의 작업을 사용하여 유사한 워크플로를 수행할 수 있습니다.