Serverless Jenkins 和 Jenkins X

ServiceMesher2018-12-07 00:29:45

作者:James Rawlings 譯者:王凱 原文:https://medium.com/@jdrawlings/serverless-jenkins-with-jenkins-x-9134cbfe6870

Jenkins服務來源於創建自2004年的Hudson。在軟件行業中,Jenkins已經是家喻戶曉的明星產品,並且已經是CI和CD的領頭羊。到目前為止有超過2050萬的Jenkins任務,以及將近20萬的Jenkins服務在運行中。這真的是非常驚人的增長速度。

上面的增長圖說明在技術領域已經有很大的進步,列如雲計算和容器,這些變化說明Jenkins在很多方面已經起到了很好的作用,我們應該很好的利用這些影響力。如今,很多公司都開始容器化改造,我們希望jenkins能跟上時代的步伐,開始自己的雲原生之路。Jenkins應當繼續成長,提供更多大家需要的自動化,可靠性,以及更好的開發體驗。

Jenkins在取得巨大成功的同時,也產生了一些問題。

下面讓我們來簡要描述一些我們瞭解到的比較重要的問題。

  1. Jenkins服務的單點問題。特別是在服務維護期間,git webhook的操作都會被丟失.

  2. Jenkins服務經常將磁盤跑滿,需要腳本或者人工清理之後,才能繼續運行.

  3. 在服務升級之後,plugin的版本會匹配不上.

  4. 多分支掃描,經常導致GitHub的速率被限制.

  5. 在沒有任何任務執行時,也需要佔用巨大的內存,從基於情況來看,這是一種巨大的浪費.

未來的改進:

  1. 降低雲計算開銷,只在有任務需要被時才執行jenkins服務.

  2. 儘量使用上一次的臨時構建通道,避免磁盤被耗盡.

  3. 通過持續集成進行插件的安裝和插件的升級更新.

  4. 提供高可用性和可伸縮性的webhook操作,來解決spof問題.

  5. 避免由於GitHub的API掃描導致的速度風險.

  6. 提供災難恢復策略,用來恢復存儲在git上的所有配置信息.

Jenkins x項目在今年早些時候對外宣佈為基於kubernetes的pull請求和gitops自動升級提供了CI和CD(Testing-->Staging-->Production)。Jenkins X同樣繼承了kubernetes的CRD特性(custom resource definitions),併為你的Jenkins服務和作業提供了編排功能。

Jenkins x和Jenkins激動的宣佈無服務的Jenkins。Jenkins x既能編排無服務的jenkins,一個靜態的jenkins master,也能為每一個team提供Knative構建;因此現在開源的Jenkins雲擁有完整的Knative構建支持。

無服務Jenkins使用成功的並且創新開源項目來解決和上述靜態Jenkins master的問題。Kubernetes現在是事實的雲實現,因此現在讓我們專注在那些不太有名的,卻能使得無服務的Jenkins成為可能的項目:Prow and Knative build。

在這篇博客的底部,有一個鏈接到未經編輯的Youtube,它演示了這系列的操作。

Prow是什麼?

Prow來源於google的電子商務系統。被一幫糾結於是否需要使用Jenkins來構建那些基於kubernetes的GitHub repos的優秀群體所創建。Kubernetes是GitHub上最成功的項目之一。Prow被用於Istio和Jetstack的同時,還被140個項目使用。有許多不同的職責的微服務組成的基於事件的解決方案——為雲原生提供了理想的鬆散耦合架構。對於merge到master上請求,有了更加有力的方式(不管是在構建請求之前,還是之後),使用ChatOps和構建系統進行交互。

Prow提供了可伸縮的,高可用的webhook事件處理器,可以將ProwJobs的CRDs請求寫入到kubernetes,以至於像正在運行中的持續集成或者發佈服務等其它微服務收到響應,並執行操作(kubernetes controller對於ProwJob 事件進行了監聽)。Git 事件可以是新的 PR、issue、評論、merge、push等操作都會觸發git event,因此我們能對更多的事件請求響應。

對於一些已經提供了一組配置規則的目錄,我們提供了自動merge pull request功能。對於Prow組件和描述參考如下鏈接https://github.com/kubernetes/test-infra/tree/master/prow。

Prow同樣也將它的配置信息存儲在git上,這樣在出現問題時可以進行恢復。Jenkins X項目在向用戶發佈前已經進行了廣泛的測試和驗證。你能在如下地址上看到Jenkins X項目對於CI/CD提供了很多基於yaml的Prow配置https://github.com/jenkins-x/prow-config。

