3.2. OpenShift Pipelines 이해


Red Hat OpenShift Pipelines는 Kubernetes 리소스 기반의 클라우드 네이티브 CI/CD(연속 통합 및 연속 제공) 솔루션입니다. Tekton 빌딩 블록을 사용하여 기본 구현 세부 사항을 요약함으로써 여러 플랫폼에서 배포를 자동화합니다. Tekton은 Kubernetes 배포 전반에서 이식 가능한 CI/CD Pipeline을 정의하는 데 사용되는 여러 가지 표준 CRD(Custom Resource Definitions)를 도입합니다.

3.2.1. 주요 기능

  • Red Hat OpenShift Pipelines는 격리된 컨테이너에서 필요한 모든 종속 항목이 포함된 파이프라인을 실행하는 서버리스 CI/CD 시스템입니다.
  • Red Hat OpenShift Pipelines는 마이크로 서비스 기반 아키텍처에서 작업하는 분산된 팀을 위해 설계되었습니다.
  • Red Hat OpenShift Pipelines는 쉽게 확장하고 기존 Kubernetes 툴과 통합할 수 있는 표준 CI/CD 파이프라인 정의를 사용하므로 필요에 따라 스케일링할 수 있습니다.
  • Red Hat OpenShift Pipelines를 사용하면 모든 Kubernetes 플랫폼에서 이식 가능한 S2I(Source-to-Image), Buildah, Buildpacks, Kaniko 등의 Kubernetes 툴로 이미지를 빌드할 수 있습니다.
  • OpenShift Container Platform 개발자 콘솔을 사용하여 Tekton 리소스를 생성하고, 파이프라인 실행 로그를 검토하고, OpenShift Container Platform 네임스페이스에서 파이프라인을 관리할 수 있습니다.

3.2.2. OpenShift Pipeline 개념

이 안내서에서는 다양한 파이프라인 개념을 소개합니다.

3.2.2.1. Task

작업은 파이프라인의 구성 블록이며 순차적으로 실행되는 단계로 구성됩니다. 기본적으로 입력 및 출력의 기능입니다. 작업은 개별적으로 또는 파이프라인의 일부로 실행될 수 있습니다. 작업은 재사용이 가능하며 여러 파이프라인에서 사용할 수 있습니다.

Steps 는 작업에서 순차적으로 실행되고 이미지 빌드와 같은 특정 목표를 달성하는 일련의 명령입니다. 모든 작업은 Pod로 실행되고 각 단계는 해당 Pod 내에서 컨테이너로 실행됩니다. 단계는 동일한 Pod 내에서 실행되므로 파일, 구성 맵 및 시크릿을 캐싱하기 위해 동일한 볼륨에 액세스할 수 있습니다.

다음 예제에서는 apply-manifests 작업을 보여줍니다.

apiVersion: tekton.dev/v1beta1 1
kind: Task 2
metadata:
  name: apply-manifests 3
spec: 4
  workspaces:
  - name: source
  params:
    - name: manifest_dir
      description: The directory in source that contains yaml manifests
      type: string
      default: "k8s"
  steps:
    - name: apply
      image: image-registry.openshift-image-registry.svc:5000/openshift/cli:latest
      workingDir: /workspace/source
      command: ["/bin/bash", "-c"]
      args:
        - |-
          echo Applying manifests in $(params.manifest_dir) directory
          oc apply -f $(params.manifest_dir)
          echo -----------------------------------
1
작업 API 버전 v1beta1.
2
Kubernetes 오브젝트 유형은 Task입니다.
3
이 작업의 고유 이름입니다.
4
작업의 매개변수 및 단계 목록과 작업에서 사용하는 작업 공간입니다.

이 작업은 Pod를 시작하고 해당 Pod 내에서 지정된 이미지를 사용하여 지정된 명령을 실행합니다.

참고

Pipelines 1.6부터 단계 YAML 파일에서 다음 기본값이 제거됩니다.

  • HOME 환경 변수가 기본적으로 /tekton/home 디렉터리에 없습니다.
  • workingDir 필드의 기본값은 /workspace 디렉터리입니다.

대신 단계의 컨테이너는 HOME 환경 변수와 workingDir 필드를 정의합니다. 그러나 단계를 위해 YAML 파일에 사용자 정의 값을 지정하여 기본값을 재정의할 수 있습니다.

임시 조치로 이전 Pipeline 버전과의 호환성을 유지하기 위해 TektonConfig 사용자 정의 리소스 정의에서 다음 필드를 false 로 설정할 수 있습니다.

