Tekton Pipelines--Task

前言

Tekton Pipelines是一個開源實現,可爲您的Kubernetes應用程序配置和運行CI / CD風格的管道。java

Pipelines建立自定義資源做爲構建塊去聲明Pipelines。git

自定義資源是Kubernetes API的擴展,能夠建立自定義Kubernetes對象。安裝自定義資源後,用戶可使用kubectl建立和訪問其對​​象,就像對pod,部署等內置資源同樣。這些資源在集羣上運行,並由Kubernetes自定義資源定義(CRD)實施。github

關於此設計的高級細節:web

  • Pipelines不知道什麼會觸發它們,它們能夠由事件或手動建立PipelineRun觸發。
  • Tasks能夠單獨存在,而且能夠徹底獨立於Pipelines調用。它們具備高內聚低耦合特色。
  • Tasks能夠取決於其餘Tasks建立的工件和參數。
  • Tasks能夠被TaskRuns調用。
  • PipelineResources是用做Tasks輸入和輸出的工件。

接下來咱們將逐一介紹以下構建組件:docker

與特定組件無關的其餘參考主題:ubuntu

該篇主要介紹Task。segmentfault

Task

Task(或ClusterTask)是您但願在連續集成流程中運行的順序步驟的集合。任務將在集羣上的pod內運行。api

一個 Task 聲明包括:數組

  • Inputs
  • Outputs
  • Steps

Task的做用範圍是一個namespace,而ClusterTask的做用範圍是整個kubernetes 集羣。緩存

ClusterTask

與Task相似,可是做用域是整個集羣。

若是使用ClusterTask,則應添加TaskRef類型。默認類型是Task,它表明命名空間的Task。

apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
  name: demo-pipeline
  namespace: default
spec:
  tasks:
    - name: build-skaffold-web
      taskRef:
        name: build-push
        kind: ClusterTask
      params: ....

ask的功能與ClusterTask徹底相同,所以下面對Task的全部引用也描述了ClusterTask.

語法

要爲Task資源定義配置文件,能夠指定如下字段:

  • 必寫:

    • apiVersion- 指定 API 版本, 例如tekton.dev/v1alpha1.
    • kind- 指定 Task 資源對象.
    • metadata- 指定數據以惟一標識Task資源對象, 例如name.
    • spec- 爲Task資源對象指定配置信息。必須經過如下任一字段定義Task steps:

      • steps - 指定要在Task中運行的一個或多個容器鏡像。
  • 可選:

    • inputs- 指定你Task須要用到的參數和 PipelineResources
    • outputs- 指定你Task 產生的 PipelineResources
    • volumes- 指定一個或多個要用於Tasksteps的 掛載卷.
    • stepTemplate- 指定容器 step 定義,以用做「Task」中全部step的基礎。.
    • sidecars- 指定sidercar容器與steps一塊兒運行.

如下示例是一個無效示例,其中使用了大多數可能的配置字段:

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: example-task-name
spec:
  inputs:
    resources:
      - name: workspace
        type: git
    params:
      - name: pathToDockerFile
        type: string
        description: The path to the dockerfile to build
        default: /workspace/workspace/Dockerfile
  outputs:
    resources:
      - name: builtImage
        type: image
  steps:
    - name: ubuntu-example
      image: ubuntu
      args: ["ubuntu-build-example", "SECRETS-example.md"]
    - image: gcr.io/example-builders/build-example
      command: ["echo"]
      args: ["$(inputs.params.pathToDockerFile)"]
    - name: dockerfile-pushexample
      image: gcr.io/example-builders/push-example
      args: ["push", "$(outputs.resources.builtImage.url)"]
      volumeMounts:
        - name: docker-socket-example
          mountPath: /var/run/docker.sock
  volumes:
    - name: example-volume
      emptyDir: {}

Steps

Steps字段是必填字段。您定義一個或多個Step字段以定義Task主體。

若是定義了多個Step,則由TaskRun調用任務時,將按照定義的順序執行它們。