Knative Build

Knative Build是一個繼承自Kubernetes項目的雲原生解決方案。讓用戶可以直接從源碼進行構建。Knative Build最大的特色就是可以將一些簡單的操作在同一個pod中的串聯起來的執行,還可以在容器間進行狀態的共享。這個特性通過Kubernetes init containers進行初始化。

Build Templates是可以通過Kubernetes pod來直接運行你構建的項目。這個允許你在構建項目時,事先指定要需要運行的docker image,構建時需要用到的環境變量、service accounts、secret以及需要mount的存儲卷。build template是kubernetes CRD的集合。可以使用Jenkins x進行自動升級。通過build template創建或者引入一個應用時,可以使用jenkins x產生Prow配置。在Jenkins x項目中有一個列子是在BuildTemplate中配置prow config pointing。

什麼是無服務Jenkins

現在您已經瞭解了我們正在做的事情的背景,我們可以看看無服務Jenkins。雲原生Jenkins正在努力幫助開發人員、團隊和組織遷移到雲,並確保Jenkins不僅與雲相關,還允許我們利用雲和Jenkins最擅長的東西。

詳情:

使用基於Kubernetes的Jenkins X將會幫你自動安裝和配置Prow和Knative,下面我們開始準備進行安裝。當創建項目或者引入項目時,jx cli生成了所有需要的配置,並且更新git repo webhook endpoint。

現在,每個pull請求或合併到master的請求都會觸發使用Knative在Kubernetes中產生一個臨時的Jenkins操作,checkout git revision,配置所需的憑證,並使用Jenkinsfile運行應用程序構建管道。一旦構建完成,它將丟棄Jenkinsfile運行程序pod。

多虧了War Packager(CWP), Jenkins X發佈過程構建了不同風格的Jenkins服務器,其中包含必要的構建工具。語言檢測確保使用正確的風格。我們還使用Configuration as Code plugin(CasC)在構建時添加必要的Jenkins配置。CWP很棒的特性之一是它提取Jenkins插件再構建serverless Jenkins(而不是當serverless Jenkins),所以在基於Jenkins image的容器和JVM中啟動Jenkins X耗時5秒——相比之下,要花幾分鐘啟動基於Kubernetes的Jenkins server。

每當我們發佈Jenkins X時,我們有一個monorepo,它用於自動構建和發佈這些程序指定的Jenkins image。

這也意味著,因為插件是在yaml中定義的,並存儲在git中,所以我們可以為CI和CD工具提供CI和CD。當我們想要升級一個插件時,我們發出一個pull請求,它會觸發CI並構建一個預覽Jenkins image,確保沒有插件衝突,我們甚至可以運行模擬作業作為自動化測試(儘管我們還沒有完成這一部分)。每個人都可以採用完全相同的方法,構建定製的Serverless Jenkins images,以相同的方式在管道中使用。

突出的一件事是,當你切換到Serverless Jenkins,進行構建是沒有狀態存儲(這意味著為每個Job構建的編號總是1)。在Jenkins X中,我們為了PipelineActivity創建的CRD,所以這就允許我們在單個Jenkins構建完成之後想象先前的構建管道可以生成下一個構建編號和存儲信息。

當Prow收到webhook事件時,它將在Kubernetes中創建一個Knative構建資源。接下來,監視構建的Knative構建控制器將創建一個Kubernetes pod,並自動添加一個克隆PR或發佈分支源代碼的init容器。接下來,利用Jenkinsfile runner,在一個單獨的步驟中啟動Jenkins可以訪問Knative克隆的源代碼並處理應用程序Jenkinsfile。

如何開始嘗試?

今天,含有Prow的Jenkins X在使用terraform via在GKE上創建集群時開箱即用

  1. jx create terraform

或者在其他創建集群或安裝命令上使用功能標誌時,即:

  1. jx create cluster gke --prow

  2. jx install prow

FAQ

如果沒有運行中的Jenkins服務,如何訪問UI?

有一個非常重要的問題是Serveless Jenkins沒有開源的Jenkins UI。下面我們來解釋一下,Jenkins X具有可以使Jenkins X開發人員感到友好的IDE和CLI工具,但UI已經消失了。Prow有一個名為Deck的開源UI,Jenkins X安裝了OOTB。CloudBees可能很快也將提供免費增值UI,但有關詳細信息,請自行查找。

從哪裡可以看到構建的日誌