spec:
  pipeline:
    disable-working-directory-overwrite: false
    disable-home-env-overwrite: false

3.2.2.2. when 표현식

When 표현식은 파이프라인 내에서 작업 실행 기준을 설정하여 작업 실행을 보호합니다. 여기에는 특정 기준이 충족될 때만 작업을 실행할 수 있는 구성 요소 목록이 포함되어 있습니다. when 표현식은 파이프라인 YAML 파일의 finally 필드를 사용하여 지정된 최종 작업 세트에서도 지원됩니다.

when 표현식의 주요 구성 요소는 다음과 같습니다.

  • input: 매개 변수, 작업 결과, 실행 상태와 같은 정적 입력 또는 변수를 지정합니다. 유효한 입력을 입력해야 합니다. 유효한 입력을 입력하지 않으면 기본값은 빈 문자열입니다.
  • operator: 일련의 values에 대한 입력의 관계를 지정합니다. Operator 값으로 in 또는 notin을 입력합니다.
  • values: 문자열 값 배열을 지정합니다. 매개 변수, 결과 및 바인딩된 작업 영역 상태와 같은 정적 값 또는 변수의 비어 있지 않은 배열을 입력합니다.

선언된 when 표현식은 작업이 실행되기 전에 평가됩니다. when 표현식 값이 True이면 작업이 실행됩니다. when 표현식 값이 False이면 작업을 건너뜁니다.

다양한 사용 사례에서 when 표현식을 사용할 수 있습니다. 예를 들면 다음과 같은 경우입니다.

  • 이전 작업의 결과는 예상대로 표시됩니다.
  • Git 리포지토리의 파일이 이전 커밋에서 변경되었습니다.
  • 레지스트리에 이미지가 있습니다.
  • 선택적 작업 영역을 사용할 수 있습니다.

다음 예제에서는 파이프라인 실행에 대한 when 표현식을 보여줍니다. 파이프라인 실행은 다음 기준이 충족되는 경우에만 create-file 작업을 실행합니다. path 매개 변수는 README.md이고, check-file 작업의 exists결과가 yes인 경우에만 echo-file-exists 작업이 실행됩니다.

apiVersion: tekton.dev/v1beta1
kind: PipelineRun 1
metadata:
  generateName: guarded-pr-
spec:
  serviceAccountName: 'pipeline'
  pipelineSpec:
    params:
      - name: path
        type: string
        description: The path of the file to be created
    workspaces:
      - name: source
        description: |
          This workspace is shared among all the pipeline tasks to read/write common resources
    tasks:
      - name: create-file 2
        when:
          - input: "$(params.path)"
            operator: in
            values: ["README.md"]
        workspaces:
          - name: source
            workspace: source
        taskSpec:
          workspaces:
            - name: source
              description: The workspace to create the readme file in
          steps:
            - name: write-new-stuff
              image: ubuntu
              script: 'touch $(workspaces.source.path)/README.md'
      - name: check-file
        params:
          - name: path
            value: "$(params.path)"
        workspaces:
          - name: source
            workspace: source
        runAfter:
          - create-file
        taskSpec:
          params:
            - name: path
          workspaces:
            - name: source
              description: The workspace to check for the file
          results:
            - name: exists
              description: indicates whether the file exists or is missing
          steps:
            - name: check-file
              image: alpine
              script: |
                if test -f $(workspaces.source.path)/$(params.path); then
                  printf yes | tee /tekton/results/exists
                else
                  printf no | tee /tekton/results/exists
                fi
      - name: echo-file-exists
        when: 3
          - input: "$(tasks.check-file.results.exists)"
            operator: in
            values: ["yes"]
        taskSpec:
          steps:
            - name: echo
              image: ubuntu
              script: 'echo file exists'
...
      - name: task-should-be-skipped-1
        when: 4
          - input: "$(params.path)"
            operator: notin
            values: ["README.md"]
        taskSpec:
          steps:
            - name: echo
              image: ubuntu
              script: exit 1