Task中的每一個Step都必須指定一個遵照容器規約的容器鏡像。對於您定義的每一個Step字段或容器鏡像:

  • 按照配置文件,依次運行和評估容器鏡像。
  • 個容器鏡像一直運行到完成或檢測到第一個故障爲止。
  • 若是容器鏡像在「Task」中的全部容器鏡像中沒有最大的資源請求,則CPU,內存和臨時存儲資源請求將設置爲零。這樣能夠確保執行任務的Pod僅請求執行任務中任何單個容器鏡像所需的資源,而不是請求全部容器鏡像資源請求的總和。

Inputs

一個Task能夠聲明其所需的inputs,能夠是如下之一或所有:

  • 參數
  • 輸入資源

參數

Task能夠聲明在TaskRun期間必須提供給任務的輸入參數。此的一些示例用例包括:

  • 須要知道一個Task構建應用程序時使用什麼編譯標誌。
  • 須要知道如何命名已構建工件的Task。

參數名稱僅限於字母數字字符-和_,而且只能以字母字符和_開頭。例如,fooIs-Bar_是有效的參數名稱,barIsBa $或0banana不是。

每一個聲明的參數都有一個類型字段,若是用戶未提供,則假定爲字符串。另外一個可能的類型是數組-例如,當須要向構建應用程序的任務提供動態數量的編譯標誌時,此數組頗有用。提供實際參數值時,將根據類型字段驗證其解析的類型。

用法

如下示例顯示如何對Tasks進行參數化,以及如何將這些參數從TaskRun傳遞給Task。
$(inputs.params.foo)形式的輸入參數在步驟內被替換(另請參見變量替換)。
如下Task聲明一個名爲「 flags」的輸入參數,並在steps.args列表中使用它。

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: task-with-parameters
spec:
  inputs:
    params:
      - name: flags
        type: array
      - name: someURL
        type: string
  steps:
    - name: build
      image: my-builder
      args: ["build", "$(inputs.params.flags)", "url=$(inputs.params.someURL)"]

如下TaskRun在flags參數中提供了動態數目的字符串:

apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
  name: run-with-parameters
spec:
  taskRef:
    name: task-with-parameters
  inputs:
    params:
      - name: flags
        value: 
          - "--set"
          - "arg1=foo"
          - "--randomflag"
          - "--someotherflag"
      - name: someURL
        value: "http://google.com"

Input resources

使用輸入的PipelineResources字段爲您的任務提供任務所需的數據或上下文。

Outputs

Task定義能夠包括輸入和輸出PipelineResource聲明。若是僅在輸出中聲明瞭特定的資源集,則預期在下一個任務上載或共享的資源副本位於路徑/ workspace / output / resource_name /下。

resources:
  outputs:
    name: storage-gcs
    type: gcs
steps:
  - image: objectuser/run-java-jar #https://hub.docker.com/r/objectuser/run-java-jar/
    command: [jar]
    args:
      ["-cvf", "-o", "/workspace/output/storage-gcs/", "projectname.war", "*"]
    env:
      - name: "FOO"
        value: "world"

注意:若是任務依賴於輸出資源功能,則「任務步驟」字段中的容器沒法在路徑/ workspace / output中裝入任何內容。

在如下示例中,Task tar-artifact資源同時用做輸入和輸出,所以將輸入資源下載到目錄customworkspace(在targetPath中指定)。Step untar將tar文件提取到tar-scratch-space目錄中,edit-tar添加一個新文件,最後一個步驟tar-it-up建立一個新的tar文件並將其放置在/ workspace / customworkspace /目錄中。執行完任務步驟後,目錄/ workspace / customworkspace中的(新)tar文件將被上傳到tar-artifact資源定義中定義的存儲桶中.

resources:
  inputs:
    name: tar-artifact
    targetPath: customworkspace
  outputs:
    name: tar-artifact
