Tekton Pipelines是一個開源實現,可爲您的Kubernetes應用程序配置和運行CI / CD風格的管道。java
Pipelines建立自定義資源做爲構建塊去聲明Pipelines。git
自定義資源是Kubernetes API的擴展,能夠建立自定義Kubernetes對象。安裝自定義資源後,用戶可使用kubectl建立和訪問其對象,就像對pod,部署等內置資源同樣。這些資源在集羣上運行,並由Kubernetes自定義資源定義(CRD)實施。github
關於此設計的高級細節:web
接下來咱們將逐一介紹以下構建組件:docker
與特定組件無關的其餘參考主題:ubuntu
該篇主要介紹Task。segmentfault
Task(或ClusterTask)是您但願在連續集成流程中運行的順序步驟的集合。任務將在集羣上的pod內運行。api
一個 Task 聲明包括:數組
Task的做用範圍是一個namespace,而ClusterTask的做用範圍是整個kubernetes 集羣。緩存
與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
- 指定一個或多個要用於Task
中steps
的 掛載卷.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字段是必填字段。您定義一個或多個Step字段以定義Task主體。
若是定義了多個Step,則由TaskRun調用任務時,將按照定義的順序執行它們。
Task中的每一個Step都必須指定一個遵照容器規約的容器鏡像。對於您定義的每一個Step字段或容器鏡像:
一個Task能夠聲明其所需的inputs,能夠是如下之一或所有:
Task能夠聲明在TaskRun期間必須提供給任務的輸入參數。此的一些示例用例包括:
參數名稱僅限於字母數字字符-和_,而且只能以字母字符和_開頭。例如,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"
使用輸入的PipelineResources字段爲您的任務提供任務所需的數據或上下文。
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']
爲你的Task或是全部的step指定一個或多個須要用到volume。
如,使用捲來完成如下常見任務之一:
指定一個容器配置,它將用做「任務」中全部步驟的基礎。單個步驟中的配置將覆蓋或與步驟模板的配置合併。
在下面的示例中,任務指定環境變量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"
指定要與「步驟」一塊兒運行的「容器」列表。這些容器能夠提供輔助功能,例如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: {}
任務支持使用全部輸入和輸出中的值替換字符串。
可使用如下變量替換語法在任務規範中引用輸入參數,其中<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"]
能夠設置任務卷名稱和不一樣類型的卷。當前支持包括普遍使用的卷類型,例如configmap,secret和PersistentVolumeClaim。這是有關如何在「任務定義」中使用此示例。
例如,封裝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
掛載多個卷:
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