...
    finally:
      - name: finally-task-should-be-executed
        when: 5
          - input: "$(tasks.echo-file-exists.status)"
            operator: in
            values: ["Succeeded"]
          - input: "$(tasks.status)"
            operator: in
            values: ["Succeeded"]
          - input: "$(tasks.check-file.results.exists)"
            operator: in
            values: ["yes"]
          - input: "$(params.path)"
            operator: in
            values: ["README.md"]
        taskSpec:
          steps:
            - name: echo
              image: ubuntu
              script: 'echo finally done'
  params:
    - name: path
      value: README.md
  workspaces:
    - name: source
      volumeClaimTemplate:
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 16Mi
1
Kubernetes 개체의 유형을 지정합니다. 예에서는 PipelineRun입니다.
2
Pipeline에서 사용되는 작업 create-file입니다.
3
check-file 작업에서 exists 결과가 yes인 경우에만 echo-file-exists 작업을 실행하도록 지정하는 when 표현식입니다.
4
path 매개 변수가 README.md인 경우에만 task-s shouldld-be-skipped-1 작업을 건너뛰도록 지정하는 When 표현식입니다.
5
echo-file-exists 작업의 실행 상태와 작업 상태가 Succeeded인 경우에만, finally-task-should-be-executed 작업을 실행하도록 지정하는 when 표현식은 check-file 작업의 exists 결과는 yes이고 path 매개 변수는 README.md입니다.

OpenShift Container Platform 웹 콘솔의 Pipeline Run 세부 정보 페이지에 다음과 같이 작업의 상태와 when 표현식이 표시됩니다.

  • 모든 기준이 충족됨: Task와 다이아몬드 모양으로 표시되는 when 표현식 기호는 녹색입니다.
  • 기준 중 하나가 충족되지 않음: 작업을 건너뜁니다. 건너뛰기된 작업 및 when 표현식 기호는 회색입니다.
  • 충족 기준이 없음: 작업을 건너뜁니다. 건너뛰기된 작업 및 when 표현식 기호는 회색입니다.
  • 작업 실행 실패: 실패한 작업 및 When 표현식 기호는 빨간색입니다.

3.2.2.3. finally 작업

finally 작업은 파이프라인 YAML 파일의 finally 필드를 사용하여 지정된 최종 작업 집합입니다. finally 작업은 파이프라인 실행이 성공적으로 실행되는지 여부에 관계없이 항상 파이프라인 내의 작업을 실행합니다. finally 작업은 해당 파이프라인이 종료되기 전에 모든 파이프라인 작업이 실행된 후 병렬로 실행됩니다.

finally 작업은 동일한 파이프라인 내의 모든 작업 결과를 사용하도록 구성할 수 있습니다. 이 접근 방식은 이 최종 작업이 실행되는 순서를 변경하지 않습니다. 모든 최종 작업이 실행된 후 다른 최종 작업과 동시에 실행됩니다.

다음 예제에서는 clone-cleanup-workspace 파이프라인의 코드 스니펫을 보여줍니다. 이 코드는 리포지토리를 공유 작업 공간으로 복제하고 작업 영역을 정리합니다. 파이프라인 작업을 실행한 후 파이프라인 YAML 파일의 finally 섹션에 지정된 cleanup 작업이 작업 영역을 정리합니다.

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: clone-cleanup-workspace 1
spec:
  workspaces:
    - name: git-source 2
  tasks:
    - name: clone-app-repo 3
      taskRef:
        name: git-clone-from-catalog
      params:
        - name: url
          value: https://github.com/tektoncd/community.git
        - name: subdirectory
          value: application
      workspaces:
        - name: output
          workspace: git-source
  finally:
    - name: cleanup 4
      taskRef: 5
        name: cleanup-workspace
      workspaces: 6
        - name: source
          workspace: git-source
    - name: check-git-commit
      params: 7
        - name: commit
          value: $(tasks.clone-app-repo.results.commit)
      taskSpec: 8
        params:
          - name: commit
        steps:
          - name: check-commit-initialized
            image: alpine
            script: |
              if [[ ! $(params.commit) ]]; then
                exit 1
              fi
1
Pipeline의 고유한 이름입니다.
2
git 리포지토리가 복제되는 공유 작업 공간입니다.
3
애플리케이션 리포지토리를 공유 작업 영역에 복제하는 작업입니다.
4
공유 작업 영역을 정리하는 작업입니다.
5
TaskRun에서 실행할 작업에 대한 참조입니다.
6
파이프라인의 태스크가 런타임에 입력을 수신하거나 출력을 제공하는 데 필요한 공유 스토리지 볼륨입니다.
7
작업에 필요한 매개 변수 목록입니다. 매개 변수에 암시적 기본값이 없는 경우 해당 값을 명시적으로 설정해야 합니다.
8
임베디드 작업 정의입니다.

3.2.2.4. TaskRun

TaskRun은 클러스터에서 특정 입력, 출력 및 실행 매개변수를 사용하여 실행할 Task를 인스턴스화합니다. 자체 또는 파이프라인의 각 작업에 대해 파이프라인 실행의 일부로 호출할 수 있습니다.

Task는 컨테이너 이미지를 실행하는 하나 이상의 단계(Step)로 구성되며, 각 컨테이너 이미지의 특정 빌드 작업을 수행합니다. TaskRun은 Task의 모든 단계(Step)를 지정된 순서로 실행하며, 모든 단계(Step)가 성공적으로 실행되거나 실패하는 단계가 발생하면 실행을 멈춥니다. TaskRun은 Pipeline의 각 Task에 대한 PipelineRun에 의해 자동으로 생성되며,

다음 예는 관련 입력 매개변수를 사용하여 apply-manifests Task를 실행하는 TaskRun을 보여줍니다.

apiVersion: tekton.dev/v1beta1 1
kind: TaskRun 2
metadata:
  name: apply-manifests-taskrun 3
spec: 4
  serviceAccountName: pipeline
  taskRef: 5
    kind: Task
    name: apply-manifests
  workspaces: 6
  - name: source
    persistentVolumeClaim:
      claimName: source-pvc
1
TaskRun API 버전은 v1beta1입니다.
2
Kubernetes 개체의 유형을 지정합니다. 예에서는 TaskRun입니다.
3
이 TaskRun을 식별하는 고유한 이름입니다.
4
TaskRun의 정의입니다. 이 TaskRun에 대한 Task 및 필수 작업 Workspace가 지정됩니다.
5
이 TaskRun에 사용되는 Task 참조의 이름입니다. 이 TaskRun은 apply-manifests Task를 실행합니다.
6
TaskRun에서 사용하는 Workspace입니다.

3.2.2.5. 파이프라인

파이프라인은 특정 실행 순서대로 정렬된 Task 리소스 컬렉션입니다. 애플리케이션 빌드, 배포 및 제공 작업을 자동화하는 복잡한 워크플로를 구성하기 위해 실행됩니다. 하나 이상의 작업이 포함된 파이프라인을 사용하여 애플리케이션에 대한 CI/CD 워크플로를 정의할 수 있습니다.

Pipeline 리소스 정의는 함께 사용하면 파이프라인에서 특정 목표를 달성할 수 있는 여러 필드 또는 특성으로 구성됩니다. 각 Pipeline 리소스 정의에는 특정 입력을 수집하고 특정 출력을 생성하는 Task가 하나 이상 포함되어야 합니다. 또한 파이프라인 정의에는 애플리케이션 요구 사항에 따라 Conditions, Workspaces, Parameters 또는 Resources가 선택적으로 포함될 수 있습니다.

다음 예제에서는 buildah ClusterTask 리소스를 사용하여 Git 리포지토리에서 애플리케이션 이미지를 빌드하는 build-and-deploy 파이프라인을 보여줍니다.

apiVersion: tekton.dev/v1beta1 1
kind: Pipeline 2
metadata:
  name: build-and-deploy 3
spec: 4
  workspaces: 5
  - name: shared-workspace
  params: 6
  - name: deployment-name
    type: string
    description: name of the deployment to be patched
  - name: git-url
    type: string
    description: url of the git repo for the code of deployment
  - name: git-revision
    type: string
    description: revision to be used from repo of the code for deployment
    default: "pipelines-1.9"
  - name: IMAGE
    type: string
    description: image to be built from the code
  tasks: 7
  - name: fetch-repository
    taskRef:
      name: git-clone
      kind: ClusterTask
    workspaces:
    - name: output
      workspace: shared-workspace
    params:
    - name: url
      value: $(params.git-url)
    - name: subdirectory
      value: ""
    - name: deleteExisting
      value: "true"
    - name: revision
      value: $(params.git-revision)
  - name: build-image 8
    taskRef:
      name: buildah
      kind: ClusterTask
    params:
    - name: TLSVERIFY
      value: "false"
    - name: IMAGE
      value: $(params.IMAGE)
    workspaces:
    - name: source
      workspace: shared-workspace
    runAfter:
    - fetch-repository
  - name: apply-manifests 9
    taskRef:
      name: apply-manifests
    workspaces:
    - name: source
      workspace: shared-workspace
    runAfter: 10
    - build-image
  - name: update-deployment
    taskRef:
      name: update-deployment
    workspaces:
    - name: source
      workspace: shared-workspace
    params:
    - name: deployment
      value: $(params.deployment-name)
    - name: IMAGE
      value: $(params.IMAGE)
    runAfter:
    - apply-manifests
