3장. Jenkins에서 Tekton으로 마이그레이션
3.1. Jenkins에서 Tekton으로 마이그레이션
Jenkins 및 Tekton은 애플리케이션 및 프로젝트 구축, 테스트 및 배포 프로세스를 자동화하는 데 광범위하게 사용됩니다. 그러나 Tekton은 Kubernetes 및 OpenShift Container Platform과 원활하게 작동하는 클라우드 네이티브 CI/CD 솔루션입니다. 이 문서는 Jenkins CI/CD 워크플로를 Tekton으로 마이그레이션하는 데 도움이 됩니다.
3.1.1. Jenkins 및 Tekton 개념 비교
이 섹션에는 Jenkins 및 Tekton에 사용되는 기본 용어가 요약되어 있으며 동등한 용어를 비교합니다.
3.1.1.1. Jenkins 용어
Jenkins는 공유 라이브러리 및 플러그인을 사용하여 확장할 수 있는 선언적 및 스크립팅된 파이프라인을 제공합니다. Jenkins의 몇 가지 기본 용어는 다음과 같습니다.
- Pipeline: Groovy 구문을 사용하여 애플리케이션을 빌드, 테스트 및 배포의 전체 프로세스를 자동화합니다.
- Node: 스크립팅된 파이프라인을 오케스트레이션하거나 실행할 수 있는 시스템입니다.
- Stage: 파이프라인에서 수행되는 작업의 개념적으로 구별되는 하위 집합입니다. 플러그인 또는 사용자 인터페이스에서는 이 블록을 사용하여 작업의 상태 또는 진행 상황을 표시하는 경우가 많습니다.
- Step: 명령 또는 스크립트를 사용하여 수행할 정확한 작업을 지정하는 단일 작업입니다.
3.1.1.2. Tekton 용어
Tekton은 선언적 파이프라인에 YAML 구문을 사용하고 작업으로 구성됩니다. Tekton의 몇 가지 기본 용어는 다음과 같습니다.
- Pipeline: 일련의 직렬, 병렬 또는 둘 다에 있는 작업 세트입니다.
- Task: 명령, 바이너리 또는 스크립트로 구성된 일련의 단계입니다.
- PipelineRun: 하나 이상의 작업이 있는 파이프라인 실행입니다.
TaskRun: 하나 이상의 단계로 작업을 실행합니다.
참고매개변수 및 작업 영역과 같은 입력 세트로 PipelineRun 또는 TaskRun을 시작하고 실행 결과 출력 및 아티팩트 세트가 생성됩니다.
Workspace: Tekton에서 작업 공간은 다음과 같은 목적을 제공하는 개념적 블록입니다.
- 입력, 출력 및 빌드 아티팩트의 저장.
- 작업 간에 데이터를 공유하는 공용 공간.
- 시크릿에 보유된 인증 정보, 구성 맵에 저장된 구성 및 조직에서 공유하는 공통 툴의 마운트 지점.
참고Jenkins에는 Tekton 작업 공간에 직접적으로 해당하는 작업 공간이 없습니다. 복제된 코드 리포지토리를 저장하고 기록 및 아티팩트를 빌드하므로 컨트롤 노드를 작업 영역으로 간주할 수 있습니다. 작업이 다른 노드에 할당되는 경우 복제된 코드와 생성된 아티팩트는 해당 노드에 저장되지만 빌드 기록은 컨트롤 노드에 의해 유지 관리됩니다.
3.1.1.3. 개념 매핑
Jenkins 및 Tekton의 구성 요소는 동일하지 않으며 비교 결과에서는 기술적으로 정확한 매핑이 제공되지 않습니다. Jenkins 및 Tekton의 다음 용어 및 개념은 일반적으로 상관 관계가 있습니다.
Jenkins | Tekton |
---|---|
Pipeline | Pipeline 및 PipelineRun |
Stage | Task |
Step | 작업의 단계 |
3.1.2. Jenkins에서 Tekton으로 샘플 파이프라인 마이그레이션
이 섹션에서는 Jenkins 및 Tekton에서 파이프라인과 동일한 예제를 제공하며 Jenkins에서 Tekton으로 파이프라인을 마이그레이션, 테스트 및 배포하는 데 유용한 정보를 제공합니다.
3.1.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' } } } }
3.1.2.2. Tekton 파이프라인
Tekton에서 Jenkins 파이프라인의 동등한 예는 세 가지 작업으로 구성되며 각각 YAML 구문을 사용하여 선언적으로 작성할 수 있습니다.
build
작업 예
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)
test
작업 예:
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)
deploy
작업 예:
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)
세 가지 작업을 순차적으로 결합하여 Tekton 파이프라인을 구성할 수 있습니다.
예: 빌드, 테스트 및 배포를 위한 Tekton 파이프라인
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
3.1.3. Jenkins 플러그인에서 Tekton Hub 작업으로 마이그레이션
플러그인 을 사용하여 Jenkins 기능을 확장할 수 있습니다. Tekton에서 유사한 확장성을 얻으려면 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
3.1.4. 사용자 정의 작업 및 스크립트를 사용하여 Tekton 기능 확장
Tekton의 Tekton Hub에서 올바른 작업을 찾지 못하거나 작업을 더 잘 제어해야 하는 경우 사용자 지정 작업 및 스크립트를 생성하여 Tekton의 기능을 확장할 수 있습니다.
예: 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!”) ...
3.1.5. Jenkins 및 Tekton 실행 모델 비교
Jenkins 및 Tekton은 유사한 기능을 제공하지만 아키텍처 및 실행이 다릅니다. 이 섹션에서는 두 가지 실행 모델을 간단히 비교합니다.
Jenkins | Tekton |
---|---|
Jenkins에는 컨트롤 노드가 있습니다. Jenkins는 파이프라인을 실행하고 중앙 집중적으로 단계를 실행하거나 다른 노드에서 실행되는 작업을 오케스트레이션합니다. | Tekton은 서버리스 및 분산되어 있으며 실행을 위한 중앙 종속성이 없습니다. |
컨테이너는 파이프라인을 통해 컨트롤 노드에서 시작됩니다. | Tekton은 모든 단계가 Pod에서 실행되는 컨테이너(Jenkins의 노드와 동등)로 실행되는 '컨테이너 우선' 접근 방식을 채택합니다. |
확장성은 플러그인을 사용하여 달성합니다. | 확장성은 Tekton Hub의 작업을 사용하거나 사용자 지정 작업 및 스크립트를 만들어 얻을 수 있습니다. |
3.1.6. 일반적인 사용 사례의 예
Jenkins 및 Tekton은 모두 다음과 같은 공통 CI/CD 사용 사례를 위한 기능을 제공합니다.
- maven을 사용하여 이미지 컴파일, 빌드 및 배포
- 플러그인을 사용하여 핵심 기능 확장
- 공유 가능한 라이브러리 및 사용자 지정 스크립트 재사용
3.1.6.1. Jenkins 및 Tekton에서 maven 파이프라인 실행
이미지를 컴파일, 빌드 및 배포하기 위해 Jenkins 및 Tekton 워크플로우 모두에서 maven을 사용할 수 있습니다. 기존 Jenkins 워크플로를 Tekton에 매핑하려면 다음 예제를 고려하십시오.
예: 이미지를 컴파일하고 빌드하고 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' }
예: Tekton에서 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
3.1.6.2. 플러그인을 사용하여 Jenkins 및 Tekton의 핵심 기능 확장
Jenkins는 광범위한 사용자 기반에서 수년간 개발된 수많은 플러그인의 대규모 에코시스템을 활용합니다. Jenkins 플러그인 인덱스에서 플러그인을 검색하고 검색할 수 있습니다.
Tekton에는 커뮤니티 및 엔터프라이즈 사용자가 개발하고 제공하는 많은 작업이 포함되어 있습니다. 재사용 가능한 Tekton 작업의 공개적으로 사용 가능한 카탈로그는 Tekton Hub 에서 사용할 수 있습니다.
또한 Tekton은 주요 기능 내에 Jenkins 에코 시스템의 많은 플러그인을 통합합니다. 예를 들어 권한 부여는 Jenkins 및 Tekton 모두에서 중요한 기능입니다. Jenkins는 역할 기반 권한 부여 전략 플러그인을 사용하여 권한을 확인하지만 Tekton은 OpenShift의 기본 제공 역할 기반 액세스 제어 시스템을 사용합니다.
3.1.6.3. Jenkins 및 Tekton에서 재사용 가능한 코드 공유
Jenkins 공유 라이브러리 는 Jenkins 파이프라인의 일부에 재사용 가능한 코드를 제공합니다. 라이브러리는 Jenkinsfiles 간에 공유되어 코드 반복 없이 고도의 모듈식 파이프라인을 생성합니다.
Tekton의 Jenkins 공유 라이브러리와 직접적으로 동등한 것은 없지만 사용자 지정 작업 및 스크립트와 함께 Tekton Hub 의 작업을 사용하여 유사한 워크플로를 수행할 수 있습니다.