steps:
 - name: untar
    image: ubuntu
    command: ["/bin/bash"]
    args: ['-c', 'mkdir -p /workspace/tar-scratch-space/ && tar -xvf /workspace/customworkspace/rules_docker-master.tar -C /workspace/tar-scratch-space/']
 - name: edit-tar
    image: ubuntu
    command: ["/bin/bash"]
    args: ['-c', 'echo crazy > /workspace/tar-scratch-space/rules_docker-master/crazy.txt']
 - name: tar-it-up
   image: ubuntu
   command: ["/bin/bash"]
   args: ['-c', 'cd /workspace/tar-scratch-space/ && tar -cvf /workspace/customworkspace/rules_docker-master.tar rules_docker-master']

Volumes

爲你的Task或是全部的step指定一個或多個須要用到volume。

如,使用捲來完成如下常見任務之一:

  • 掛載k8s secret。
  • 建立一個emptyDir卷以充當緩存,以便在多個構建步驟中使用。考慮使用永久捲進行內部版本緩存。
  • 掛載k8s configmap
  • 載主機的Docker套接字以使用Dockerfile進行容器映像構建。注意:使用docker build on-cluster構建容器映像是很是不安全的。請改用kaniko。這僅用於演示目的

Step Template

指定一個容器配置,它將用做「任務」中全部步驟的基礎。單個步驟中的配置將覆蓋或與步驟模板的配置合併。

在下面的示例中,任務指定環境變量FOO設置爲bar的stepTemplate。第一步將對該值使用FOO,可是在第二步中,將FOO覆蓋並設置爲baz。

stepTemplate:
  env:
    - name: "FOO"
      value: "bar"
steps:
  - image: ubuntu
    command: [echo]
    args: ["FOO is ${FOO}"]
  - image: ubuntu
    command: [echo]
    args: ["FOO is ${FOO}"]
    env:
      - name: "FOO"
        value: "baz"

Sidecars