1
Pipeline API 버전은 v1beta1입니다.
2
Kubernetes 개체의 유형을 지정합니다. 예에서는 Pipeline입니다.
3
이 Pipeline의 고유한 이름입니다.
4
Pipeline의 정의와 구조를 지정합니다.
5
Pipeline의 모든 Task에 사용되는 Workspace입니다.
6
Pipeline의 모든 Task에 사용되는 매개변수입니다.
7
Pipeline에서 사용되는 Task 목록을 지정합니다.
8
buildah ClusterTask를 사용하여 주어진 Git 리포지토리에서 애플리케이션 이미지를 빌드하는 Task build-image입니다.
9
동일한 이름의 사용자 지정 Task를 사용하는 Task apply-manifests입니다.
10
Pipeline에서 Task가 실행되는 순서를 지정합니다. 예에서는 apply-manifests Task는 build-image Task가 완료된 후에만 실행됩니다.
참고

Red Hat OpenShift Pipelines Operator는 Buildah 클러스터 작업을 설치하고 이미지를 빌드하고 푸시할 수 있는 충분한 권한이 있는 파이프라인 서비스 계정을 생성합니다. 권한이 충분하지 않은 다른 서비스 계정과 연결된 경우 Buildah 클러스터 작업이 실패할 수 있습니다.

3.2.2.6. PipelineRun

PipelineRun 은 파이프라인, 작업 공간, 자격 증명 및 CI/CD 워크플로를 실행하는 시나리오와 관련된 매개변수 값 집합을 바인딩하는 리소스 유형입니다.

파이프라인 실행 은 파이프라인의 실행 중인 인스턴스입니다. 클러스터에서 특정 입력, 출력 및 실행 매개변수를 사용하여 실행할 파이프라인을 인스턴스화합니다. 또한 파이프라인 실행의 각 작업에 대해 작업 실행을 생성합니다.

파이프라인은 작업이 완료되거나 작업이 실패할 때까지 순차적으로 작업을 실행합니다. status 필드는 각 작업 실행의 진행 상황을 추적하고 모니터링 및 감사 목적으로 저장합니다.

다음 예제에서는 관련 리소스 및 매개변수를 사용하여 build-and-deploy 파이프라인을 실행합니다.

apiVersion: tekton.dev/v1beta1 1
kind: PipelineRun 2
metadata:
  name: build-deploy-api-pipelinerun 3
spec:
  pipelineRef:
    name: build-and-deploy 4
  params: 5
  - name: deployment-name
    value: vote-api
  - name: git-url
    value: https://github.com/openshift-pipelines/vote-api.git
  - name: IMAGE
    value: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/vote-api
  workspaces: 6
  - name: shared-workspace
    volumeClaimTemplate:
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 500Mi
1
Pipeline은 API 버전이 v1beta1 을 실행합니다.
2
Kubernetes 오브젝트 유형입니다. 예에서는 PipelineRun입니다.
3
이 파이프라인 실행을 식별하는 고유한 이름입니다.
4
실행할 파이프라인의 이름입니다. 예에서는 build-and-deploy입니다.
5
파이프라인을 실행하는 데 필요한 매개변수 목록입니다.
6
파이프라인 실행에서 사용하는 Workspace입니다.

3.2.2.7. Workspace

참고

PipelineResources는 디버그하기 어렵고 범위가 제한되며 Task의 재사용 가능성을 낮추기 때문에 OpenShift Pipelines에서는 PipelineResources 대신 Workspace를 사용할 것을 권장합니다.

작업 공간은 입력 또는 출력을 제공하기 위해 런타임 시 파이프라인의 작업에 필요한 공유 스토리지 볼륨을 선언합니다. 볼륨의 실제 위치를 지정하는 대신 Workspace를 사용하여 런타임 시 필요한 파일 시스템 전체 또는 파일 시스템의 일부를 선언할 수 있습니다. 작업 또는 파이프라인은 작업 공간을 선언하고 볼륨의 특정 위치 세부 정보를 제공해야 합니다. 그런 다음 작업 실행 또는 파이프라인 실행에서 해당 작업 공간에 마운트됩니다. 이러한 방식으로 런타임 스토리지 볼륨에서 볼륨 선언을 분리하면 사용자 환경에 종속되지 않으며 유연성 높고 재사용 가능한 Task로 만들 수 있습니다.

