kustomize로 Tekton 작업의 단계를 재사용하는 방법

Original post



Tekton 작업을 만드는 것은 정말 재미있습니다! Pod 컨테이너와 유사하고 작동 방식이 개발 및 테스트를 매우 쉽게 만듭니다. 그래도 reviewdog 을 사용할 때와 같이 여러 작업에서 단계를 재사용해야 하는 경우가 있습니다.

이 게시물에서는 kustomize 을 사용하여 매우 쉽게 이 작업을 수행하는 방법을 배우고 저장소 danielfbm/tekton-tasks-kustomize 에는 바로 사용할 수 있는 예제가 있습니다.

아래와 같이 두 가지 다른 작업golang-testgolangci-lintreviewdog-report 단계를 추가해야 한다고 가정해 보겠습니다.



가장 확실한 방법은 단계를 복사하여 붙여넣는 것이지만 n 작업이 있는 더 복잡한 시나리오의 경우 오류가 발생하기 쉽습니다. helm 과 같은 템플릿 엔진을 사용하면 도움이 될 수 있지만 다른 템플릿 엔진을 배우고 해당 작업의 내용을 변경해야 하는 것도 부담이 됩니다. 대신 kustomize 에는 tektoncd/catalog 의 작업을 재활용하면서 이 작업을 더 쉽게 수행할 수 있는 도구 세트가 있습니다.

폴더 구조




├── overlays
└── tasks



  • 작업은 작업 파일을 호스팅합니다.

  • 오버레이는 공유 단계 추가와 같은 패치를 호스팅합니다.

  • 작업



    작업을 준비하십시오. 이 예에서는 golang-test golangci-lint 을 사용하므로 적절하게 조정하십시오.

    단편



    작업이 준비되면 params , workspaces , results , steps 등과 같이 필요한 모든 추가 항목으로 구성되어야 하는 스니펫을 준비할 시간입니다.

    spec:
      params:
      # since we are splitting the steps, the previous step needs to save the output to a file
      - name: report-file
        default: reportfile
        description: Report file with errors
      # format of the report file
      - name: format
        default: golint
        description: Format of error input from the task
      # reviewdog supports many reporter types
      - name: reporter
        default: local
        description: Reporter type for reviewdog https://github.com/reviewdog/reviewdog#reporters
      # reviewdog needs a diff for precise pull request comments
      - name: diff
        default: git diff FETCH_HEAD
        description: Diff command https://github.com/reviewdog/reviewdog#reporters
    
      workspaces:
      - name: token
        description: |
          Workspace which contains a token file for Github Pull Request comments. Must have a token file with the Github API access token
    
      steps:
      - name: reviewdog-report
        image: golangci/golangci-lint:v1.31-alpine
        # both have the same workspace name
        workingDir: $(workspaces.source.path)
        script: |
          #!/bin/sh
    
          set -ue
          wget -O - -q https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b $(go env GOPATH)/bin
          export REVIEWDOG_GITHUB_API_TOKEN=$(cat $(workspaces.token.path)/token)
          cat $(params.reportfile) | reviewdog -f=$(params.format) -diff="$(params.diff)"
    
    
    


    반점



    위의 스니펫을 사용하여 패치를 만들 차례입니다. 나는 patch로 스니펫을 직접 사용해 보았지만 성공하지 못했기 때문에 JSON6902 patch 을 만들기로 결정했습니다.

    # parameters
    - op: add
      path: /spec/params/-
      value:
        name: report-file
        default: reportfile
        description: Report file with errors
    - op: add
      path: /spec/params/-
      value:
        name: format
        default: golint
        description: Format of error input from the task
    - op: add
      path: /spec/params/-
      value:
        name: reporter
        default: local
        description: Reporter type for reviewdog https://github.com/reviewdog/reviewdog#reporters
    - op: add
      path: /spec/params/-
      value:
        name: diff
        default: git diff FETCH_HEAD
        description: Diff command https://github.com/reviewdog/reviewdog#reporters
    
    # workspaces
    - op: add
      path: /spec/workspaces/-
      value:
        name: token
        description: |
          Workspace which contains a token file for Github Pull Request comments. Must have a token file with the Github API access token
    
    # steps
    - op: add
      path: /spec/steps/-
      value:
        name: reviewdog-report
        image: golangci/golangci-lint:v1.31-alpine
        # both have the same workspace name
        workingDir: $(workspaces.source.path)
        script: |
          #!/bin/sh
    
          set -ue
          wget -O - -q https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b $(go env GOPATH)/bin
          export REVIEWDOG_GITHUB_API_TOKEN=$(cat $(workspaces.token.path)/token)
          cat $(params.reportfile) | reviewdog -f=$(params.format) -diff="$(params.diff)"
    
    

    reviewdog-step-patch.yaml로 저장하고 다음 내용으로 kustomization.yaml를 만듭니다.

    bases:
    - ../tasks
    
    patches:
    - path: ./reviewdog-step-patch.yaml
      target:
        kind: Task
    


    추가 패치



    모든 kustomization.yaml 파일이 올바르게 설정되었는지 확인하고 kustomize build overlays를 실행해 보십시오. params , workspacesparams가 추가된 것을 볼 수 있습니다.

    하지만 기다려! 우리는 여전히 점들을 연결해야 합니다. 가져온 작업을 수정하지 않으면 여전히 작동하지 않습니다.
    golangci-lint 작업의 경우 매개변수 $(params.report-file)에 지정된 대로 결과를 파일에 저장하고 $(params.format) 매개변수의 기본 형식을 golangci-lint로 변경해야 합니다.

    golangci-린트




    - op: replace
      path: /spec/params/11/default
      value: golangci-lint
    
    - op: replace
      path: /spec/steps/0/script
      value: |
        golangci-lint run $(params.flags) > $(params.report-file)
    


    파일을 overlays/golangci-lint-patch.yaml로 저장하고 overlays/kustomization.yaml에 추가합니다.

    [...]
    - path: ./golangci-lint-patch.yaml
      target:
        kind: Task
        name: golangci-lint
    


    golang 테스트



    다음은 golang-test 작업에 대한 변경 사항이며 이를 golint로 변경합니다.

    - op: replace
      path: /spec/steps/0/script
      value: |
        if [ ! -e $GOPATH/src/$(params.package)/go.mod ];then
             SRC_PATH="$GOPATH/src/$(params.package)"
             mkdir -p $SRC_PATH
             cp -R "$(workspaces.source.path)/$(params.context)"/* $SRC_PATH
             cd $SRC_PATH
          fi
          golint $(params.packages) > $(params.report-file)
    


    항목을 overlays/kustomization.yaml에 추가합니다.

    - path: ./golint-patch.yaml
      target:
        kind: Task
        name: golang-test
    


    접미사



    원래 작업을 유지하고 새 작업만 추가하려면 파일에 접미사를 추가overlays/kustomization.yaml하면 됩니다.

    nameSuffix: -review
    


    테스트


    kubectl apply -k overlays 또는 kustomize build overlays | kubectl apply -f -를 사용하여 작업을 Kubernetes 클러스터에 적용합니다.

    결과 파일 트리는 다음과 같아야 합니다.

    ├── overlays
    │   ├── golangci-lint-patch.yaml
    │   ├── golint-patch.yaml
    │   ├── kustomization.yaml
    │   └── reviewdog-step-patch.yaml
    └── tasks
        ├── golang-test.yaml
        ├── golangci-lint.yaml
        └── kustomization.yaml
    


    새로운 golang-test-reviewgolangci-lint-review를 즐기십시오.

    좋은 웹페이지 즐겨찾기