新聞中心
隨著編排工具的普及,我們能夠以持續(xù)集成(CI)和持續(xù)交付(CD)的方式,實(shí)現(xiàn)開(kāi)發(fā)與運(yùn)營(yíng)的無(wú)縫協(xié)作。在許多軟件開(kāi)發(fā)團(tuán)隊(duì)中,他們首選的DevOps自動(dòng)化工具,當(dāng)屬Jenkins。下面,我將和您討論在使用Jenkins的過(guò)程中,一些值得遵循的優(yōu)秀實(shí)踐。

一、時(shí)刻保持Jenkins的安全
在默認(rèn)配置情況下,Jenkins是不執(zhí)行任何安全檢查的。也就是說(shuō),除一些簡(jiǎn)單基本的Jenkins配置、作業(yè)和構(gòu)建,網(wǎng)站的訪問(wèn)者幾乎可以在Jenkins的主數(shù)據(jù)庫(kù)中執(zhí)行任何隨機(jī)代碼。同時(shí),Jenkins還允許在所有連接的代理上,執(zhí)行包括用戶密碼、證書(shū)、以及其他隱私數(shù)據(jù)之類的代碼操作。
具體實(shí)踐
為了保護(hù)Jenkins的安全,我們需要通過(guò)如下兩個(gè)方面,來(lái)“配置全局安全性(Configure Global Security)”選項(xiàng)。
安全領(lǐng)域: 通常也被稱為“身份驗(yàn)證”。它會(huì)告知Jenkins的基本環(huán)境,以及從何處提取用戶信息。
如上圖所示,從Jenkins V2.214和Jenkins LTS V2.222.1開(kāi)始,“Jenkins自己的用戶數(shù)據(jù)庫(kù)”被用作了默認(rèn)的安全選項(xiàng)。而對(duì)于兩者之前的版本,我們應(yīng)當(dāng)選中“啟用安全”復(fù)選框,以方便用戶使用其憑據(jù)登錄,進(jìn)而避免任何侵入。
在配置有諸如LDAP之類外部身份提供者的組織中,我們需要為Jenkins實(shí)例安裝并啟用LDAP插件,以實(shí)現(xiàn)將所有身份驗(yàn)證(包括用戶和組),都委派給已配置的LDAP服務(wù)器。
授權(quán):告知Jenkins環(huán)境中有關(guān)哪些用戶和(或)組,可以訪問(wèn)Jenkins的哪些方面,以及他們的權(quán)限。如上圖所示,我們有五種授權(quán)的選擇方式:
- 任何人都可以做任何事:除了本地測(cè)試的Jenkins控制器,我們應(yīng)避免啟用該設(shè)置。畢竟所有人、包括匿名用戶都可以完全控制Jenkins,是極其危險(xiǎn)的。
- 舊版模式:我們同樣應(yīng)當(dāng)避免選用該設(shè)置。只有具有“管理員”角色的用戶才能被授予對(duì)系統(tǒng)具有完全控制權(quán);否則,他們將只有讀取權(quán)限。
- 已登錄的用戶可以執(zhí)行任何操作:此模式會(huì)強(qiáng)制每個(gè)用戶在使用Jenkins之前,必須登錄。據(jù)此,匿名用戶只能獲得對(duì)于Jenkins的讀取訪問(wèn)權(quán)限,或者根本就沒(méi)有訪問(wèn)權(quán)限。同時(shí),用戶的任何操作也會(huì)得到審核。
- 基于矩陣的安全性:該方案可以準(zhǔn)確控制在Jenkins環(huán)境中,哪些用戶和組可以執(zhí)行哪些操作。
- 基于項(xiàng)目的矩陣授權(quán)策略:該插件提供了基于矩陣的安全性,和基于項(xiàng)目的矩陣授權(quán)策略,因此它們需要在Jenkins上被單獨(dú)安裝。同時(shí),該授權(quán)方案是對(duì)基于矩陣的安全性的擴(kuò)展,它允許在“項(xiàng)目配置”的界面中,為每個(gè)項(xiàng)目、以及特定的用戶或組,分別定義訪問(wèn)控制列表(ACL)??偟恼f(shuō)來(lái),此類策略為許多Jenkins環(huán)境提供了極好的安全性和靈活性,因此是一種不錯(cuò)的實(shí)踐。
為了保護(hù)Jenkins用戶免受其他威脅,我們還可以按需開(kāi)啟如下功能(它們默認(rèn)處于關(guān)閉狀態(tài)):
- 跨站點(diǎn)請(qǐng)求偽造(CSRF)保護(hù):防止針對(duì)運(yùn)行在防火墻內(nèi)部的Jenkins進(jìn)行遠(yuǎn)程攻擊。CSRF設(shè)置的路徑為:“管理Jenkins”>“配置全局安全性”>“部分:CSRF保護(hù)”。具體說(shuō)明請(qǐng)參見(jiàn)--https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery。當(dāng)然,從Jenkins 2.0開(kāi)始,CSRF保護(hù)是默認(rèn)已啟用的。
- 在主節(jié)點(diǎn)上運(yùn)行構(gòu)建的安全隱患:在主節(jié)點(diǎn)上運(yùn)行的構(gòu)建,是可以讀取或修改JENKINS_HOME中任何文件的。由于可以讀取憑據(jù),創(chuàng)建管道與作業(yè),安裝插件,因此會(huì)影響Jenkins的整個(gè)構(gòu)建過(guò)程。通常,為了配置主節(jié)點(diǎn)為不具備執(zhí)行權(quán)限,我們既可以只在構(gòu)建代理上運(yùn)行構(gòu)建,又可以在構(gòu)建代理中,將管理Jenkins的人員與配置人員,以及提交項(xiàng)目的人員角色區(qū)分開(kāi)來(lái);或者直接使用“作業(yè)限制插件(Jobs Restrictions Plugin)”,來(lái)對(duì)哪些作業(yè)可以在主節(jié)點(diǎn)上運(yùn)行進(jìn)行過(guò)濾。
二、始終備份JENKINS_HOME目錄
Jenkins的主目錄包含了:作業(yè)配置、構(gòu)建日志、插件配置等各種重要的數(shù)據(jù)。我們可以通過(guò)Jenkins提供的插件,來(lái)配置需要備份的作業(yè)。
具體實(shí)踐
1.精簡(jiǎn)備份(Thin Backup)插件
這是所有提供自動(dòng)化定期備份的工具中,最方便的插件之一。它的啟用過(guò)程為:
- 通過(guò)“管理Jenkins”>“管理插件”>“單擊‘可用’選項(xiàng)卡”>“搜索‘精簡(jiǎn)備份’”以安裝插件。
- 完成安裝后,請(qǐng)轉(zhuǎn)到“管理Jenkins”>“精簡(jiǎn)備份”>“設(shè)置”。
- 單擊“立即備份”以測(cè)試備份的效果。
2.定期備份插件
如下圖所示,一旦配置完成,該插件將會(huì)定期運(yùn)行備份作業(yè)。具體內(nèi)容,請(qǐng)參閱--https://plugins.jenkins.io/periodicbackup/。
該插件定義了如下三個(gè)方面:
- 文件管理器:定義在備份中需要包括哪些文件,以及文件的還原策略。例如,ConfigOnly將僅選擇配置類XML文件。
- 存儲(chǔ):指定存檔和取消存檔備份的方法。例如,“ZipStorage”會(huì)將備份文件壓縮為ZIP檔案。
- 位置:指定備份的位置。例如,“LocalDirectory”是將備份文件存儲(chǔ)到指定的路徑上。
3.配置常規(guī)備份作業(yè)
- 在創(chuàng)建新的Jenkins任務(wù)時(shí)選擇“自由式項(xiàng)目”。
- 將SCM標(biāo)記為“無(wú)”。
- 在“構(gòu)建觸發(fā)器”中選擇“定期構(gòu)建”,然后在“計(jì)劃”中配置頻率。
- 根據(jù)配置文件,添加執(zhí)行殼(Execute Shell),以構(gòu)建作業(yè)。
4.將Jenkins配置備份到Google Cloud存儲(chǔ)空間
如果您在Google Cloud的Kubernetes集群上部署了Jenkins的服務(wù)器配置,則可以將上述精簡(jiǎn)備份插件與Google Cloud Storage插件一起使用,以便連接到云端。具體實(shí)現(xiàn)說(shuō)明,請(qǐng)參照--https://medium.com/faun/backing-up-jenkins-to-google-cloud-storage-4ba12e69ded2。
三、為每個(gè)維護(hù)或開(kāi)發(fā)分支,設(shè)置不同的作業(yè)/項(xiàng)目
眾所周知,利用持續(xù)集成工具的優(yōu)勢(shì)之一便是:在開(kāi)發(fā)生命周期的早期階段,能夠檢測(cè)出問(wèn)題。而Jenkins恰好提供了并行構(gòu)建管道的方法。因此,為每個(gè)分支設(shè)置不同的作業(yè)/項(xiàng)目,可以讓我們?cè)陂_(kāi)展并行開(kāi)發(fā)的同時(shí),盡早發(fā)現(xiàn)問(wèn)題,降低風(fēng)險(xiǎn),并提高開(kāi)發(fā)人員的生產(chǎn)率。
具體實(shí)踐
最新的Parallel Test Executor插件(請(qǐng)參見(jiàn)--https://plugins.jenkins.io/parallel-test-executor/),可幫助我們執(zhí)行并行測(cè)試。
四、防止并行運(yùn)行的作業(yè)產(chǎn)生資源沖突
當(dāng)然,值得注意的是,多個(gè)同時(shí)運(yùn)行的作業(yè)在創(chuàng)建服務(wù)或需要排他式的訪問(wèn)時(shí),可能由于沖突的產(chǎn)生,而導(dǎo)致Jenkins管道失效。
具體實(shí)踐
我們可以為并行的各個(gè)項(xiàng)目構(gòu)建,分配不同的端口,以避免沖突。例如,對(duì)于數(shù)據(jù)庫(kù)之類需要鎖定某個(gè)持久資源的需求場(chǎng)景,我們可以通過(guò)采用Throttle Concurrent Builds 插件(請(qǐng)參見(jiàn)--https://wiki.jenkins.io/display/JENKINS/Throttle+Concurrent+Builds+Plugin),來(lái)根據(jù)全局配置或某個(gè)項(xiàng)目啟用的節(jié)點(diǎn)數(shù),調(diào)節(jié)并行構(gòu)建的數(shù)量。
如上圖所示,我們可以使用0,將并發(fā)構(gòu)建設(shè)置為無(wú)限。
五、使用“文件指紋”管理依賴項(xiàng)
我們?cè)贘enkins上創(chuàng)建依賴項(xiàng)時(shí),往往容易引發(fā)相互之間版本的混淆問(wèn)題。而Jenkins支持的“文件指紋(File fingerprinting)”功能正好可以簡(jiǎn)化該過(guò)程。
具體實(shí)踐
我們需要將所有相關(guān)項(xiàng)目,都配置為記錄下由項(xiàng)目產(chǎn)生的jar文件,以及項(xiàng)目所有依賴項(xiàng)的jar文件指紋。在具體配置上,您可以依次進(jìn)入:“項(xiàng)目”>“配置”>“構(gòu)建后操作”>“記錄指紋”。同時(shí),您可以參考文檔--https://wiki.jenkins.io/display/JENKINS//Fingerprint。
六、避免在管道中使用復(fù)雜的Groovy代碼
對(duì)于Jenkins管道,Groovy代碼往往會(huì)在主服務(wù)器上調(diào)用大量的主資源(如:內(nèi)存和CPU)來(lái)執(zhí)行。因此,我們需要減少在管道中執(zhí)行的Groovy代碼量。
具體實(shí)踐
1. JsonSlurper
此功能函數(shù)與XmlSlurper或readFile類似,可被用于從磁盤(pán)上讀取文件,將文件中的數(shù)據(jù)解析為JSON對(duì)象,然后使用JsonSlurper().parseText(readFile(“$LOCAL_FILE”))命令,將該對(duì)象注入管道中。由于該命令會(huì)兩次將本地文件加載到主服務(wù)器上的內(nèi)存中,因此如果文件過(guò)大、或該命令被反復(fù)執(zhí)行的話,則將消耗大量的內(nèi)存。
解決方案:為了代替JsonSlurper,我們可以使用shell step的如下命令。
- def JsonReturn = sh label: ”, returnStdout: true, script: ‘echo “$LOCAL_FILE”| jq “$PARSING_QUERY”‘
它將使用代理資源來(lái)讀取文件,其中的$PARSING_QUERY將有助于將文件解析成小塊。
2. HttpRequest
通常,此命令可用于從外部資源獲取數(shù)據(jù),并將其存儲(chǔ)在變量中。在此過(guò)程中,由于請(qǐng)求直接來(lái)自主服務(wù)器,而如果主服務(wù)器未加載證書(shū),則可能造成HTTPS請(qǐng)求的結(jié)果不一致。另外,該請(qǐng)求的響應(yīng)也會(huì)被重復(fù)性地存儲(chǔ)了兩次。
解決方案:使用shell step來(lái)執(zhí)行代理的HTTP請(qǐng)求。例如,我們可以適當(dāng)?shù)厥褂弥T如curl或wget等工具。同時(shí),如果結(jié)果必須是在Jenkins管道的后端,那么我們則必須在代理端過(guò)濾掉盡可能多地結(jié)果,以便只把必要的信息傳送到Jenkins的主數(shù)據(jù)庫(kù)中。
七、建立可擴(kuò)展的Jenkins管道
相比一般的程序庫(kù),共享庫(kù)(Shared Libraries)提供了版本控制的管道代碼。我們可以從源代碼管理(SCM)處進(jìn)行存儲(chǔ)和訪問(wèn)。
具體實(shí)踐
我們需要在SCM中存儲(chǔ)具有一致性結(jié)構(gòu)的源文件,然后使用SCM的插件,將該庫(kù)連接到Jenkins實(shí)例上。具體的操作步驟為:依次在“管理Jenkins”>“配置系統(tǒng)”>“全局管道庫(kù)”下啟用全局共享庫(kù)。當(dāng)然,我們也可以在Jenkinsfile中使用庫(kù)名稱,以允許管道訪問(wèn)共享庫(kù)。
八、管理聲明式語(yǔ)法和聲明式管道
當(dāng)涉及到企業(yè)級(jí)Jenkins的實(shí)施和管道資源的管理時(shí),我們可以通過(guò)聲明式管道配置,告知系統(tǒng)該如何運(yùn)作,以便將復(fù)雜性轉(zhuǎn)移到系統(tǒng)上。同時(shí),您可以參考通用的聲明性步驟(請(qǐng)參見(jiàn)--https://jenkins.io/doc/book/pipeline/getting-started/#directive-generator),來(lái)創(chuàng)建未開(kāi)發(fā)的管道;或使用代碼段生成器(請(qǐng)參見(jiàn)--https://www.jenkins.io/doc/book/pipeline/getting-started/#snippet-generator),將現(xiàn)有的構(gòu)建步驟轉(zhuǎn)換為管道語(yǔ)法。此外,《管道入門(mén)指南》和《管道示例》都是兩個(gè)不錯(cuò)的社區(qū)參考資源。
九、保持較高的測(cè)試代碼覆蓋率,并將單元測(cè)試作為管道的一部分
顯然,代碼測(cè)試的覆蓋率越高,產(chǎn)品的缺陷就會(huì)越少,用戶驗(yàn)收測(cè)試(UAT)的通過(guò)率也就越高。因此,我們需要依靠更詳細(xì)的單元測(cè)試,以及更高的測(cè)試覆蓋范圍,來(lái)確保開(kāi)發(fā)人員在開(kāi)發(fā)生命周期的早期階段,提高代碼的質(zhì)量。
具體實(shí)踐
1. Jenkins Cobertura插件
為了捕獲代碼覆蓋率的相關(guān)報(bào)告,我們需要完成Cobertura插件的如下配置步驟:
- 通過(guò)“管理Jenkins”>“管理插件”來(lái)安裝Cobertura插件。
- 配置項(xiàng)目的構(gòu)建腳本,以生成Cobertura XML報(bào)告。
- 啟用“發(fā)布Cobertura覆蓋率報(bào)告”。
- 指定生成coverage.xml報(bào)告的目錄。
- (可選)配置覆蓋率的相關(guān)指標(biāo)。
您可以通過(guò)鏈接,來(lái)獲悉如何配置單個(gè)項(xiàng)目、項(xiàng)目的層次結(jié)構(gòu)、以及Maven。
2.代碼覆蓋率API插件
作為統(tǒng)一的API插件,它能夠支持Cobertura等其他插件。其主要功能包括:
- 根據(jù)用戶的配置,查找覆蓋率的相關(guān)報(bào)告。
- 使用適配器將報(bào)告轉(zhuǎn)換為標(biāo)準(zhǔn)格式。
- 匯總已解析的標(biāo)準(zhǔn)格式化報(bào)告,并在圖表中顯示已解析的結(jié)果。
3.LambdaTest Selenium Grid Cloud
由于提供了廣泛的瀏覽器及其版本庫(kù),因此您可以在使用Selenium測(cè)試套件,在執(zhí)行自動(dòng)化測(cè)試時(shí),獲得更高的測(cè)試覆蓋率。通常,LambdaTest Jenkins插件可以提供:
- 為Jenkins作業(yè)配置LambdaTest憑據(jù)。
- 設(shè)置Lambda隧道并刪除二進(jìn)制文件,以方便在本地托管的Web應(yīng)用上,進(jìn)行自動(dòng)化跨瀏覽器測(cè)試。
- 將包括視頻日志、網(wǎng)絡(luò)日志、以及LambdaTest執(zhí)行步驟的相關(guān)截圖等所有測(cè)試結(jié)果,嵌入Jenkins的作業(yè)結(jié)果。
在完成LambdaTest Jenkins插件的安裝后,我們通過(guò)將Jenkins CI實(shí)例連接到LambdaTest grid上,來(lái)自動(dòng)化Selenium自動(dòng)化測(cè)試腳本。您也可以通過(guò)鏈接,參考Jenkins集成的支持文檔。
十、監(jiān)控CI/CD管道
我們需要通過(guò)監(jiān)控,來(lái)獲悉諸如云服務(wù)、網(wǎng)絡(luò)、測(cè)試服務(wù)等外部依賴項(xiàng)是如何影響CI/CD管道的,以便及時(shí)采取行動(dòng)。在此,我們可以使用Jenkins Slack插件,將錯(cuò)誤通知發(fā)送到由值守工程師監(jiān)控的頻道中。該插件不但可以提供諸如:構(gòu)建合格率、平均構(gòu)建時(shí)間、以及特定階段的錯(cuò)誤計(jì)數(shù)等信息;還能夠協(xié)助我們識(shí)別出在構(gòu)建中,效率低下、需要改進(jìn)的潛在區(qū)域。
小結(jié)
總的說(shuō)來(lái),Jenkins的優(yōu)秀實(shí)踐包括:讓Jenkins運(yùn)行在自己的用戶數(shù)據(jù)庫(kù)上,采用基于權(quán)限和用戶矩陣的訪問(wèn)控制方式,自動(dòng)運(yùn)行相關(guān)配置的備份,鼓勵(lì)應(yīng)用團(tuán)隊(duì)采用Shell step,以避免復(fù)雜的Groovy腳本,擁有共享庫(kù)和Jenkinsfiles的所有權(quán),通過(guò)使用自動(dòng)化狀態(tài)插件來(lái)監(jiān)控管道,并定義聲明性的管道,提高代碼測(cè)試的覆蓋率,以及讓代碼覆蓋率API與LambdaTest Selenium Grid相集成,以實(shí)現(xiàn)無(wú)缺陷的交付。
分享題目:您遵循過(guò)這些Jenkins優(yōu)秀實(shí)踐嗎?
網(wǎng)站URL:http://fisionsoft.com.cn/article/ccdsgop.html


咨詢
建站咨詢