指定要與「步驟」一塊兒運行的「容器」列表。這些容器能夠提供輔助功能,例如Docker中的Docker或運行模擬API服務器,以使您的應用在測試過程當中命中。
Sidecar在執行Task的步驟以前啓動,並在全部步驟完成後銷燬。有關Sidecar生命週期的更多信息,請參閱[TaskRun文檔]
(https://github.com/tektoncd/p...

如下示例中,運行了docker in docker的 sidecar,以便一個步驟可使用它來構建docker映像

steps:
  - image: docker
    name: client
    workingDir: /workspace
    command:
      - /bin/sh
      - -c
      - |
        cat > Dockerfile << EOF
        FROM ubuntu
        RUN apt-get update
        ENTRYPOINT ["echo", "hello"]
        EOF
        docker build -t hello . && docker run hello
        docker images
    volumeMounts:
      - mountPath: /var/run/
        name: dind-socket
sidecars:
  - image: docker:18.05-dind
    name: server
    securityContext:
      privileged: true
    volumeMounts:
      - mountPath: /var/lib/docker
        name: dind-storage
      - mountPath: /var/run/
        name: dind-socket
volumes:
  - name: dind-storage
    emptyDir: {}
  - name: dind-socket
    emptyDir: {}

Variable Substitution

任務支持使用全部輸入和輸出中的值替換字符串。

可使用如下變量替換語法在任務規範中引用輸入參數,其中<name>是參數的名稱:

$(inputs.params.<name>)

來自資源的參數值也可使用變量替換來訪問。

參數類型爲數組的變量替換

類型爲array的引用參數將擴展爲在引用字符串的位置插入數組元素。

所以,使用如下參數:

inputs:
    params:
      - name: array-param
        value: 
          - "some"
          - "array"
          - "elements"

then command: ["first", "$(inputs.params.array-param)", "last"] 將變成 command: ["first", "some", "array", "elements", "last"]

請注意,必須在較大的字符串數組中的徹底隔離的字符串中引用數組參數。任何其餘嘗試引用數組的嘗試均無效,而且將引起錯誤。

例如,若是build-args是array類型的聲明參數,那麼這是無效的步驟,由於字符串不是隔離的:

- name: build-step
      image: gcr.io/cloud-builders/some-image
      args: ["build", "additionalArg $(inputs.params.build-args)"]

一樣,在非數組字段中引用build-args也無效:

- name: build-step
      image: "$(inputs.params.build-args)"
      args: ["build", "args"]

對build-args參數的有效引用是隔離的,而且位於合格字段(本例中爲args)中:

- name: build-step
      image: gcr.io/cloud-builders/some-image
      args: ["build", "$(inputs.params.build-args)", "additonalArg"]

Variable Substitution within Volumes

能夠設置任務卷名稱和不一樣類型的卷。當前支持包括普遍使用的卷類型,例如configmap,secret和PersistentVolumeClaim。這是有關如何在「任務定義」中使用此示例。

Examples

例如,封裝Dockerfile構建的Task可能看起來像這樣:

注意:使用docker build on-cluster構建容器映像是很是不安全的。請改用kaniko。這僅用於演示目的。

spec:
  inputs:
    resources:
      - name: workspace
        type: git
    params:
      # These may be overridden, but provide sensible defaults.
      - name: directory
        type: string
        description: The directory containing the build context.
        default: /workspace
      - name: dockerfileName
        type: string
        description: The name of the Dockerfile
        default: Dockerfile
  outputs:
    resources:
      - name: builtImage
        type: image
  steps:
    - name: dockerfile-build
      image: gcr.io/cloud-builders/docker
      workingDir: "$(inputs.params.directory)"
      args:
        [
          "build",
          "--no-cache",
          "--tag",
          "$(outputs.resources.image)",
          "--file",
          "$(inputs.params.dockerfileName)",
          ".",
        ]
      volumeMounts:
        - name: docker-socket
          mountPath: /var/run/docker.sock

    - name: dockerfile-push
      image: gcr.io/cloud-builders/docker
      args: ["push", "$(outputs.resources.image)"]
      volumeMounts:
        - name: docker-socket
          mountPath: /var/run/docker.sock

  # As an implementation detail, this Task mounts the host's daemon socket.
  volumes:
    - name: docker-socket
      hostPath:
        path: /var/run/docker.sock
        type: Socket

使用一個外部 volume

掛載多個卷:

spec:
  steps:
    - image: ubuntu
      entrypoint: ["bash"]
      args: ["-c", "curl https://foo.com > /var/my-volume"]
      volumeMounts:
        - name: my-volume
          mountPath: /var/my-volume

    - image: ubuntu
      args: ["cat", "/etc/my-volume"]
      volumeMounts:
        - name: my-volume
          mountPath: /etc/my-volume

  volumes:
    - name: my-volume
      emptyDir: {}

使用 Kubernetes Configmap 做爲卷

spec:
 inputs:
   params:
     - name: CFGNAME
       type: string
       description: Name of config map
     - name: volumeName
       type: string
       description: Name of volume
 steps:
   - image: ubuntu
     entrypoint: ["bash"]
     args: ["-c", "cat /var/configmap/test"]
     volumeMounts:
       - name: "$(inputs.params.volumeName)"
         mountPath: /var/configmap

 volumes:
   - name: "$(inputs.params.volumeName)"
     configMap:
       name: "$(inputs.params.CFGNAME)"

使用 secret 做爲環境變量

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
 name: goreleaser
spec:
 inputs:
   params:
   - name: package
     type: string
     description: base package to build in
   - name: github-token-secret
     type: string
     description: name of the secret holding the github-token
     default: github-token
   resources:
   - name: source
     type: git
     targetPath: src/$(inputs.params.package)
 steps:
 - name: release
   image: goreleaser/goreleaser
   workingdir: /workspace/src/$(inputs.params.package)
   command:
   - goreleaser
   args:
   - release
   env:
   - name: GOPATH
     value: /workspace
   - name: GITHUB_TOKEN
     valueFrom:
       secretKeyRef:
         name: $(inputs.params.github-token-secret)
         key: bot-token
相關文章
相關標籤/搜索