0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對iPipeline的接口進行優(yōu)化和實踐

8nfr_ZTEdevelop ? 來源:未知 ? 作者:易水寒 ? 2018-04-05 18:14 ? 次閱讀




概述

XXX項目原CI系統(tǒng)由項目自行搭建,使用Jenkins傳統(tǒng)的Job方式來實現(xiàn)VerifyCI和MergeCI以及DailyBuild。隨著項目規(guī)模越來越大,分支越來越多,合代碼的頻率也逐漸增大的情況下,現(xiàn)有系統(tǒng)呈現(xiàn)出諸多不便之處。為解決這些問題,項目嘗試引入一系列現(xiàn)成公司級Devops研發(fā)工具并結(jié)合Jenkins2.0的Pipeline新特性來改造本項目Pipeline流程。

Pipeline as Code 是 Jenkins 2.0 版本的精華所在,是幫助 Jenkins 實現(xiàn)從 CI 到 CD 華麗轉(zhuǎn)身的關(guān)鍵工具。所謂 Pipeline,簡單來說,就是一套運行于 Jenkins 上的工作流框架,將原本獨立運行于單個或者多個節(jié)點的任務(wù)連接起來,實現(xiàn)單個任務(wù)難以完成的復(fù)雜發(fā)布流程。落實到代碼級別,即我們只需要把精力集中在編寫 Jenkinsfile 文件上,然后將其隨同代碼庫一起托管,Jenkins可以根據(jù)Jenkinsfile來迅速拉起項目的CI流程,方便高效。

但是隨著多個項目的試行、落地,發(fā)現(xiàn)基于Jenkins2.0的Pipeline功能強大,但是具體應(yīng)用到各個項目還有如下幾個痛點:

各個項目都在編寫自己特色的Jenkinsfile,很多時候互相復(fù)制修改一下代碼實現(xiàn),Jenkinsfile冗余度非常高;

按照Jenkins1.x時代的思路,訂制化自己的CI/CD流程、郵件通知、報告輸出,轉(zhuǎn)換過程緩慢而痛苦;

遇到技術(shù)問題沒有能力解決、采用一些過時的方法和工具,而其他項目組已經(jīng)解決一些技術(shù)問題或者采用了更加先進的方法和工具,互相并不能及時分享;

為了解決這些問題,經(jīng)過項目反復(fù)調(diào)研和摸底,最終采用了中開社上開源的Jenkins2.0的Pipeline共創(chuàng)庫iPipeline(又稱plll庫)來輔助本項目重構(gòu)CI流程。

iPipeline是簡化CI Pipeline部署的工具集,是面向開發(fā)人員和CI配置管理員的函數(shù)庫,其封裝了Jenkins 2.0的常用函數(shù),集成了Gerrit、制品庫、云CI、度量、告警采集、郵件通知,另外提供docker封裝的工具集(復(fù)雜度、Klocwork、度量分析、度量導(dǎo)入等)。利用其可以幫助我們節(jié)省很多精力,避免重復(fù)造輪子,因此非常滿足我們項目的需求。

問題描述

iPipeline框架在本項目的實踐過程中確實提高了很多效率和幸福感,但結(jié)合本項目一些實際的使用情況,發(fā)現(xiàn)其仍然存在一些優(yōu)化和改進的點。為此針對我們項目的需要,我們對iPipeline做了如下一些優(yōu)化并實踐。

問題1

利用plll庫提供的pdocker接口,可以很方便地在指定的節(jié)點上運行指定的Docker容器來完成相關(guān)CI任務(wù)。比如本項目圈復(fù)雜度檢查已經(jīng)Docker化,因此可以利用pdocker接口,通過配置上鏡像名、映射目錄以及需要運行的指令與腳本來執(zhí)行代碼的圈復(fù)雜度檢查。

但是實際在對pdocker接口的使用過程中發(fā)現(xiàn),plll庫每次都會去節(jié)點上pull鏡像,然后再運行,這對于鏡像其實已經(jīng)存在于本地節(jié)點的情況其實并沒有必要,因此需要改造。

問題2

目前plll庫提供的Update接口僅支持Gerrit代碼倉庫的代碼檢出更新,但本項目運行某些用例測試需要的報文存儲于SVN庫上,因此有必要擴充plll庫原有接口,使其支持SVN庫的代碼更新

帶著這兩個問題,我們對plll庫做出了對應(yīng)的一些優(yōu)化并且實踐之。

優(yōu)化實踐

優(yōu)化1:pdocker接口是否需要拉取鏡像由用戶自定義

改造pdocker接口,添加參數(shù)來控制是否需要pull鏡像,接口代碼片段如下:

/**

* 工具名稱:docker執(zhí)行

* 工具描述:

* image - 鏡像的全路徑

* needPull - 是否需要pull鏡像

* before_cmd - 以root執(zhí)行的命令行,在執(zhí)行user_cmd前執(zhí)行

* volumes - 路徑映射清單,"a:b,c:d"

* params - 執(zhí)行參數(shù)

* profile - 環(huán)境文件,可執(zhí)行

* user_cmd - 以當前用戶執(zhí)行的命令行(需要鏡像支持adduser命令)

* after_cmd - 以root執(zhí)行的命令行,在執(zhí)行user_cmd后執(zhí)行

* local_dir - 存放臨時文件的目錄(要求有權(quán)限映射到容器內(nèi))

* shared_dir - 存放代碼和產(chǎn)出文件的目錄(要求有權(quán)限映射到容器內(nèi))

* sh_exec - shell進程,默認為sh

**/

def call(image, needPull, before_cmd, volumes='',params='', profile='', user_cmd='', after_cmd='',

local_dir=env.LOCAL, shared_dir=env.SHARED, sh_exec='sh'){

// ...此處代碼省略...

if( needPull =="no"){

echo "no need to pull image !!! The image exists in local!"

writeFile file:docker_entry_file, text:"""

set -e

docker run --rm ${params} ${volumes} ${image} ${sh_exec} -x -c ${docker_run_file}

"""

}elseif( needPull =="yes"){

writeFile file:docker_entry_file, text:"""

set -e

docker pull ${image}

docker run --rm ${params} ${volumes} ${image} ${sh_exec} -x -c ${docker_run_file}

"""

}

// ...此處代碼省略...

}

由代碼可以看出,通過添加needPull參數(shù),即可由用戶自定義是否需要pull鏡像。

使用舉例:

例如本項目調(diào)用pdocker接口利用自制docker鏡像完成代碼圈復(fù)雜度檢查:

pnode("${env.NODE_NAME}"){

plll.Check("CCN_DOCKER","CCN_DOCKER",[

run_execute:{ pdocker (

/* image */"docker.zte.com.cn:5000/10010891/lizard:v1",

/* need pull */"no",

/* cmd */"cd /home/code/ && chmod -R 777 * && cd script/VerifyCI/CCNCheck/ && sh +x lizard.sh",

/* volumes */"-v ${env.SHARESPACE}/${env.XXXXX_DIR}:/home",

/* params */"--privileged",

)

},

param:[

report_file:[]

]

]);

}

由于docker.zte.com.cn:5000/10010891/lizard:v1已經(jīng)存在于我們的外掛節(jié)點上,因此此處needPull參數(shù)置為no即可控制pdocker內(nèi)部無需再去pull鏡像。

優(yōu)化2:擴充框架Update接口,使其支持SVN代碼更新

優(yōu)化Plll庫代碼,加入UpdateSVN接口來支持SVN庫的代碼檢出與更新

/**

* 功能名稱:Update

* 功能描述:通過SVN更新代碼

**/

defUpdateSVN(name, desc, args){

LogDebug("[DEBUG] Update: ${name}, ${desc}")

args.run_execute ={

dir("${args.scm.path}"){

svn_checkout( args.scm.keyid, args.scm.repo, args.scm.path )

}

}

/* 調(diào)用功能適配 */

FunctionAdapter("Update","update", name, desc, args){}

return

}

/**

* 工具名稱:svn_checkout

* 工具描述:svn更新代碼

* 參數(shù)描述:

* - keyid: SVN庫的Credentials ID

* - repo: SVN庫Repo路徑

* - path: 代碼下載路徑

**/

def svn_checkout(keyid, repo, path){

checkout([

$class:'SubversionSCM',

additionalCredentials:[],

excludedCommitMessages:'',

excludedRegions:'',

excludedRevprop:'',

excludedUsers:'',

filterChangelog:false,

ignoreDirPropChanges:false,

includedRegions:'',

locations:[

[credentialsId:"${keyid}", depthOption:'infinity', ignoreExternalsOption:true,local:".", remote:"${repo}"]

],

workspaceUpdater:[$class:'UpdateUpdater']

])

return

}

使用舉例:

用戶只需要配置上:

SVN庫的Credentials ID

SVN庫Repo路徑

代碼下載路徑

即可完成SVN代碼檢出和更新,示例如下:

// 先配置好SVN相關(guān)參數(shù)

env.SVN_KEY_ID ="89a6fe98-8f0c-4fe6-829e-6d1cbda188e1"

env.CASE_DIR ="/jenkins_ci/CASE_TEST/PATH"

env.CASE_SVN_URL ="svn://XXX.XX.XXX.XXX/XXXXXXX/case/XXXX"

// 調(diào)用UpdateSVN接口完成SVN庫代碼更新

plll.UpdateSVN('SVN_UP','更新SVN上報文',[

scm:[keyid:"${env.SVN_KEY_ID}", repo:"${env.CASE_SVN_URL}", path:"env.CASE_DIR"],

run_dir:"${->OUTPUT_PATH}"

])

推廣建議

本文章相關(guān)優(yōu)化改進可推廣至需要利用docker鏡像完成相關(guān)CI任務(wù)和代碼管控涉及SVN庫的項目

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8459

    瀏覽量

    150748
  • Pipeline
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    9339

原文標題:干貨 | Jenkins2.0 Pipeline框架(iPipeline)優(yōu)化實踐之路(一)

文章出處:【微信號:ZTEdeveloper,微信公眾號:中興開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    優(yōu)化高速接口的時序裕量

    本文將對源同步定時如何優(yōu)化高速接口時序裕量進行討論。時序預(yù)算是對系統(tǒng)正常工作所需時序參數(shù)或時序要求的計算。
    發(fā)表于 03-20 10:46 ?2618次閱讀
    <b class='flag-5'>優(yōu)化</b>高速<b class='flag-5'>接口</b>的時序裕量

    LabVIEW 助力優(yōu)化軟件開發(fā)實踐和源代碼控制

    的軟件開發(fā)實踐和程序源代碼控制管理。  源代碼控制管理  源代碼控制管理是軟件工程最基本的環(huán)節(jié)之一(因為它決定了如何對一個應(yīng)用程序的依賴關(guān)系進行存儲、組織管理以及在開發(fā)者之間共享,甚至會直接影響程序
    發(fā)表于 09-13 09:30

    CoolRunner-II CPLD入門套件上的USB接口可以進行優(yōu)化嗎?

    親愛的朋友們,作為一個業(yè)余愛好者,我想問一個關(guān)于通過板載USB端口連接我的CoolRunner-II CPLD入門套件的問題。是否可以使用板載USB設(shè)備對CPLD進行編程,然后將其作為已實現(xiàn)應(yīng)用程序的通信接口進行
    發(fā)表于 08-20 10:48

    工業(yè)吸塵吸水機谷歌優(yōu)化推廣,12年實踐經(jīng)驗

    `工業(yè)吸塵器的外貿(mào)怎么推廣,網(wǎng)站優(yōu)化更有效果工業(yè)吸塵吸水機谷歌優(yōu)化推廣,12年實踐經(jīng)驗掃地機關(guān)鍵詞如何SEO優(yōu)化到GOOGLE首頁 曾經(jīng)我以為GOOGLE SEO
    發(fā)表于 10-28 15:53

    高原環(huán)境下TD-SCDMA網(wǎng)絡(luò)的優(yōu)化實踐,不看肯定后悔

    高原環(huán)境下TD-SCDMA網(wǎng)絡(luò)的優(yōu)化實踐,不看肯定后悔
    發(fā)表于 05-28 06:57

    解讀最佳實踐:倚天 710 ARM 芯片的 Python+AI 算力優(yōu)化

    710 ARM 芯片上開展的 Python+AI 優(yōu)化工作,以及在 ARM 云平臺上部署 Python+AI 任務(wù)的最佳實踐。以下為本次演講內(nèi)容:(圖/朱宏林現(xiàn)場演講)我們的場景是 ARM 平臺
    發(fā)表于 12-23 16:02

    虛幻引擎的紋理最佳實踐

    紋理是游戲不可或缺的一部分。 這是一個藝術(shù)家可以直接控制的領(lǐng)域,以提高游戲的性能。 本最佳實踐指南介紹了幾種紋理優(yōu)化,這些優(yōu)化可以幫助您的游戲運行得更流暢、看起來更好。 最佳實踐系列指
    發(fā)表于 08-28 06:39

    政府外網(wǎng)優(yōu)化設(shè)計實踐

    政府外網(wǎng)優(yōu)化設(shè)計實踐 摘  要:本文詳細分析了政府外網(wǎng)應(yīng)用特點,結(jié)合當前先進的網(wǎng)絡(luò)技術(shù)和設(shè)備功能及其在管理工作中應(yīng)用,描述了適用于政府各級部
    發(fā)表于 05-23 15:44 ?5次下載

    MySql5.6性能優(yōu)化最佳實踐

    MySql5.6性能優(yōu)化最佳實踐
    發(fā)表于 09-08 08:47 ?13次下載
    MySql5.6性能<b class='flag-5'>優(yōu)化</b>最佳<b class='flag-5'>實踐</b>

    iPipeline的對plll庫做出了對應(yīng)的優(yōu)化實踐之。

    項目CI系統(tǒng)引入了Jenkins2.0 iPipeline 框架(plll庫)之后應(yīng)該說提升了很多幸福感,其中一個很重要的方面來源于框架已經(jīng)為用戶提供了報告和郵件的基本格式,顯示直觀且高效。
    的頭像 發(fā)表于 04-05 18:23 ?4839次閱讀
    對<b class='flag-5'>iPipeline</b>的對plll庫做出了對應(yīng)的<b class='flag-5'>優(yōu)化</b>并<b class='flag-5'>實踐</b>之。

    如何對C語言程序進行優(yōu)化

    對程序進行優(yōu)化,通常是指優(yōu)化程序代碼或程序執(zhí)行速度。優(yōu)化代碼和優(yōu)化速度實際上是一個予盾的統(tǒng)一,一般是優(yōu)化
    發(fā)表于 11-15 11:08 ?11次下載
    如何對C語言程序<b class='flag-5'>進行</b><b class='flag-5'>優(yōu)化</b>

    18種接口優(yōu)化方案匯總1

    之前工作中,遇到一個`504`超時問題。原因是因為接口耗時過長,超過`nginx`配置的`10`秒。然后 真槍實彈搞了一次接口性能優(yōu)化,最后接口從`11.3s`降為`170ms`。本文
    的頭像 發(fā)表于 02-15 15:59 ?829次閱讀
    18種<b class='flag-5'>接口</b><b class='flag-5'>優(yōu)化</b>方案匯總1

    18種接口優(yōu)化方案匯總2

    之前工作中,遇到一個`504`超時問題。原因是因為接口耗時過長,超過`nginx`配置的`10`秒。然后 真槍實彈搞了一次接口性能優(yōu)化,最后接口從`11.3s`降為`170ms`。本文
    的頭像 發(fā)表于 02-15 15:59 ?637次閱讀
    18種<b class='flag-5'>接口</b><b class='flag-5'>優(yōu)化</b>方案匯總2

    接口優(yōu)化的常見方案實戰(zhàn)總結(jié)

    針對老項目,去年做了許多降本增效的事情,其中發(fā)現(xiàn)最多的就是接口耗時過長的問題,就集中搞了一次接口性能優(yōu)化。本文將給小伙伴們分享一下接口優(yōu)化
    的頭像 發(fā)表于 03-06 09:22 ?540次閱讀

    介紹得物App在資源優(yōu)化上做的一些實踐

    包體積優(yōu)化中,資源優(yōu)化一般都是首要且容易有成效的優(yōu)化方向。資源優(yōu)化是通過優(yōu)化APK中的資源項來優(yōu)化
    的頭像 發(fā)表于 07-24 09:00 ?714次閱讀
    介紹得物App在資源<b class='flag-5'>優(yōu)化</b>上做的一些<b class='flag-5'>實踐</b>