淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


2019年已經到來,在過去的一年中,開發者中心經歷了一次又一次的技術變革,從底層部署架構的升級Mesos遷移至Kubernetes,完善資源池的接入及監控功能,更加準確的瞭解基礎設施運行狀況等等。在所有的技術變革和功能更新中,最耀眼的當屬DevOps流水線功能的落地。

那麼,到底什麼是DevOps流水線?具有哪些核心能力?對開發及運維工作又能帶來哪些幫助?

彆著急,下面將詳細為你講解用友雲技術中臺架構下DevOps流水線。相信讀過之後,您一定可以對它有更深入的瞭解。

一.從傳統應用交付方式面臨的挑戰說起

傳統的應用交付方式,即開發、測試、運維等工作分別由對應職責的人進行,這些人甚至被劃分至不同的部門中。這導致本處於同一工作流程中的人員被相互隔離開來,高高的“部門牆”便由此形成。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


傳統應用交付

常見問題:

  • 應用交付中的各環節沒有真正打通,交付週期過長
  • 應用問題不能及時發現,並不斷積累,影響交付質量
  • 無法自動化驗證並解決問題,研發效率低
  • 沒有統一視角的研發過程,各部門間溝通效率差,浪費大量資源

為解決這些問題,DevOps理念應運而生。

可以預見,在DevOps理念中,持續交付仍然是其中的核心環節。以DevOps理念為核心,打造一款符合互聯網應用架構特點,助力應用極速上雲的產品尤為重要,DevOps流水線便在這其中順勢而生。

二.順勢而生的DevOps流水線

1.概念

DevOps流水線,是開發者中心提供的一種持續交付能力,它以應用為中心,在技術層面將應用持續交付過程中的各個環節打通,形成自動化持續交付工作流,最終打造為一條結構完整的流水線。

2.從代碼提交到上雲交付,研發、運維一體化

這裡包含了幾個關鍵步驟:【代碼管理】、【應用構建】、【部署管理】、【配置管理】、【環境管理】等。它將這些關鍵步驟整合後,完美打破開發運維溝通屏障,完成從代碼提交到上雲交付,實現研發、運維一體化。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


研發運維一體化

研發與運維的功能流程形成了一個閉環。在此閉環下,應用的構建、編譯、部署等環節緊密連接在一起,從而將研發、測試、運維等人員緊密結合在一起,打通了部署相關的各個環節,降低了溝通成本,縮短了產品的部署週期。

開發者中心DevOps流水線為研發及運維人員帶來了如下好處:

  • 實現應用快速發佈,應對業務需求,並更快地實現產品價值
  • 縮短構建、部署、測試、上線的迭代週期,同時增強了反饋機制
  • 有利於產品研發、實施和發佈的標準的推進,規範了整個產品交付過程,有助於提升產品質量
  • 整個應用交付過程進度可視化,方便研發及運維人員跟進產品,瞭解部署進度
  • 推動了DevOps理念的落地,推進團隊以更先進的協作方式,加強了與產品相關的各角色間的密切協作,減少了資源浪費。

  3.DevOps流水線部署應用

使用開發者中心提供的DevOps流水線功能,僅需簡單的幾步配置過程,即可實現應用的快速上雲。同時,它還建立了標準的應用上雲流程,對流程中的每一個環節進行應用定製化配置,可達到按需發佈應用的目的。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


使用DevOps流水線部署應用流程

DevOps流水線通過提供完備的技術能力,來支撐流水線各環節的功能,以實現完成應用發佈。

  • 代碼管理:支持【Gitlab】、【GitHub】、【私有代碼庫】及【應用包】直接上傳等方式,管理應用代碼。
  • 構建管理:支持手動觸發構建、定時構建、源代碼更新自動觸發構建等構建策略,開啟構建流程。
  • Docker鏡像管理:提供基於各應用類型依賴環境的基礎鏡像,同時提供基於自定義鏡像構建,基於私有鏡像構建、基於Dockerfile構建等多種方式的應用構建方法。

對於開發者中心提供的基礎鏡像,其內部已經包含了Pinpoint、配置中心等插件的植入,並進行了強有力的安全保護,實現對應用的性能監控,保障應用順利運行等功能。

  • 自動化測試:提供靜態代碼檢查、安全代碼檢查、代碼重複率、代碼註釋率、接口測試、UI測試、冒煙測試、流程測試等能力。

  三.DevOps流水線優勢、使用場景及規範化管理

1.靈活的構建步驟選擇,多種應用類型的支持。

根據應用場景需求,選擇流水線內功能節點,如: 【拉取代碼】、【分析代碼質量】、【編譯代碼】、【生成鏡像】、【審批】、【執行部署】等,並在此支持多種類型應用的構建JavaWeb、Node、Php、Python、go、Nginx靜態網站等。

2.使用產品流水線規範化管理

在產品服務節點內,統一管理所屬流水線,進行統一節點管控、分支管控,更有效的緩解各環境部署過程、分支等不統一問題造成的生產環境不穩定。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


3.多環境自定義審批流推進部署

使用DevOps流水線多套環境支持,完成應用部署的推進,加入審批卡點,更有效的保證生產環境的穩定。

4.一鍵部署、定時構建

在已設置完的流水線配置頁,直接點擊執行流水線,既完成一鍵部署,並可以設置各自的構建策略,如:【定時構建】、【源代碼更新觸發構建】等有效策略執行。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


四.技術難點攻克及用戶體驗優化

DevOps流水線,如下圖:


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


1.流水線健康檢查策略

為保證DevOps流水線服務穩定運行,內部提供一個健康檢查API,使用開發者中心部署的應用,會提供一個能力就是定時檢測健康檢查API接口,校驗服務是否處於健康。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


協議:HTTP、TCP、COMMAND

a) HTTP:填入真實存在的RESTful Get請求,只要返回狀態碼200即可,例流水線的健康檢查app-upload/healthcheck

b) TCP:檢查容器內端口是否正常啟動。

c) COMMAND:只要填入可執行的命令即可,例:ls,如果想讓自己的應用處理掛起狀態,可以使用這中方式,這樣可以直接進入控制檯,調試自己的應用。

2.流水線各模塊調度引擎策略

創建線程工廠類:DockerBuildThreadFactor


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


每個容器線程池最大允許數量,可根據部署環境調節,通過環境變量threadNum設置,線程超過最大數即等待。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


在流水線中啟動調度器


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


3.代碼源獲取

支持GitLab | GitHub代碼源的獲取,獲取方式分為http和ssh.

1.基於http方式

克隆:git clone http://userName:[email protected]/app_upload.git;

分支切換:git checkout develop;

2.基於ssh秘鑰方式

在這裡一般通過修改~/.ssh/config文件的方式來實現免輸入密碼的git訪問,這種方式網上介紹的很詳細了,這裡就不再說明。今天我們要說的是另一種更加靈活的方式來實現git 的ssh-key驗證, 也就是開發者中心使用的方式。

大家應該都知道ssh命令有個-i參數來指定identity_file(私鑰id_rsa)。

ssh -i ~/.ssh/id_rsa [email protected]

那麼git有類似命令可以直接指定ssh-key來直接執行克隆等操作的嗎?很遺憾,還真就沒有。但是GIT給咱們留了一扇門,便是【GIT_SSH】。

GIT_SSH的介紹


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


大概意思是說,如果你設置了GIT_SSH,那麼在git pull等操作時,會使用GIT_SSH設置的腳本命令來替換默認的ssh連接,需要注意的是GIT_SSH必須設置為一個腳本。

這樣就可以寫這樣一個腳本,~/git.sh


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


~/git.sh?-i ~/.ssh/id_rsa clone?[email protected]:yonyoucloud_developercenter/app_upload.git;

注意用chmod +x git.sh 命令設置可執行權限。

4.亂碼問題解決

作為程序猿,感慨中國程序猿遇到的問題可能會比外國程序猿遇到的問題多很多。讓我十分憤慨就是編碼問題,通常外國人寫的東西無需對編碼進行轉碼,默認就是ISO-8859-1,而到了中國,中文漢字真是入了坑,因IDE、環境(windows、linux)等的不同編碼出來真是是千奇百怪,比如:GBK、UTF8、GB2312、IBM855等等。這裡流水線幫助大家應用快速上雲,應用內中文亂碼問題頻繁出現,在這裡簡單介紹一下解決過程。

a.最開始因自己就是一個Java開發,理所當然使用了Java方式來處理這個問題,使用引入apache-ant-zip.jar包

導入類:

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipOutputStream;

設置編碼:

System.setProperty(“sun.zip.encoding”,System.getProperty(“sun.jnu.encoding”));

就這樣在開始的一段時間內沒有出現什麼問題,但隨著用戶量的增加,一些千奇百怪編碼,使用這種方式遇到不能轉碼的就會報異常,這樣就導致了應用包內文件的缺失。

b.經過大量的驗證,優化後解決方案使用python腳本來實現,代碼如下:


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


在對應用包解壓過程中,進行有效的編碼識別並轉碼,如果遇到特殊編碼既不進行轉碼操作,保證文件不缺失。

5.基於maven主子工程編譯構建問題

用戶使用量的增加,反應比較多的問題便是構建時間過長,一次上線需要耗時很長,在此列舉javaWeb應用為例進行闡述及優化構建時間過長問題。

在流水線內大家可以看到這個框,填入各自應用的編譯命令,這裡簡單介紹


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


使用-Dmaven.test.skip -pl -am -amd等參數,來提升編譯的效率,減少不必要的構建時間。

參數介紹


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


假設現有項目結構如下:

app-parent

|-app-common

|-app-web

三個文件夾處在同級目錄中

app-web依賴app-common

app-parent管理app-common和app-web

c.在app-parent目錄運行`mvn clean install -pl ……/app-web -am`,結果

·app-common成功安裝到本地庫

·app-parent成功安裝到本地庫

·app-web成功安裝到本地庫

d.在app-parent目錄運行`mvn clean install -pl ……/app-common -am`,結果

·app-common成功安裝到本地庫

·app-parent成功安裝到本地庫

e.在app-parent目錄運行`mvn clean install -pl ……/app-common -amd`,結果

·app-common成功安裝到本地庫

·app-web成功安裝到本地庫

由於app-parent並不依賴app-common模塊,故沒有被安裝

d.在app-parent目錄運行`mvn clean install -pl ……/app-common,……/app-parent -amd`,結果

·app-common成功安裝到本地庫

·app-parent成功安裝到本地庫

·app-web成功安裝到本地庫

a.在app-parent目錄運行`mvn clean install -N`,結果

·app-parent成功安裝到本地庫

-N表示不遞歸,那麼app-parent管理的子模塊不會被同時安裝

b.在app-parent目錄運行`mvn clean install -pl ……/app-parent -N`,結果

·app-parent成功安裝到本地庫

g. 在app-parent目錄運行`mvn?clean install -rf ……/app-common`,結果

·app-common成功安裝到本地庫

·app-web成功安裝到本地庫

6.流水線基於自定義Dockerfile構建


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


DevOps流水線支持Dockerfile方式構建,這種方式能讓大家更靈活的基於流水線完成各自的應用快速上雲,舉例並簡單闡述一下實現原理。

在生成鏡像模塊內勾選使用【Dockerfile方式】構建,如項目根目錄已有自己的Dockerfile那麼便會使用項目內的進行構建。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


如果項目內沒有準備好的Dockerfile可以通過頁面填入有效的內容。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


用戶自定義Dockerfile示例

如果項目內沒有準備好的Dockerfile,可以通過頁面填入有效的內容。


淺談用友雲技術中臺架構下核心模塊-DevOps流水線原理及技術實現


通過構建過程,可以很清楚的看到確實是按照填入的規則來執行的。

其實做法也是很簡單,就是在使用Dockerfile進行構建時,把生成出來的Dockerfile放入項目根目錄,這樣就是可以在編譯時,相對路徑就是各自項目的根目錄,在RUN 裡面可以直接使用。/ 當前路徑,也就是編輯後的文件會生成一個Dockerfile放入項目的根目錄。

五.總結和未來展望

本文主要介紹了用友雲技術中臺架構下核心模塊- DevOps流水線的起源及功能,描述了其提供的核心能力、並介紹了其提供的技術細節及使用技巧。相信經過本文的介紹,您可對開發者中心DevOps流水線有更深入的理解。


分享到:


相關文章: