前端工程化:圍繞Jenkins打造工作流的過程

背景

1年前入職時,公司前端部門的靜態代碼部署都是用ftp工具拖拽部署,沒有記錄,沒有關聯,經常造成許多困擾的問題,

比如:今天有沒有其他人在我要部署的路徑上工作?我的代碼為啥被蓋掉了?被誰蓋掉的?啥時候蓋掉的?

本地build,ftp拖拽部署這種方式,導致git版本與手動的構建、部署沒啥關聯,更有在本地寫完代碼部署上去后,壓根沒傳git這種失誤可能發生。

靠人去遵守規范來控制工作流,總會有失誤、疏忽的發生。

想法

要靠機器和代碼去規范工作流,提高效率、準確性,實現真正的前端工程化。

具體目標

不討論通用模板(項目開發層面),只關心構建以后的事情,精確的說,就是從npm run build:xxx 這個腳本開始對接,npm run build:xxx之前的事情不在本文討論范圍內。 實現構建-部署-測試(多個環境)-沙箱-上線(可回滾)的全部半自動化流程把控。

為什么選擇jenkins:優先選擇強大的開源工具,避免重復造輪子,主要原因是插件特別豐富,基本可以滿足所有實際需求

先把成果貼上來,整體示意圖

核心思想是分離構建、部署,所以每個項目,jenkins會建兩個job。

jenkins服務部署在公司內網堡壘機上,使用tomcat管理jenkins的war包,占用系統服務、全量部署定時任務都跑在同一臺堡壘機上(Linux)。

因為內容很多,所以我直接采用一張圖 + 注釋 來零碎的講解每個功能的實現,因為每個公司的前端業務環境都不一樣,所以我也不打算花太大的筆墨去描述所有的實現。寫這篇文章的目的就是可能某個思想、某一段對jenkins插件的使用等等會幫助到有類似需求的人。注釋會是截圖,或者是關鍵代碼,對應圖中的數字

先放幾張實際使用的圖

jenkins項目界面部分截圖

構建job部分截圖

部署job部分截圖(使用jenkins-pipeline實現流程圖)

多套測試環境占用系統部分截圖(占用環境后別人無法部署,全量腳本也不會覆蓋)

全量部署腳本日志展示部分截圖

整體示意圖的注釋(每一條都對應示意圖中的紅色阿拉伯數字):

  1. 構建和部署分離開來,便于后續的各種操作,比如全量部署、分環境部署、回滾代碼等都是不需要構建操作的,耦合在一起會做很多無用功。
  2. 同上
  3. 一次構建三個包,保證了測試環境和沙箱、線上的構建環境/副作用參數的一致性(用shell腳本實現,具體如何實現不細說,就是循環變量執行npm腳本,shell腳本由git倉庫管理,jenkins配置時統一拉取代碼,這樣所有的項目配置可以同步。示例如下)

4. 下圖展示了部署job可操作的選項

  1. 上圖中有說明
  2. 貼一段jenkinsfile代碼,語法為pipeline script
  3. 原理同6
  4. 占用系統是另外開發的,配套使用,上面有占用系統的示意圖,是用node做后臺,vue+element做前臺快速開發的,這里不展開說;
  5. 這個利用jenkins的Url Auth Plugin,再開發一下對接公司統一登錄系統的api,就可以直接用了,本質上是圍繞cookie來進行的,每個公司都有自己的統一登錄(也可能沒有,那就使用jenkins自帶的用戶系統),這里不展開說。
  6. 全量部署腳本用corntab,用node腳本實現,核心思想在于讀取說明6中的"now_online.json"來得知是哪一個包是線上的,取到這個包,同步到所有測試環境。同時檢測是否有改動,沒改動則跳過;同時檢測說明8中的標記,查明環境是否有人占用,占用也跳過。上面我有貼日志的截圖。
  7. 這里的意思就是,構建任務還沒執行完的時候,打開了部署任務進行部署,此時要檢查一下構建任務是否插入了構建完成的標記,不然不能部署。
  8. 這里是我自認為最大的亮點,“如何保證當前分支上的代碼絕對不落后于master”?我們都知道master上的代碼即是線上最新代碼,當多人協作開發的時候,有人先上線,此時master代碼更新,而后上線的人還在用老的代碼測試、上線,這樣就會造成問題,除了人為保證主動去pull代碼,有沒有更可靠的方式? 這里就是工程化的一大亮點,我們設想,如果后上線的人的分支上有落后于master的代碼,那么我們就不讓jenkins的構建/部署成功! 如何通過代碼實現并整合進jenkins?我研究了一下git的命令,如果執行 git log [你的當前分支]..origin/master 打印了空值,那么說明當前分支沒有落后,如果打印了內容,那么就說明分支落后與master!具體用shell實現示例:
check_results=`git log $branchName..origin/master`
if [[ ! $check_results = "" ]]thenecho "【Error】:當前代碼比master落后,需要合并master或更新代碼重新打包之后才能進行構建!"exit 1elseecho "【info】:當前代碼正常,可以部署!"
fi
復制代碼
  1. 沒太多好說的,打包出來的dist文件夾額外用eslint檢測一下就好,shell腳本實現。
  2. 通過說明6中的pipeline script 中的 input 語法實現
  3. 回滾的關鍵代碼也在說明6中有。

整篇文章比較零散,主要講了一下我對前端工程化探索的思想和實踐,因為手頭的需求也很多(18年一起工作的好幾個小伙伴被裁了,你猜他們剩下的工作誰來做),斷斷續續搞了兩三個月,目前這套系統已經穩定運行幾個月了,不斷的完善使它現在很好用,線上再也不會出現因為忘了某些分支操作導致的bug;這套系統的優點就是,基于開源jenkins+核心思想,就可以很快的通過node/shell/pipelinescript搭建起一套完整的系統,成本極低!超級實用的功能卻實現很多!

如果你覺得讀完沒啥收獲或我寫的實在不知所云,那就好好看看說明12,我覺得把這一個小技巧分享出去,并且讓你有所收獲,那也值了,畢竟寫作能力有限~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280244.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280244.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

業務id轉密文短鏈的一種實現思路

業務場景: 買家通過電商app下單后,會受到一條短信,短信內容中包括改訂單詳情頁面的h5地址連接,因為是出現在短信中,所以對連接有要求:1.盡量短;2.安全性考慮,訂單在數據庫中對應的自…

百度高管:問心無愧

1月23日下午消息,今天下午,百度召開百家號2019內容創作者盛典,百度副總裁沈抖出席并發布演講。 就在前一天,一篇名為《搜索引擎百度已死》的文章刷屏,文中提到百度搜索有一半以上會指向百度自家產品,尤其百…

Vuex 學習筆記

Vuex 是什么? Vuex 是一個專為 Vue.js應用程序開發的狀態管理模式。由于SPA應用的模塊化,每個組件都有它各自的數據(state)、視圖(view)和方法(actions),當項目內容越來越…

xdf文檔怎么轉換為pdf_如何將PDF文件和圖像轉換為Google文檔文檔

xdf文檔怎么轉換為pdfYou probably know you can create and edit documents with Google Docs, but you can edit more than just .doc files. Google Drive can also convert any PDF, JPG, PNG, or GIF into a document with fully editable text. Here’s how. 您可能知道可…

在現代 Windows 上使用經典 Windows 2000、XP、Vista 任務欄

你好,這里是 Dotnet 工具箱,定期分享 Dotnet 有趣,實用的工具和組件,希望對您有用!前言您第一次使用的 Windows 是哪個版本的?我最早使用的 Windows XP,然后再經過 XP、7、8/8.1 、Windows 10&a…

oracle sys可以登錄,system權限不足,解決方法

今天在自己電腦上安裝了oracle 11g,安裝成功后發現 sys 可以正常登錄。system 無法登錄,顯示 ORA-01031: insufficient privileges(權限不足) select * from v$pwfile_users; 查看有sysdba權限的用戶 grant sysdba to system; 給system 授權sysdba權限…

airdroid黑屏_如何使用AirDroid從PC控制Android設備

airdroid黑屏AirDroid for Android replaces your USB cable for connecting to your PC. Transfer files back and forth, send text messages, play music, view your photos, and manage applications using a web browser or a desktop client. 適用于Android的AirDroid取代…

分析java程序

