原文連接:https://medium.com/@jdrawlings/serverless-jenkins-with-jenkins-x-9134cbfe6870javascript
Jenkins服務來源於建立自2004年的Hudson.在軟件行業中,Jenkins已是家喻戶曉的明星產品,而且已是CI和CD的領頭羊。到目前爲止有超過2050萬的jenkins任務,以及將近20萬的jenkins服務在運行中。這真的是很是驚人的增加速度。java
上面的增加圖說明在技術領域已經有很大的進步,列如雲計算和容器,這些變化說明jenkins在不少方面已經起到了很好的做用,咱們應該很好的利用這些影響力。現在,不少公司都開始進行容器化改造,咱們但願jenkins能跟上時代的步伐,開始本身的雲原生之路。jenkins應當繼續成長,提供更多你們須要的自動化,可靠性,以及更好的開發體驗。 jenkins在取得巨大成功的同時,也產生了一些問題。git
下面讓咱們來簡要描述一些咱們瞭解到的比較重要的問題。github
將來的改進:web
Jenkins x項目在今年早些時候對外宣佈爲基於kubernetes的pull請求和gitops自動升級提供了CI和CD(Testing-->Staging-->Production).Jenkins X一樣繼承了kubernetes的CRDS特性(custom resource definitions),併爲你的Jenkins服務和做業提供了編排功能。 Jenkins x和Jenkins激動的宣佈無服務的Jenkins.Jenkins x既能編排無服務的jenkins,一個靜態的jenkins master,也能爲每個team提供Knative構建;所以如今開源的Jenkins雲擁有完整的Knative構建支持。docker
無服務Jenkins使用成功的而且創新開源項目來解決和上述靜態Jenkins master的問題。kubernetes如今是事實的雲實現,所以如今讓咱們專一在那些不太有名的,卻能使得無服務的Jenkins成爲可能的項目:Prow and Knative build。 在這片博客的底部,有一個連接到未經編輯的youtube記錄,它演示了這系列的操做。api
Prow是什麼?服務器
Prow來源於google的電子商務系統。被一幫糾結因而否須要使用Jenkins來構建那些基於kubernetes的github repos的優秀羣體所建立。Kubernetes是github上最成功的項目之一。Prow被用於Istio和Jetstack的同時,還被140個項目使用。有許多不一樣的職責的微服務組成的基於事件的解決方案--爲一個雲本地體系結構提供了理想的鬆散耦合體系結構。對於merge到master上請求,有了更加有力的方式(不論是在構建請求以前,仍是以後),可使用ChatOps和構建系統進行交互 Prow提供了可伸縮的,高可用的webhook事件處理器,能夠將ProwJobs的CRDs請求寫入到kubernetes,以致於像正在運行中的持續集成或者發佈服務等其它微服務收到響應,並執行操做(kubernetes controllers對於ProwJob 事件進行了監聽)。 These git events can be new PRs and issues, comments, merges, pushes等事件操做都會觸發git events,所以咱們能對更多的事件請求響應。 對於一些已經提供了一組配置規則的目錄,咱們提供了自動merge pull request功能。 對於Prow組件和描述參考以下連接https://github.com/kubernetes/test-infra/tree/master/prow。app
Prow一樣也將它的配置信息存儲在git上,這樣在出現問題時能夠進行恢復。Jenkins X項目在向用戶發佈前已經進行了普遍的測試和驗證。你能在以下地址上看到Jenkins X項目對於CI/CD提供了不少基於yaml的Prow配置https://github.com/jenkins-x/prow-config.less
Knative Build
Knative Build是一個繼承自kubernetes項目的雲原生解決方案。讓用戶能夠直接從源碼進行構建。Knative Build最大的特點就是能夠將一些簡單的操做在同一個pod中的串聯起來的執行,還能夠在容器間進行狀態的共享。這個特性經過Kubernetes init containers進行初始化。 Build Templates是能夠經過kubernetes pod來直接運行你構建的項目。這個容許你在構建項目時,事先指定要須要運行的docker image,構建時須要用到的環境變量,service accounts, secrets,以及須要mount的存儲卷。build template是kubernetes crd的集合。可使用jenkins x進行自動升級。經過build template建立或者引入一個應用時,可使用jenkins x產生Prow配置。在Jenkins x項目中有一個列子是在BuildTemplate中配置prow config pointing。
什麼是無服務Jenkins
如今咱們已經瞭解了咱們正在作的事情的背景,咱們能夠看看無服務Jenkins.雲原生Jenkins正在努力幫助開發人員、團隊和組織遷移到雲,並確保Jenkins不只與雲相關,還容許咱們利用雲和Jenkins最擅長的東西。
The details:
使用基於Kubernetes的Jenkins X將會幫你自動安裝和配置Prow和Knative,下面咱們開始準備進行安裝。當建立項目或者引入項目時,jx cli生成了全部須要的配置,而且更新git repo webhook endpoints。
如今,每一個pull請求或合併到master的請求都會觸發使用Knative在Kubernetes中產生一個臨時的Jenkins操做,checkout git revision,配置所需的憑證,並使用Jenkinsfile運行應用程序構建管道。一旦構建完成,它將丟棄Jenkinsfile運行程序pod。
多虧了War Packager (CWP), Jenkins X發佈過程構建了不一樣風格的Jenkins服務器,其中包含必要的構建工具。語言檢測確保使用正確的風格。咱們還使用Configuration as Code plugin(CasC)在構建時添加必要的Jenkins配置。CWP很棒的特性之一是它提取詹金斯插件在構建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。
How to try this out?
今天,含有Prow的Jenkins X在使用terraform via在GKE上建立集羣時開箱即用
jx create terraform
或者在其餘建立集羣或安裝命令上使用功能標誌時, 即:
jx create cluster gke --prow
jx install — prow
FAQs
若是沒有運行中的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
(在構建運行時可用)和jx get build 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文件進行一些調整:
這裏能夠看到上述變化的一個例子。 要啓用prow的ChatOps/approve
註釋,您還須要一個相似的OWNERS文件到該連接,該文件使用批准者GitHub ID。
Current restrictions:
還有工做要作,因此若是你想參與其中,請在Jenkins X Kubernetes slack rooms打個招呼來幫助解決問題,或先試試,讓咱們知道你是怎麼作到的。
如今和咱們一塊兒參加 Jenkins World Nice並不會太晚,咱們將在現場演示中展現這個以及其餘精彩的演講!
結論
Jenkins X是使用Prow ChatOps編排靜態,無服務器或Knative構建做業的團隊的一站式服務,其中包括用於Kubernetes工做負載的自動化CI / CD以及更多自動化。