基於Jenkins的構建部署任務擴展設計

轉載本文需註明出處:微信公衆號EAWorld,違者必究。前端


前言:mysql


不一樣企業,不一樣系統,不一樣應用在開發中所使用的技術棧都不盡相同,所以構建所用的編譯工具以及應用部署所使用的應用服務器也有所不一樣。如何擴展支持各類工具與應用服務器部署也成爲了DevOps支撐企業持續集成與持續部署落地的關鍵組成部分。nginx

本文從普元DevOps平臺基於Jenkins pipeline構建及部署任務的擴展設計提供一種DevOps構建及部署任務設計的思路及方法。git


目錄:web


1.爲何在設計時要考慮如何擴展?sql

2.咱們作了哪些擴展方面的設計。數據庫

3.擴展設計後續。後端


1.爲何在設計時要考慮如何擴展?api

在瞭解普元DevOps任務擴展設計以前,再重複說明一下普元DevOps平臺持續集成及持續部署基於Jenkins pipeline的任務編排模式。
持續部署任務與持續集成任務基本同樣,將相似應用服務器的部署(如websphere應用部署)封裝成一個獨立的任務,只是部署在pipeline stage的groovy腳本中添加了ansible-playbook的調用。在構建任務以及發佈流水線中,用戶能夠根據本身的需求進行任務的編排。平臺會將編排的好的任務提交給Jenkins引擎執行。

普元DevOps平臺將提供的原子任務分爲五類:代碼,工具,構建,部署,測試。tomcat

代碼:拉取代碼,代碼庫打標籤,代碼庫分支維護,代碼庫標籤,代碼庫分支合併等。

工具:腳本執行,數據庫檢查,數據庫腳本執行,介質倉庫同步,文件生成等。

構建:Maven構建,Npm構建,Gradle構建,Ant構建,Docker鏡像構建等。

部署:數據組件發佈,Tomcat雲主機部署,Springboot雲主機部署,Weblogic應用部署,Websphere應用部署,EOS應用部署等。

測試:Checkmarx,SonarQube,JMeter,Robotframework,Findbugs等。

平臺提供的五類原子任務合計已經超過70個,後續仍然會不斷增長。

由此可知,若在設計之初不考慮原子任務的擴展建立,後續添加原子任務將是一件繁複的工做。

2.咱們作了哪些擴展方面的設計

設計思路:

原子任務擴展的關鍵點無非三點:原子任務,任務的屬性參數,任務的腳本實現。

咱們使用sql添加原子任務以及原子任務的屬性參數,後端提供原子任務以及任務屬性查詢接口,而後前端使用動態表單展現原子任務信息以及任務屬性。用戶編排任務後執行。平臺會根據用戶編排的任務流程組裝配置整個jenkins任務的xml配置文件,而後提交給jenkins引擎生成對應的任務。

相關表設計:

任務模板表

表結構關鍵字段:

關鍵字段說明:

STAGE_HANDLER: 定義任務攔截器,能夠對任務屬性進行處理。

COMMON_STAGE_TPS: 任務公共屬性模板,平臺將一些任務屬性定義爲公共的模板供任務直接引用。

如在部署相關任務中都涉及介質信息相關屬性,所以將介質信息定義爲一個公共屬性模板,在部署任務中經過該字段引用,這樣就不須要在任務屬性表中重複定義介質相關屬性,後續對介質信息的相關字段擴展也會直接映射到全部關聯了該模板的部署任務。

務模板屬性表

表結構關鍵字段:

關鍵字段說明:

CONTROL_TYPE: 屬性的表單類型,有如下幾種類型textbox,dict,combobox,checkbox editor,類型不一樣對應的前端展現的表單控件不一樣。

VALUE_PROVIDER: 當表單類型爲特定類型時,此字段定義數據來源。好比當表單類型爲combobox時,此參數能夠配置爲api接口相關訪問信息,將接口返回值做爲下拉選項和值。

Maven構建任務屬性示例:

MAVEN版本:CONTROL_TYPE設置爲dict,VALUE_PROVIDER值設置爲{"type":"dictcombobox","dictTypeId":"DPS_CD_MAVEN_VERSION"},若是須要擴展額外的MAVEN版本支持,只須要在平臺管理新增業務字典DPS_CD_MAVEN_VERSION的值便可。

JDK版本:同MAVEN版本同樣,也是採用了業務字典項,方便擴展多版本支持。

settings文件:CONTROL_TYPE設置爲editor,VALUE_PROVIDER值設置爲{"type":"xml"},這樣在編輯器中會根據xml類型作高亮顯示。

執行Junit測試:CONTROL_TYPE設置爲checkbox。

其餘須要用戶輸入的字符串參數大多使用textbox類型。

此任務中沒有使用到的CONTROL_TYPE爲combobox的類型在以前提到的公共屬性模板介質信息中的介質倉庫屬性有使用,使用該類型時將VALUE_PROVIDER定義爲api訪問的相關信息以下:

組件實例運維表

表結構關鍵字段:

關鍵字段說明:

COMPONENT_TYPE:組件類型,使用業務字典項DPS_PDM_COMPONENT_TYPE定義,一般將工程中最小可部署的單位定義成一個組件,如普元DevOps應用採用先後端分離的方式部署,這裏定義3個組件,前端nginx-web組件,後端tomcat組件以及數據庫mysql組件,在編排發佈流水線時能夠根據具體的部署任務關聯對應的組件(如tomcat雲主機部署任務關聯DevOps後端的tomcat組件)。

OPERATE_NAME:運維操做,定義組件實例的運維操做。部分部署任務(如Tomcat雲主機部署等)執行成功後會根據組件及主機資源等配置信息生成組件實例,組件實例的運維操做經過該字段定義。

相對於任務及任務屬性的動態表單設計,腳本的設計就相對簡單了。只須要將實現具體功能的腳本文件根據既定的規則命名及存放到指定的目錄便可。

3.擴展設計後續

在線任務擴展

當前這種任務擴展方式僅僅只是給開發人員提供了便利,可是用戶仍然很難擴展本身的任務,所以後續會考慮將任務擴展的能力作成平臺功能的一部分提供給用戶使用。

任務定義建立一個任務,如maven構建任務,對應的任務類型爲構建(build)。

屬性定義:設計任務參數,如maven構建任務,構建依賴的jdk版本,構建所使用的pom文件路徑等。同時配置參數對應的前端控件(如checkbox,select,password等),若使用select框則須要定義展現數據的來源,能夠是api和業務字典等。

腳本編寫:提供在線IDE的能力,用戶能夠實時維護並編輯本身的腳本,保存後便可完成加載。以供後續測試使用。

任務測試:能夠配置任務的屬性參數,選擇對應的測試腳本。在執行測試前能夠根據預知的正確結果定義校驗步驟,如構建任務是否是生成了對應的文件,部署任務是否是啓動了對應的端口,HTTP是否能夠正常訪問等。

任務發佈:能夠對測試經過的任務進行發佈,也能夠對已經發布的任務進行下線維護。

環境隔離

在普元DevOps平臺中jenkins做爲構建部署引擎提供服務,對用戶來講是無感知的,用戶不須要知道應用在何處編譯,也不須要知道編譯工具的路徑,用戶只須要配置任務執行便可。jenkins引擎會根據用戶的配置生成對應的任務。

咱們在使用DevOps平臺過程當中也碰到了一些問題。

1.應用構建依賴特定的環境編譯。如IOS應用等。所以咱們添加了構建及部署任務能夠選擇指定的jenkins引擎以及綁定到指定節點執行的能力。

2.擴展工具支持,擴展多版本支持不方便。由於任務是隨機調度的,全部的jenkins節點都得包含編譯所需的工具,所以全部的jennkins節點都得安裝對應的工具及版本。

3.安全問題。由於jenkins引擎是各個項目公用,且包含腳本執行的能力,存在誤操做或被惡意破壞的可能(Use Groovy Sandbox配置開啓後功能基本沒法正常使用)。

針對問題2和3,咱們思考了兩種解決方案,都是基於容器進行環境隔離。

方案1:每個任務對應一個slave節點,slave節點進程運行在容器內部,根據任務自動建立,任務完成自動銷燬。

優勢:slave節點動態建立,動態銷燬,節省資源。

缺點:slave節點使用的容器鏡像,仍然須要包含任務所需的全部工具。會存在鏡像過大的問題。

方案2:jenkins的管理節點和slave節點仍然運行在主機環境,只將任務具體stage中最終造成的執行命令使用容器運行,任務中執行命令的容器掛載同一個workspace空間。如stage git最終造成了一條命令git pull http://test.project.git。使用包含git工具的容器鏡像運行這條命令將代碼拉取到掛載的workspace中,stage maven生成的命令maven clean install則使用包含maven構建環境的容器鏡像執行便可。

優勢:擴展工具只須要擴展新的鏡像便可,很是方便。

缺點:須要維護鏡像與原子任務的關係。

寫在最後

企業DevOps平臺建設與落地不是一蹴而就的,DevOps平臺自己亦是如此。只有在不斷使用的過程當中不斷的優化演進,這樣才能讓DevOps平臺愈發強大,以更好的支撐企業的IT建設。

精選提問:

問1:若是部署是經過ansible執行的,那ansible是否是跟jenkins slave在一塊兒?如何解決ansible免密認證的問題?

答:通常不會作免密登陸,咱們是經過資源管理的功能管理主機以及容器等基礎設施的信息。在部署任務配置中能夠選擇要部署的主機。在任務執行過程當中咱們會生成臨時的inventory文件,執行完成後銷燬。

問2:若是流水線中有人工卡點,負責審覈的人遲遲不點擊,普元的DevOps平臺如何解決對應的Jenkins Job一直pending的問題?

答:咱們在發佈流水線配置的每一個環境的節點均可以配置人工審批,這種每一個環境的部署是獨立任務。審批經過才能啓動新的任務。還有一種是添加人工審批的原子任務,這種就是在某個job的stage等待審批。咱們是採用超時時間配置,若不處理,超過超時時間會自動終止,而後下次執行能夠選擇跳過已經執行過的步驟。

問3:有沒有方法指定N臺Jenkins打包安卓,N臺打包Java,N臺打包iOS…… 用戶的安卓請求來了,設法路由到安卓的這幾臺,這幾臺中隨機選一臺?

答: 這個能夠的,咱們執行任務除了能夠選擇引擎,也能夠配置工做節點的label。只須要給jenkins slave節點配置label便可,這是jenkins自己就支持的能力。


推薦閱讀


DevOps平臺之測試管理設計

DevOps平臺之一鍵發佈設計

DevOps平臺之開源技術圖譜

關於做者谷縝,現任普元高級研發工程師。曾參與神華災備雲平臺項目,九江銀行持續集成項目等,主要負責項目實施工做。開源技術愛好者,擅長雲計算,容器,DevOps等相關領域技術。


關於EAWorld:微服務,DevOps,數據治理,移動架構原創技術分享。長按二維碼關注!


課程預告!  7月3日(週五)下午14:30普元產品經理隔壁老王爲你們分享《探索圖數據庫在數據資產可視化中的應用》,敬請期待!


分享在看,點點點

本文分享自微信公衆號 - EAWorld(eaworld)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索