用 Tekton 在 Kubernetes 中編寫你的第一條 CI/CD 流水線
Tekton 是一個用於創建持續集成和持續交付(CI/CD)系統的 Kubernetes 原生開源框架。通過對底層實施細節的抽象,它還可以幫助你在多個雲供應商或企業內部系統中進行端到端(構建、測試、部署)應用開發。
Tekton 介紹
Tekton 最初被稱為 Knative Build,後來被重組為獨立的開源項目,有自己的 治理組織,現在是屬於 Linux 基金會 的項目。Tekton 提供了一個集群內的容器鏡像構建和部署工作流程,換句話說,它是一個 持續集成 (CI)和 持續交付 (CD)服務。它由 Tekton 流水線和幾個支持組件如 Tekton CLI、Triggers 和 Catalog 等組成。
Tekton 是一個 Kubernetes 原生應用。它在 Kubernetes 集群中作為擴展被安裝和運行,由一套Kubernetes 定製化資源組成,定義了你為流水線創建和復用的構建塊。由於 Tekton 是一種 Kubernetes 原生技術,所以它非常容易擴展。當你需要增加你的工作負載時,你只需向你的集群添加節點就可以了。由於其可擴展的設計和社區貢獻的組件庫,它也很容易定製。
對於需要 CI/CD 系統來開展工作的開發人員,和為其組織內的開發人員建立 CI/CD 系統的平台工程師,Tekton 是理想選擇。
Tekton 組件
構建 CI/CD 流水線的過程非常複雜,因此 Tekton 為每一步都提供工具。以下是 Tekton 提供的主要組件:
- 流水線 Pipeline: 定義了一組 Kubernetes 自定義資源,作為你用來組裝 CI/CD 流水線的構建塊。
- 觸發器 :一種 Kubernetes 自定義資源,允許你根據從事件有效載荷中提取的信息來創建流水線。例如,你可以在每次創建 Git 倉庫的合併請求時,觸發流水線的實例化和執行。
- 命令行 :提供一個名為
tkn
的命令行界面,你可以使用它從終端與 Tekton 進行交互。 - 儀錶盤 :是 Tekton 流水線的一個基於網頁的圖形界面,顯示流水線的執行信息。
- 目錄 :是一個高質量的、由社區貢獻的 Tekton 構建塊(任務、流水線等),可在你自己的流水線中使用。
- 中心 :是一個基於網頁的圖形界面,用於訪問 Tekton 目錄。
- 操作員 :是一種 Kubernetes 操作員模式,你可以在 Kubernetes 集群中安裝、更新、升級和刪除 Tekton 項目。
- 鏈 :是一個 Kubernetes 自定義資源定義 (CRD)控制器,使你可以在 Tekton 中處理供應鏈安全的問題。正在開發中。
- 結果 :旨在幫助用戶對 CI/CD 工作負載歷史進行邏輯分組,並將長期結果的存儲從流水線控制器中分離出來。
Tekton 術語
![Tekton terminology](/data/attachment/album/202304/01/180852sdach2l5mdl25b4i.png "Tekton terminology")
- 步驟 :是 CI/CD 工作流程中最基本的實體,例如為 Python 網路應用程序運行一些單元測試或編譯一個 Java 程序。Tekton 使用容器鏡像執行每個步驟。
- 任務 ::kissing:* 是按特定順序排列的步驟的集合。Tekton 以 Kubernetes 容器莢 的形式運行任務,其中每個步驟都成為 容器莢 中的一個運行容器。
- 流水線 :是按特定順序排列的任務的集合。Tekton 把所有任務連接成一個 有向無環圖 (DAG),並按順序執行圖。換句話說,它創建了一些 Kubernetes 容器莢,並確保每個容器莢按預期成功運行。
![Tekton pipelines](/data/attachment/album/202304/01/180852rfll4phhzwztic01.png "Tekton pipelines")
- 流水線運行 :顧名思義,是一條流水線的具體執行。
- 任務運行 :是一個任務的具體執行。你可以選擇在流水線外運行一次任務運行,可以通過它查看任務中每個步驟執行的具體情況。
創建你的 CI/CD 流水線
開始使用 Tekton 的最簡單方法是自己編寫一個簡單的流水線。如果你每天都在使用 Kubernetes,那你可能對 YAML 很熟悉,這正是 Tekton 流水線的定義方式。下面是一個克隆代碼庫的簡單流水線的例子。
首先,創建一個 task.yaml
文件,用你喜歡的文本編輯器打開它。這個文件定義了你要執行的 步驟 。在這個例子中,就是克隆一個倉庫,所以我把這個步驟命名為 「clone」。該文件設置了一些環境變數,然後使用一個簡單的 shell 腳本來執行克隆。
接下來是 任務 。你可以把步驟看作是一個被任務調用的函數,而任務則設置步驟所需的參數和工作空間。
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: git-clone
spec:
workspaces:
- name: output
description: The git repo will be cloned onto the volume backing this Workspace.
params:
- name: url
description: Repository URL to clone from.
type: string
- name: revision
description: Revision to checkout. (branch, tag, sha, ref, etc...)
type: string
default: ""
steps:
- name: clone
image: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.21.0"
env:
- name: PARAM_URL
value: $(params.url)
- name: PARAM_REVISION
value: $(params.revision)
- name: WORKSPACE_OUTPUT_PATH
value: $(workspaces.output.path)
script: |
#!/usr/bin/env sh
set -eu
CHECKOUT_DIR="${WORKSPACE_OUTPUT_PATH}"
/ko-app/git-init
-url="${PARAM_URL}"
-revision="${PARAM_REVISION}"
-path="${CHECKOUT_DIR}"
cd "${CHECKOUT_DIR}"
EXIT_CODE="$?"
if [ "${EXIT_CODE}" != 0 ] ; then
exit "${EXIT_CODE}"
fi
# Verify clone is success by reading readme file.
cat ${CHECKOUT_DIR}/README.md
創建第二個文件 pipeline.yaml
,並用你喜歡的文本編輯器打開它。這個文件通過設置諸如可以運行和處理任務的工作區等重要參數來定義流水線。
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: cat-branch-readme
spec:
params:
- name: repo-url
type: string
description: The git repository URL to clone from.
- name: branch-name
type: string
description: The git branch to clone.
workspaces:
- name: shared-data
description: |
This workspace will receive the cloned git repo and be passed
to the next Task for the repo's README.md file to be read.
tasks:
- name: fetch-repo
taskRef:
name: git-clone
workspaces:
- name: output
workspace: shared-data
params:
- name: url
value: $(params.repo-url)
- name: revision
value: $(params.branch-name)
最後,創建一個 pipelinerun.yaml
文件,用喜歡的文本編輯器打開它。這個文件真正的運行流水線。它調用流水線中定義的參數(繼而調用任務文件中定義的任務)。
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: git-clone-checking-out-a-branch
spec:
pipelineRef:
name: cat-branch-readme
workspaces:
- name: shared-data
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
params:
- name: repo-url
value: <https://github.com/tektoncd/pipeline.git>
- name: branch-name
value: release-v0.12.x
把不同工作分在不同的文件中的好處是,git-clone
任務可以在多條流水線中復用。
例如,假設你想為一個流水線項目做端到端的測試。你可以使用 git-clone
任務 來讓每一次測試都基於最新的代碼。
總結
只要你熟悉 Kubernetes,那 Tekton 對你來說就像其他 Kubernetes 原生應用一樣簡單。它有很多工具可以幫助你創建流水線並與之交互。如果你喜歡自動化,不妨試試 Tekton!
via: https://opensource.com/article/21/11/cicd-pipeline-kubernetes-tekton
作者:Savita Ashture 選題:lujun9972 譯者:lxbwolf 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive