【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

作者:曹睿


一、概述


在互聯網高速發展的背景下,產品的先發優勢被互聯網加倍放大,業務需求變化頻繁,創新步伐越來越快,導致研發效能被越來越多企業放到極其重要的位置,為了適應日益激烈的業務競爭,必須快速響應需求,縮短軟件產品的研發週期。

近些年,軟件工程領域提出了敏捷開發等思想和方法,嘗試將傳統瀑布式的長週期開發方式向短週期、靈活的方式進化,滿足產品交付速度加快的需要。這些理論中重要的實踐CI/CD成為解決軟件產品快速交付問題的有效方法之一。

另一方面,伴隨著雲計算技術的發展,我行正通過引入當前流行的PaaS先進理念,尋求解決當前研發運維中各環節存在的一些突出問題的新方法和新思路。PaaS以應用系統為中心,實現了對應用系統開發、測試、運維一體化全流程的支持。基於PaaS可以快速提供容器化的CI/CD服務,用以支撐應用快速迭代部署上線,幫助快速交付應用。

本文基於PaaS總結並提出了基於TFS+Jenkins的CI/CD解決方案,使開發過程能夠快速集成,並最終實現持續交付的能力。


二、CI/CD方案


CI/CD是一種類似工廠生產流水線式的軟件工程實踐。通常情況下,至少應包含代碼管理、自動構建、自動部署、構建驗證測試等環節。

2.1 代碼管理

代碼管理環節要求實施持續集成時保證源碼保存位置的統一。項目的所有源文件都應存放在代碼管理工具中,通過源代碼管理工具可以方便地追溯代碼歷史版本,使開發者能輕鬆獲取代碼,通過設定項目人員角色更好地控制代碼安全性。

業界有集中式源代碼管理工具和分佈式源代碼管理工具。常用的集中式源代碼管理工具有FireFly、SVN等,分佈式源代碼管理工具有Git等。

2.2 自動構建

自動化構建環節指代碼能夠隨時檢出,通過自動化構建工具轉化為部署包的過程。應用開發過程中需選擇一個優秀的構建工具,當源代碼發生更改或每天定時觸發自動構建,另外還可以通過手動的方式進行自動構建。這些工作通常情況下釆用成熟的構建工具完成,如在Java開發環境中的Maven、Ant工具等。

2.3 構建驗證測試

構建驗證測試分為兩大類:單元測試和功能測試。單元測試由幵發人員編寫,通常測試對象為一組類。功能測試由測試人員依賴產品需求說明編寫,通過測試用例腳本完成對系統的測試。上述兩種測試均應儘量提高測試自動化的水平。

常用的自動化單元測試工具有JUnit,功能測試工具有ATP等。利用JUnit可以快速進行單元測試、運行單元測試套件。ATP是我行自主研發的,用於支持自動化測試的軟件平臺。


三、PaaS平臺CI/CD實踐


我行使用TFS作為主要工具,串聯了代碼合規檢查、安全檢查、Jenkins、自動化測試工具等來實現CI/CD。本文PaaS平臺基於紅帽OpenShift搭建,Jenkins容器化部署於PaaS。在TFS中進行Jenkins連接信息、代碼合規檢查、安全檢查、自動化測試等配置,通過TFS觸發Jenkins實現應用在PaaS的CI/CD:

1.TFS配置合規檢查、安全檢查、Jenkins連接信息(Jenkins URL、用戶名、密碼等連接信息)、Jenkins觸發方式(以手工觸發或者定時觸發等方式觸發Jenkins進行CI/CD)等;

2.開發人員編寫好代碼後,提交代碼到源代碼倉庫中,本文使用TFS作為源碼倉庫。TFS採用Git方式建立相關項目代碼庫;

3.TFS調起代碼合規檢查、安全檢查,以及Jenkins進行CI/CD;

4.Jenkins從源代碼倉庫將源碼下載下來,下載到代碼後進行單元測試,並將生成的單元測試結果發送到TFS服務器的相關目錄供TFS獲取並展示;

5.Jenkins對應用進行構建,生成應用安裝包文件(jar或war);

6.結合應用基礎鏡像和應用安裝包文件(jar或war),構建出應用鏡像;

7.應用鏡像構建成功後,將應用鏡像推送至應用鏡像倉庫中進行集中管理;

8.將應用部署鏡像至集成測試環境PaaS。PaaS根據應用部署YAML文件,從鏡像倉庫中拉取相應的應用鏡像,將應用部署OpenShift;

9.展示CI/CD執行日誌。在TFS中,能實時查看到Jenkins作業運行狀態報告相關的日誌信息。

10.應用部署完成後,TFS調起自動化測試平臺進行相關自動化測試。

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

3.1 Jenkins部署

Jenkins是使用最多的一個持續集成工具之一,是基於Java開發的開源項目,配置簡單,跨操作系統兼容能力較好,可以實施的全程監控中的過程,提供詳細的日誌文件和郵件提醒,持續集成結果可以以圖表的方式展現,支持插件化,可用的開源插件較多資源豐富,功能較為強大。