2019獨角獸企業重金招聘Python工程師標準>>> 最近公司的一個賬單推送的服務,發現有延遲。我排查的時候發現,有一個程序日志不動了(采用消息隊列,部署了兩臺服務器來負載均衡)。 網上說: jstack …

環境部署(九):linux下安裝python+chrome+Xvfb

在基于selenium進行的UI自動化測試中,開發調試環境一般都是windows操作系統。完成后需要部署到專門的測試環境。 如要要部署到linux環境的服務器(阿里云、騰訊云)執行,那么測試腳本也需要對應的瀏覽器支持, 才能正常進…

地理圍欄_什么是“地理圍欄”?

地理圍欄The term is popping up more frequently in news articles, appearing in product manuals, and highlighted as a feature in tons of mobile applications, but what exactly is geofencing? Read on as we explain what it is, why it’s appearing in more produ…

219. 單頁應用 會話管理(session、cookie、jwt)

原文鏈接:https://github.com/ly525/blog... 關鍵字:http-only, cookie,sessionid, vue-router, react-router, 安全,localStorage, jwt 需求描述 內部管理平臺,需要用戶登錄之后才能訪問。現在將 該平臺地址(www.xxx.…

(原+譯)使用numpy.savez保存字典后讀取的問題

轉載請注明出處: http://www.cnblogs.com/darkknightzh/p/7608928.html 參考網址; https://stackoverflow.com/questions/22315595/saving-dictionary-of-header-information-using-numpy-savez python中,使用pickle保存變量時,如果變量過大&…

NLog 通過http保存日志

簡介NLog是一個基于.NET平臺編寫的類庫,我們可以使用NLog在應用程序中添加極為完善的跟蹤調試代碼。 NLog是一個簡單靈活的.NET日志記錄類庫。通過使用NLog,我們可以在任何一種.NET語言中輸出帶有上下文的(contextual information&#xff09…

嵌套映射

1. 多對一嵌套查詢映射使用案例 package com.zixue.dao;import com.zixue.annotation.MyBatisRepository; import com.zixue.entity.Emp;/*** 員工表的DAO組件* */ MyBatisRepository public interface EmpDao {void save(Emp emp);Emp findById(int id);Emp findById2(int id)…

gopro dataset_如何將GoPro安裝到DSLR相機

gopro datasetIf you have a DSLR camera with a hot shoe, it’s easy to attach various flashes and other accessories right to your camera. But with a couple of cheap attachments on hand, you can mount your GoPro to your DSLR camera as well. 如果您的DSLR相機帶…

音頻 m4a 轉 wav

背景最近做智能家居,需要用到一些應答詞 需要自己錄制。但是在mac下面通過 QuickTime 錄制的是 m4a格式。但是應答詞需要 wav格式。所以就需要轉化了解決方法# sox 不行, ffmpeg 很麻煩,用 avconv 很簡單。安裝 如果沒有就安裝 # apt-get ins…

jQuery已經過時了,還需要學嗎?

說起jQuery,很多剛參加工作的程序員都沒用過,甚至沒聽過。曾幾何時jQuery可是秒殺一切Js庫,大有一統江山的情況,可是在頂峰的時候,瞬間被Vue、React、Angela三大框架斬于馬下。從百度指數,我們也看出在2015…

Bootstrap01

Bootstrap01內容概要 一.使用Bootstrap的步驟 1.下載Bootstrap類庫,包含三個部分,fonts,css,Bootstrap 2.導入項目中,在頭部引入JQ,css和Bootstrap 注意:JQ要引入在Bootstrap前面! 3.使用css樣式時,全部使用class屬性 二.全局CSS概要 1.僅支持H5文檔格式 2.移動設備優先,需要在…

ios raise_如何在iOS 10中關閉“ Raise to Wake”

ios raiseRaise to Wake is a new Lock screen feature available in iOS 10. It allows you to wake your phone’s screen simply by picking up your phone. This feature is on by default, but if you’d rather not use it, it’s simple to turn off. “喚醒”是iOS 10中…

資源調度器調研

2019獨角獸企業重金招聘Python工程師標準>>> 場景描述: 異步觸發和Crontab觸發 YARN(Yet Another Resource Negotiator)Hadoop 資源管理器 主要構成: RM(ResourceManager)是一個全局的資源管理器,負責整個系統的資源管理和分配。…