다음과 같은 용도로 Workspace를 활용할 수 있습니다.

  • Task 입력 및 출력 저장
  • Task 간 데이터 공유
  • 시크릿에 보관된 자격 증명의 마운트 지점으로 작업 공간 활용
  • ConfigMaps에 보관된 구성의 마운트 지점으로 작업 공간 활용
  • 조직에서 공유하는 공통 도구의 마운트 지점으로 작업 공간 활용
  • 작업 속도를 높이는 빌드 아티팩트 캐시 생성

다음을 사용하여 TaskRun 또는 PipelineRun에서 Workspace를 지정할 수 있습니다.

  • 읽기 전용 ConfigMaps 또는 Secret
  • 다른 Task와 공유되는 기존 PersistentVolumeClaim
  • 제공된 VolumeClaimTemplate의 PersistentVolumeClaim
  • TaskRun이 완료되면 삭제되는 emptyDir

다음은 Pipeline에 정의된 대로 build-imageapply-manifests Task에 대한 shared-workspace Workspace를 선언하는 build-and-deploy Pipeline의 코드 스니펫 예입니다.

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: build-and-deploy
spec:
  workspaces: 1
  - name: shared-workspace
  params:
...
  tasks: 2
  - name: build-image
    taskRef:
      name: buildah
      kind: ClusterTask
    params:
    - name: TLSVERIFY
      value: "false"
    - name: IMAGE
      value: $(params.IMAGE)
    workspaces: 3
    - name: source 4
      workspace: shared-workspace 5
    runAfter:
    - fetch-repository
  - name: apply-manifests
    taskRef:
      name: apply-manifests
    workspaces: 6
    - name: source
      workspace: shared-workspace
    runAfter:
      - build-image
...
1
Pipeline에 정의된 Task 사이에 공유되는 Workspace 목록입니다. Pipeline은 필요한 만큼 Workspace를 정의할 수 있습니다. 예에서는 shared-workspace라는 Workspace 한 개만 선언됩니다.
2
Pipeline에서 사용되는 Task의 정의입니다. 이 스니펫은 공통 Workspace를 공유하는 두 개의 Task, build-imageapply-manifest를 정의합니다.
3
build-image Task에 사용되는 Workspace 목록입니다. Task 정의에 필요한 만큼의 Workspace를 포함할 수 있습니다. 하지만 Task에 사용되는 쓰기 가능한 Workspace를 한 개로 제한하는 것이 좋습니다.
4
Task에서 사용되는 Workspace를 고유하게 식별하는 이름입니다. 이 Task는 source라는 Workspace 한 개를 사용합니다.
5
Task에서 사용하는 Pipeline Workspace의 이름입니다. 이어서 source Workspace는 shared-workspace라는 Pipeline Workspace를 사용한다는 점에 주목하십시오.
6
apply-manifests Task에 사용되는 Workspace 목록입니다. 이 Task는 build-image Task와 source Workspace를 공유한다는 점에 주목하십시오.

작업 공간을 사용하면 여러 작업에서 데이터를 공유하고 파이프라인의 각 작업을 실행하는 동안 필요한 하나 이상의 볼륨을 지정할 수 있습니다. 영구 볼륨 클레임을 생성하거나 사용자를 대신하여 영구 볼륨 클레임을 생성하는 볼륨 클레임 템플릿을 제공할 수 있습니다.

다음의 build-deploy-api-pipelinerun PipelineRun 코드 조각에서는 볼륨 클레임 템플릿을 사용하여 build-and-deploy 파이프라인에 사용된 shared-workspace 작업 공간의 스토리지 볼륨을 정의하는 영구 볼륨 클레임을 생성합니다.

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: build-deploy-api-pipelinerun
spec:
  pipelineRef:
    name: build-and-deploy
  params:
...

  workspaces: 1
  - name: shared-workspace 2
    volumeClaimTemplate: 3
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 500Mi
1
PipelineRun에서 볼륨 바인딩이 제공될 Pipeline Workspace 목록을 지정합니다.
2
볼륨이 제공될 Pipeline의 Workspace 이름입니다.
3
작업 공간의 스토리지 볼륨을 정의하기 위해 영구 볼륨 클레임을 생성하는 볼륨 클레임 템플릿을 지정합니다.

3.2.2.8. Trigger