目前Jenkinsfile runner將構建日誌發送到標準輸出,但是一個允許我們利用Kubernetes集群集中日誌記錄的更好的解決方案將被開發,如Stackdriver,CloudWatch。 我們還提供 jx logs-k(在構建運行時可用)和 jxgetbuild log(可用幾個小時)

我是否需要更改依賴於特定Jenkins multibranch插件環境變量(如 $ JOB_NAME)的Jenkinsfile?

不,我們已經嘗試確保所有與MBP相關的環境變量仍然以相同的格式添加。 如果還有什麼沒有被添加的。請讓我們知道。

如何將Jenkinsfiles遷移到Serveless Jenkins?

Jenkins X項目本身已經從使用靜態(永遠在線)Jenkins服務器遷移到Serveless Jenkins。是的,我們將Jenkins服務器縮小到0並將我們所有的Git存儲轉移到Prow和Serverless Jenkins。您可以在https://github.com/jenkins-x/組織上查看任何拉取請求,以查看它的實際運行情況。 我們使用的是declarative style Jenkinsfile(這是我們在將新項目導入Jenkins X時添加的),這意味著遷移到Serverless Jenkins只需要對Jenkins文件進行一些調整:

  1. 將代理類型更改為“any”,以便在一個臨時的單獨的Jenkins上執行管道

  2. 現在刪除所有Jenkinsfile容器塊,假設所有步驟都在一個單獨的Jenkins管道引擎中執行。

  3. 對於任何發佈分支管道都應該有一個標記(它們都應該創建一個git標籤!),然後我們必須進行從checkout scm 到 git'github / foo.git'的切換,因為重新使用來自Knative和Jenkinsfile runner的克隆repo有問題,好像是因為將repo添加到Jenkins工作區時使用的是符號鏈接。 我們希望解決這個問題。

這裡可以看到上述變化的一個例子。要啟用prow的ChatOps /approve註釋,您還需要一個類似的OWNERS文件到該鏈接,該文件使用批准者GitHub ID。

當前的限制

  • 目前只有GitHub,我們將為多個git提供者提供支持

  • Jenkins X使用了另一個分支,但是在接下來的幾周內它將被切換回使用上游的prow repo

  • 默認情況下,Jenkins X會創建一個聲明性管道Jenkinsfiles,這尚未在腳本和共享庫Jenkinsfile管道上進行測試,但如果按預期工作,我們很想收到反饋。

  • Kubernetes Plugin PodTemplates尚不支持。 我們不確定這是否是一個好主意。 這意味著如果要遷移具有多個不同容器{...}塊的現有Jenkinsfiles,則需要將每個容器的構建工具添加到上面由CWP創建的單個一次性Jenkins中。

還有工作要做,所以如果你想參與其中,請在Jenkins X Kubernetes slack rooms打個招呼來幫助解決問題,或先試試,讓我們知道你是怎麼做到的。

現在和我們一起參加 Jenkins World Nice並不會太晚,我們將在現場演示中展示這個以及其他精彩的演講!

總結

Jenkins X是可供團隊使用的一站式服務,可用來進行Prow ChatOps編排靜態、無服務器或Knative構建作業,其中包括用於Kubernetes工作負載的自動化CI/CD以及更多自動化。

Istio

IBM Istio

  • 111 Istio

  • 118 Istio上手

  • 1115 Istio

  • 11月22日 Envoy

  • 1129 使Istio

  • 126 Istio mixer -

  • 1213 Istio

  • 1220 Istio使Serverless knative

  • IBMIstio

點擊【閱讀原文】跳轉到ServiceMesher網站上瀏覽可以查看文中的鏈接。

  • SOFAMesh(https://github.com/alipay/sofa-mesh)基於Istio的大規模服務網格解決方案

  • SOFAMosn(https://github.com/alipay/sofa-mosn)使用Go語言開發的高性能Sidecar代理

合作社區

參與社區

以下是參與ServiceMesher社區的方式,最簡單的方式是聯繫我!

  • 加入微信交流群:關注本微信公眾號後訪問主頁右下角有獲取聯繫方式按鈕,添加好友時請註明姓名-公司

  • 社區網址:http://www.servicemesher.com

  • Slack:https://servicemesher.slack.com (需要邀請才能加入)

  • GitHub:https://github.com/servicemesher

  • Istio中文文檔進度追蹤:https://github.com/servicemesher/istio-official-translation

  • Twitter: https://twitter.com/servicemesher

  • 提供文章線索與投稿:https://github.com/servicemesher/trans


閱讀原文

TAGS: