經過抽象底層實現細節,用戶能夠跨多雲平臺和本地系統進行構建、測試和部署。java
Pipelines建立自定義資源做爲構建塊去聲明Pipelines。git
Tekton Pipeline中有5類對象,核心理念是經過定義yaml定義構建過程構建任務的狀態存放在status字段中。sql
其中5類對象分別是:PipelineResouce、Task、TaskRun、Pipeline、PipelineRun。docker
Task是單個任務的構建過程,須要經過定義TaskRun任務去運行Task。ubuntu
Pipeline包含多個Task,並在此基礎上定義input和output,以PipelineResource做爲交付。api
PipelineResource是可用於input和output的對象集合。數組
一樣地,須要定義PipelineRun纔會運行Pipeline。bash
下圖中的箭頭放下描述了從一種資源到另外一種資源的依賴。微信
關於Tekton的設計理念:app
Pipelines不知道什麼會觸發它們,它們能夠由事件或手動建立PipelineRun觸發;
Tasks能夠單獨存在,而且能夠徹底獨立於Pipelines調用。它們具備高內聚低耦合特色;
Tasks能夠取決於其餘Tasks建立的工件和參數;
Tasks能夠被TaskRuns調用;
PipelineResources是用做Tasks輸入和輸出的工件。
咱們這裏主要介紹下Task。
Task(或ClusterTask)是但願在連續集成流程中運行的順序步驟的集合。任務將在集羣上的pod內運行。
一個 Task 聲明包括:
Inputs
Outputs
Steps
Task的做用範圍是一個namespace,而ClusterTask的做用範圍是整個kubernetes 集羣。
語法
要爲Task資源定義配置文件,能夠指定如下字段:
必寫:
steps
- 指定要在Task中運行的一個或多個容器鏡像。apiVersion
- 指定 API 版本, 例如tekton.dev/v1alpha1
.kind
- 指定Task
資源對象.metadata
- 指定數據以惟一標識Task
資源對象, 例如name
.spec
- 爲Task
資源對象指定配置信息。必須經過如下任一字段定義Task steps:可選:
inputs
- 指定你Task
須要用到的參數和PipelineResources
outputs
- 指定你Task
產生的PipelineResources
volumes
- 指定一個或多個要用於Task
中steps
的 掛載卷.stepTemplate
- 指定容器
step 定義,以用做「Task」中全部step
的基礎。.sidecars
- 指定sidercar容器與steps一塊兒運行.
apiVersion: tekton.dev/v1alpha1kind: Taskmetadata: name: example-task-namespec: 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/v1alpha1kind: Taskmetadata: name: task-with-parametersspec: 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)"]
Outputs
Task定義能夠包括輸入和輸出PipelineResource聲明。若是僅在輸出中聲明瞭特定的資源集,則預期在下一個任務上載或共享的資源副本位於路徑/ workspace / output / resource_name /下。
resources: outputs: name: storage-gcs type: gcssteps: - 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"
Pipeline的正常運轉還須要其餘的資源配合如: 經過Secrets掛載到工做容器的Git、Docker的帳戶或token;容器內訪問k8s集羣所須要的serviceAccount。這些憑據資源掛載到tekton提供的特殊基礎鏡像容器,由這些基礎容器(一般是initContainers)來對帳戶、憑據進行讀取。
結語
Tekton Pipeline 中的任務模板能夠拿來複用,而不須要重複定義,另外經過 CRD 從新定義 CI/CD 是一大亮點。
---------------------------------------------------
官方資訊*最新技術*獨家解讀
本文分享自微信公衆號 - Go Official Blog(Go_Official_Blog)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。