Jenkins是主從式結構,主要由兩部分構成:

  • 一部分是Master,提供web界面讓用戶管理Slave、實時監控和報告構建的狀態且生成最終的結果;
  • 另一部分是獨立運行的Slave,用來負責構建。一個Master可以關聯多個Slave。

本文Jenkins部署架構如下圖所示,Jenkins master和slave部署在PaaS開發測試雲環境中,運行在容器中:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

通過OpenShift的Template進行Jenkins部署,Jenkins Slave在進行CI/CD時動態創建,完成CI/CD任務後將自動銷燬。

3.2 TFS配置

本文通過TFS聯動Jenkins上已配置好的Pipeline,完成了應用在PaaS上的自動構建和自動部署。

3.2.1 創建生成定義

通過瀏覽器訪問TFS裡的項目主頁,在“版本和發佈”中,選擇生成定義模板界面,創建“空”的生成定義,然後填寫作業名稱:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

3.2.2 Jenkins作業配置

在獲取源中,存儲庫的下拉列表中選擇要進行CI/CD的項目,在Branch下拉列表中選擇要構建的分支。點擊頁面左邊的添加任務,選擇”Jenkins on openshift queue job”隊列作業。

在頁面左邊的排隊Queue Jenkins job作業,輸入顯示名稱,然後點擊Generic service connection服務終結點後的管理按鈕進行Jenkins相關信息配置,包括Jenkins連接名稱、服務器URL、用戶名、密碼(密碼為PaaS中用戶token)等信息:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

回到排列 Queue Jenkins job: test配置頁面,在頁面右邊的Generic service connection服務終結點下拉列表中選擇上一步配置的JENKINS_PAAS。並在作業名稱中輸入Jenkins中已經配置好的任務:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

3.3 Jenkins配置

3.3.1 配置Jenkins Agent

使用管理員用戶登錄Jenkins,在系統管理-〉系統設置中修改使用的Jenkins agent鏡像:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

3.3.2 創建視圖

使用管理員用戶登錄jenkins,點擊頁面上方的+:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

然後輸入視圖名字,選擇List View,即可創建視圖。

3.3.3 創建任務

使用管理員用戶登錄jenkins,選擇上一節中創建的視圖再點擊新建,輸入任務名稱,選擇Pipeline,勾選添加到當前視圖前的複選框,然後點擊OK:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

3.3.4 配置項目管理員權限

使用組織級配置管理員用戶登錄jenkins,選擇系統管理->全局安全配置->項目矩陣授權策略,點擊“用戶名-view”最後的x,刪除該用戶:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

使用組織級管理員用戶登錄jenkins,選擇上面創建的Pipeline的用戶權限:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

3.4 Pipeline配置

3.4.1 配置Credential

Credential用於配置TFS代碼庫的用戶名、密碼信息。使用應用管理員用戶登錄jenkins,選擇“系統管理”-->“Configure Credentials”,選擇“Add Credentials”,創建Credentials:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

3.4.2 配置項目Pipeline

使用應用用戶登錄jenkins,點擊上面創建的pipeline,點擊“配置”,在pipeline>

<code>

def

app_name = '應用名稱''

def

service_name = "${app_name}"

def

dev_project_name = '應用在ocp中所在的project'

def

base_image = '基礎鏡像名稱'

def

tfs_credentialsId = 'CredentialID'

def

tfs_url = '代碼庫URL'

def

tfs_branch = "TFS Git代碼庫分支名"

def

tfs_tag = "TFS Git代碼庫標籤"

def

version, mvnCmd = 'mvn '

pipeline

{

agent

{

label

'maven'

}

stages

{

Package') {

steps

{

......

//下載應用代碼

}

}

Test') {

steps

{

......

//進行單元測試

}

}

Package') {

steps

{

//構建應用部署包

}

}

Image Builder') {

steps

{

//配置構建鏡像信息

}

}

Image') {

steps

{

//構建應用鏡像

}

}

DEV') {

steps

{

//部署應用鏡像

}

}

}

/<code>

3.4.3 執行Pipeline

使用應用用戶登錄jenkins,選擇上面創建的Pipeline,點擊立即構建:

【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF

  • 使用應用用戶登錄jenkins;
  • 選擇上面創建的Pipeline;
  • 選擇左下角構建歷史中一個版本信息;
  • 選擇“Console Output”,即可查看構建詳細日誌。
【農行DevOps進行時】基於PaaS的持續集成/持續交付實踐 | IDCF


四、總結


CI/CD被視為敏捷軟件開發的奠基石,體現出瞭如下優點:

  • 自動化流水線操作帶來了高效;
  • 通過持續交付實現了持續集成生成的程序包隨時可部署;
  • 極大程度避免手工操作帶來的錯誤;
  • 可以快速迭代版本,一定程度上縮減了開發週期。

基於PaaS平臺的CI/CD方案通過鏡像能快速創建持續集成環境,簡化持續集成的環境搭建過程,快速地實現代碼構建、構建驗證測試、自動部署,以及生成執行結果的報告等,使得產品能夠快速迭代的同時,儘可能保持較高質量。


分享到:


相關文章: