在 Jenkins 上輕鬆重用 Tekton 和 Jenkins X


翻譯:0N0thing
編輯:suke

. 什麼是 Tekton?

Tekton 是一款強大且靈活的開源框架,它被用來創建 CI/CD 系統,允許開發者們在雲提供商本地系統上構建、測試以及部署。

. 爲什麼使用 Tekton?

Tekton 流水線有諸多好處:

  • 它們是雲原生的並且專爲 Kubernetes 設計。

  • 每個 Tekton Pipeline 可以完全聲明性也可完全自描述;它本身不依賴於任何外部的 Jenkins 控制器、插件或插件/控制器配置。

  • 每個 Pipeline Task 運行在一個獨立的 Pod 內,它完全獨立於其他 pods 以及流水線並完全由 Kubernetes 調度從而最大限度的提升彈性以及優化資源使用。一個糟糕的流水線並不會影響另外一個, Kubernetes 會統一調度它們。

  • 每個步驟可以是運行在任何容器鏡像的任何命令,不管你需要什麼樣的密鑰、掛載存儲、環境變量和資源限制

  • 不需要綁定一個 JVM 或者 Jenkins Remoting 容器到 pod 內因此可以幫你保持資源以及降低成本。

. 爲什麼將 Jenkins 與 Tekton 使用到一起去呢?

Jenkins 是目前最流行的開源的自動化服務器。許許多多的開發者每天使用它用來完成一些工作。Jenkins 現在也可以使用於自動化 Tekton 流水線,這意味着可以幫助越來越多的團隊爲他們的 CI 和 CD 數字化轉型到雲原生方案提供可能。這樣,你可以使用 Tekton 流水線引擎同時從使用 Jenkins 作爲編排工具,用戶界面以及報告引擎中獲益。

. 介紹下 Jenkins Tekton 插件

Jenkins Tekton Client 插件可以讓你輕鬆的使用 Jenkins 自動化創建運行 Tekton 流水線。它彌補了 Kubernetes 學習的鴻溝並可以通過 Jenkins 調用 Tekton Pipelines。這就允許了用戶在沒有學習 Kubernetes 相關知識的前提下上手和工作。

僅僅就安裝一個 Jenkins 插件 - 所以使用起來非常簡單。

相關的背景知識,請查閱該插件的開發者 Vibhav Bobade 發表的博客: 使用 Tekton-client-plugin 爲 Jenkins 和 Kubernetes 搭建橋樑。

. 要求

使用  Jenkins Tekton Client 插件的前提是假設你擁有訪問 Kubernetes 集羣的權限。

Kubernetes 集羣需要安裝 Tekton 流水線。

如果你還沒有安裝 Tekton,你可以使用這個 Tekton helm chart。

Jenkins 控制器同樣需要擁有 Kubernetes RBAC 權限用來創建 Tekton 資源以觀察它們和與它相關聯的 pod 以及 pod 日誌。

如果你在 Kubernetes 內運行 Jenkins 控制器時設置  RBAC 的一個簡單的辦法是安裝 Jenkins Resource Helm Chart 和你的 Jenkins 控制器到同一個命名空間。

另一個選擇是安裝 Jenkins X 然後通過 GitOps 設置一個 Jenkins 控制器。

. 指定 Tekton 流水線

你可以通過以下方式配置 Tekton 流水線:

  • git clone 代碼塊中的一個文件路徑

  • Tekton yaml文件的一個 URL

  • yaml 代碼塊

我們建議將 Tekton 流水線定義爲 YAML 文件然後將它們檢入到 git 倉庫裏,這樣你可以使用 GitOps 以及遵循 Pipeline As Code 格式。

這樣意味着你可以將你的流水線在 git 中版本化。另外也可以讓你從爲 Tekton 設計的多種 IDE 插件中獲益。比如 VS Code 和 IDEA 這樣你可以在編輯 YAML 時可以自動補全、格式化文本與文本校驗。

所以你可以使用 Jenkins 支持的常用的 Git 提供程序來克隆包括 Tekton YAML 文件的 git 倉庫然後通過它們的文件名引用它們。

. 通過 Tekton Catalog 重用 流水線

Tekton Catalog 定義了諸多的 Tekton Tasks 可以在你的流水線中重用它們。

我們發現,當涉及到微服務風格的架構時會有許許多多的倉庫和流水線。使用基於 GitOps 的 Pipeline As Code 我們想對所有內容進行版本控制同樣對任何倉庫也可輕鬆使用任意任務或流水線。

例如你有很多倉庫使用當前版本的流水線,但是你想在流水線上嘗試一個新的變更但僅應用於一個倉庫來驗證流水線是否工作正常;如果確實可以的話,再將其應用到更多的倉庫裏面。

這將讓你在不同 git 倉庫嘗試重用變得困難,但是這將最小化 git 倉庫的版本和分支的數量從而簡化所有流水線的維護。

我們在 Jenkins X 項目上發現了基於 GitOps 的一個好方法這樣我們引用 git 中已經版本化的 Tekton Tasks 和 Pipelines 可以簡單實現重用或者是覆蓋

所以我們通過 uses: image notation 重用 Tasks 和 Pipelines 可以在 vanilla Tekton YAML 保存我們所有的 Tekton Tasks 和 Pipelines;這樣 IDE 自動補全以及文本校驗就可以正常工作了 - 而且我們可以很容易的從庫中重用 Tasks 或步驟同時可以對所有內容進行版本控制。

注意如果想通過 uses: image notation 重用步驟/任務,你必須在你的 Job 定義點擊 Tekton Catalog標誌,然後將 uses: 使用到實際的步驟/任務中。

. 什麼是 Jenkins X?


Jenkins X 項目在 Kubernetes 上自動化你的 CI/CD 流程可以幫助你提升:

  • 自動化 CI/CD 流水線幫助你專注於實際的應用程序代碼,Jenkins X 會爲你的項目創建經過測試的 Tekton CI/CD 流水線,該流水線是通過 GitOps 管理的,這對於將你的各個倉庫之間保持流水線爲最新狀態或者是在特定倉庫更新覆蓋流水線或步驟變得非常簡單。

  • 在各個環境通過 GitOps 自動升級產物版本比如 StagingPre-productionProduction。不論他們是否運行在同一個 Kubernetes 集羣還是你爲你的環境使用了多集羣。

  • 預覽環境能夠讓你通過 Pull Request 查看代碼變更以及擁有一個自動創建的預覽環境,在 Kubernetes 運行你的代碼可以讓你在代碼合併到主幹分支之前更快的得到團隊的反饋。

  • ChatOps 在 Pull Requests 提出反饋建議,允許/掛起變更,觸發其他諸如測試以及其他 ChatOps 命令的流水線。

上述均已集成到可複用的 Tekton 流水線中。

. 複用 Jenkins X 流水線

所以我們怎樣從來自 Jenkins 的 Jenkins X 項目複用自動化 CI/CD 流水線呢?

請確保你已經在 Jenkins 服務器上安裝了 Tekton Client 插件。

. 使用一個可工作模板

如果想通過一個例子上手的話,你需要

  • 從這個模板創建一個 Git 倉庫。

  • Jenkins 服務器上添加一個新的 Freestyle project

  • 允許 Git 源碼管理器管理你的新的 github.com 倉庫。

  • 點擊 Add build Step(在頁面底部)然後選擇 Tekton: Create Resource (Raw)

  • 確保輸入類型爲 FILE 然後輸入名稱 .lighthouse/jenkins-x/release.yaml 作爲文件名。

  • 如果你使用 Jenkins X 輸入 jx 命名空間

  • 確保 Enabled Tekton Catalog 爲選中狀態

  • 然後保存流水線 - 配置應該如下所示那樣:


如果你觸發了該流水線,你會看到它創建了一個 Tekton Pipeline 同樣會在 Jenkins 控制檯看到 Tekton 流水線的輸出。流水線實際在 Kubernetes 中是在一個完全獨立的 Pod 內運行的;Jenkins 控制器僅僅是把日誌信息輸出到控制檯。

Jenkins X 集羣中,此流水線也可以正常運行(複用由 Terraform 設置的所有的雲資源以及 IAM 規則)但是在任意的 Kubernetes 集羣由於缺少 GitOps 的定義導致中會遇到一些諸如無法推送鏡像或者不能升級的問題,你可以到 Jenkins X 羣組 諮詢從而解決這些問題。

. 使用一個現有倉庫

你可以通過拷貝你使用的語言包的 YAML 文件配置一個Pull Request 或 Release 流水線。

例如你使用 maven 拷貝 pullrequest.yaml 或 release.yaml 至你的源碼項目中,然後在 Jenkins Job 中引用它:

按照上述操作爲你的 git 倉庫設置 Freestyle project 還有爲你的流水線引用文件。

. 覆蓋步驟

從流水線的庫中複用步驟是一件很酷的事;但是有時你需要改一些東西: 每個步驟用到的的判斷、命令、參數、環境變量或者是方法並不是對你的特定應用程序那麼匹配。你可能需要在這個庫的之前/之後運行一些步驟或者是需要覆蓋一個特定的步驟以讓它執行不同的事情。

你可以在任意共享流水線中自定義任何繼承的步驟或在任意步驟之前/之後添加新的步驟。

實際上所有的 Tekton YAML 是完全聲明式的,所以當你通過 IDE 修改內容時可以非常簡單的驗證和智能補全,而且不需要使用腳本語言以及理解複雜的流水線共享庫。

最簡單的覆蓋步驟的方法是安裝 jx 二進制到你的 $PATH 然後使用 jx 流水線覆蓋命令將會創建一個新的覆蓋本地的步驟,然後你可以在你的 IDE 上編輯它。

然後任何時間你都可以在你本地出現變更時查看流水線的有效性。

. 比較 Kubernetes 和 Tekton 插件

那些在 Kubernetes 上使用 Jenkins 的人們當前或許正在使用 Kubernetes 插件。

這裏有一個示例用來展示怎樣使用 Jenkinsfile 和 pod YAML 文件,這樣你可以在 pod 的不同的容器內運行命令。

這也就意味着:

  • 一個通過 Kubernetes 調度的 Kubernetes pod 是基於 pod YAML 文件創建的。

  • 在 Jenkins 控制器內運行的 Jenkinsfile  與 pod 遠程通信告訴 pod 在不同的容器內運行相應的命令。pod 包含 jnlp 容器用來保證 Jenkins 控制器與 pod 的遠程通信。

但這也會帶來一些問題:

  • pod 中的每個容器都必須包含 shell 這樣 jnlp 纔可以調用命令。這也就意味着必須自行創建鏡像。

  • 因爲需要使 Jenkins 控制器與 pod 建立通信,這樣啓動會變得有點慢 - 然而 Tekton pods 在本地啓動運行無需任何與 Jenkins 控制器之間的協作。

  • 你需要維護兩個文件: Jenkinsfilepod.yaml 這將會使得在你需要產生變更的時候,兩個文件在不同倉庫之間共享/覆蓋變得困難(比如根據步驟的需要覆蓋環境變量/鏡像/命令/資源限制)。

但是 Tekton 方法的弊端是默認情況下不會自動更新狀態;當一個 Tekton 上的 Task 結束並不會自動同步狀態至 Jenkins 控制器磁盤中。如果你需要的話,只能每次在 Task 中添加一個步驟來上傳工作區狀態至 Jenkins 控制器上。

但是請記住 Tekton 插件並不是無法替代的;你可以混合搭配 Kubernetes 和 Tekton 插件從而滿足你的需求。

. 總結

我們非常激動的可以將 Jenkins、Tekton 和 JenkinsX 組合在一起從而讓開發者選擇最適合工作的工具,從而變得更加雲原生,增加自動化可以幫助減少手動創建維護的工作量,同樣幫助他們提升質量以及我們的 CI/CD 實踐。

請各位嘗試看看並讓我們知道你使用的進展。

本文分享自微信公衆號 - Jenkins(Jenkins-Community)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章