Kubernetes 리소스에서 전체 CI/CD 실행을 정의하는 완전한 CI/CD 시스템을 생성하려면 파이프라인과 함께 트리거를 사용합니다. 트리거는 Git 풀 요청과 같은 외부 이벤트를 캡처하고 처리하여 주요 정보를 추출합니다. 이 이벤트 데이터를 미리 정의된 매개변수 집합에 매핑하면 Kubernetes 리소스를 생성 및 배포하고 파이프라인을 인스턴스화할 수 있는 일련의 작업이 트리거됩니다.

애플리케이션에 Red Hat OpenShift Pipeline을 사용하여 CI/CD 워크플로를 정의하는 경우를 예로 들 수 있습니다. 새로운 변경 사항을 애플리케이션 리포지토리에 적용하려면 파이프라인을 시작해야 합니다. 트리거는 모든 변경 이벤트를 캡처하여 처리하고 최신 변경 사항이 적용된 새 이미지를 배포하는 파이프라인 실행을 트리거하는 방식으로 이 프로세스를 자동화합니다.

트리거는 함께 작동하여 재사용 가능하고 분리되고 자체 유지되는 CI/CD 시스템을 형성하는 다음과 같은 주요 리소스로 구성됩니다.

  • TriggerBinding 리소스는 이벤트 페이로드에서 필드를 추출한 다음 해당 필드를 매개변수로 저장합니다.

    다음은 수신된 이벤트 페이로드에서 Git 리포지토리 정보를 추출하는 TriggerBinding 리소스의 코드 조각 예입니다.

    apiVersion: triggers.tekton.dev/v1beta1 1
    kind: TriggerBinding 2
    metadata:
      name: vote-app 3
    spec:
      params: 4
      - name: git-repo-url
        value: $(body.repository.url)
      - name: git-repo-name
        value: $(body.repository.name)
      - name: git-revision
        value: $(body.head_commit.id)
    1
    TriggerBinding 리소스의 API 버전입니다. 예에서는 v1beta1 입니다.
    2
    Kubernetes 개체의 유형을 지정합니다. 예에서는 TriggerBinding입니다.
    3
    TriggerBinding 리소스를 확인하는 고유한 이름입니다.
    4
    수신한 이벤트 페이로드에서 추출하여 TriggerTemplate 리소스로 전달할 매개변수 목록입니다. 예에서는 Git 리포지토리 URL, 이름 및 개정 정보가 이벤트 페이로드의 본문에서 추출됩니다.
  • TriggerTemplate 리소스는 리소스를 생성해야 하는 방법에 대해 표준 역할을 합니다. TriggerBinding 리소스에서 매개변수화된 데이터를 사용하는 방식을 지정합니다. 트리거 템플릿은 트리거 바인딩을 통해 입력을 수신한 다음 새 파이프라인 리소스를 생성하고 새 파이프라인 실행을 시작하는 일련의 작업을 수행합니다.

    다음은 방금 생성한 TriggerBinding 리소스에서 수신한 Git 리포지토리 정보를 사용하여 애플리케이션을 생성하는 TriggerTemplate 리소스의 코드 조각입니다.

    apiVersion: triggers.tekton.dev/v1beta1 1
    kind: TriggerTemplate 2
    metadata:
      name: vote-app 3
    spec:
      params: 4
      - name: git-repo-url
        description: The git repository url
      - name: git-revision
        description: The git revision
        default: pipelines-1.9
      - name: git-repo-name
        description: The name of the deployment to be created / patched
    
      resourcetemplates: 5
      - apiVersion: tekton.dev/v1beta1
        kind: PipelineRun
        metadata:
          name: build-deploy-$(tt.params.git-repo-name)-$(uid)
        spec:
          serviceAccountName: pipeline
          pipelineRef:
            name: build-and-deploy
          params:
          - name: deployment-name
            value: $(tt.params.git-repo-name)
          - name: git-url
            value: $(tt.params.git-repo-url)
          - name: git-revision
            value: $(tt.params.git-revision)
          - name: IMAGE
            value: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/$(tt.params.git-repo-name)
          workspaces:
          - name: shared-workspace
            volumeClaimTemplate:
             spec:
              accessModes:
               - ReadWriteOnce
              resources:
                requests:
                  storage: 500Mi
    1
    TriggerTemplate 리소스의 API 버전입니다. 예에서는 v1beta1 입니다.
    2
    Kubernetes 개체의 유형을 지정합니다. 예에서는 TriggerTemplate입니다.
    3
    TriggerTemplate 리소스를 식별하는 고유 이름입니다.
    4
    TriggerBinding 리소스에서 제공되는 매개변수입니다.
    5
    TriggerBinding 또는 EventListener 리소스를 통해 수신한 매개변수를 사용하여 리소스를 생성해야 하는 방법을 지정하는 템플릿 목록입니다.
  • Trigger 리소스는 TriggerBindingTriggerTemplate 리소스를 결합하고 선택적으로 interceptors 이벤트 프로세서를 결합합니다.

    인터셉터는 TriggerBinding 리소스 전에 실행되는 특정 플랫폼의 모든 이벤트를 처리합니다. 인터셉터를 사용하여 페이로드를 필터링하고, 이벤트를 확인하고, 트리거 조건을 정의 및 테스트하고, 기타 유용한 처리를 구현할 수 있습니다. 인터셉터는 이벤트 확인을 위해 시크릿을 사용합니다. 이벤트 데이터가 인터셉터를 통과하면 페이로드 데이터를 트리거 바인딩에 전달하기 전에 트리거로 이동합니다. 인터셉터를 사용하여 EventListener 사양에서 참조된 관련 트리거의 동작을 수정할 수도 있습니다.

    다음 예제는 TriggerBindingTriggerTemplate 리소스와 interceptors 이벤트 프로세서를 연결하는 vote-trigger라는 Trigger 리소스의 코드 조각을 보여줍니다.

    apiVersion: triggers.tekton.dev/v1beta1 1
    kind: Trigger 2
    metadata:
      name: vote-trigger 3
    spec:
      serviceAccountName: pipeline 4
      interceptors:
        - ref:
            name: "github" 5
          params: 6
            - name: "secretRef"
              value:
                secretName: github-secret
                secretKey: secretToken
            - name: "eventTypes"
              value: ["push"]
      bindings:
        - ref: vote-app 7
      template: 8
         ref: vote-app
    ---
    apiVersion: v1
    kind: Secret 9
    metadata:
      name: github-secret
    type: Opaque
    stringData:
      secretToken: "1234567"
    1
    Trigger 리소스의 API 버전입니다. 예에서는 v1beta1 입니다.
    2
    Kubernetes 개체의 유형을 지정합니다. 이 예제에서는 Trigger입니다.
    3
    Trigger 리소스를 식별하는 고유 이름입니다.
    4
    사용할 서비스 계정 이름입니다.
    5
    참조할 인터셉터 이름입니다. 예에서는 github입니다.
    6
    지정할 매개 변수입니다.
    7
    TriggerTemplate 리소스에 연결할 TriggerBinding 리소스의 이름입니다.
    8
    TriggerBinding 리소스에 연결할 TriggerTemplate 리소스의 이름입니다.
    9
    이벤트를 확인하는 데 사용할 시크릿입니다.
  • EventListener 리소스는 JSON 페이로드와 함께 들어오는 HTTP 기반 이벤트를 수신 대기하는 끝점 또는 이벤트 싱크를 제공합니다. 각 TriggerBinding 리소스에서 이벤트 매개변수를 추출한 다음 이 데이터를 처리하여 해당 TriggerTemplate 리소스에서 지정하는 Kubernetes 리소스를 생성합니다. 또한 EventListener 리소스는 페이로드 유형을 확인하고 선택적으로 수정하는 이벤트 interceptors를 사용하여 페이로드에 대한 간단한 이벤트 처리 또는 기본 필터링 작업을 수행합니다. 현재 파이프라인 트리거는 Webhook Interceptors, GitHub Interceptors, GitLab Interceptors, Bitbucket Interceptors, Common Expression Language (CEL) Interceptors의 5 가지 유형의 인터셉터를 지원합니다.

    다음 예제에서는 vote-trigger라는 Trigger 리소스를 참조하는 EventListener 리소스를 보여줍니다.

    apiVersion: triggers.tekton.dev/v1beta1 1
    kind: EventListener 2
    metadata:
      name: vote-app 3
    spec:
      serviceAccountName: pipeline 4
      triggers:
        - triggerRef: vote-trigger 5
    1
    EventListener 리소스의 API 버전입니다. 예에서는 v1beta1 입니다.
    2
    Kubernetes 개체의 유형을 지정합니다. 예에서는 EventListener입니다.
    3
    EventListener 리소스를 식별하는 고유 이름입니다.
    4
    사용할 서비스 계정 이름입니다.
    5
    EventListener 리소스에서 참조하는 Trigger 리소스의 이름입니다.

3.2.3. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.