“DevOps”一詞是由英文 Development(開發)和 Operations (運維)組合而成,但它所代表的理念和實踐要比這廣闊的多。DevOps 涵蓋了安全、協作方式、數據分析等許多方面。但它是什么呢?
DevOps 強調通過一系列手段來實現既快又穩的工作流程,使每個想法(比如一個新的軟件功能,一個功能增強請求或者一個 bug 修復)在從開發到生產環境部署的整個流程中,都能不斷地為用戶帶來價值。這種方式需要開發團隊和運維團隊密切交流、高效協作並且彼此體諒。此外,DevOps 還要能夠方便擴展,靈活部署。有了 DevOps,需求最迫切的工作就能通過自助服務和自動化得到解決;通常在標准開發環境編寫代碼的開發人員也可與 IT 運維人員緊密合作,加速軟件的構建、測試和發布,同時保障開發成果的穩定可靠。
當然,這意味着更改代碼會更頻繁,基礎架構的使用也會更靈活。所以傳統的管理策略無法滿足這種需求。您也需要應勢而變,贏得先機。
DevOps是一個循環遞進的過程。通過文化的指引,打造符合當前組織和文化的相關工具鏈,固化協作的規范、流程;然后隨着工具落地、實踐推廣,促使組織更快地發展和改進產品,從而進一步加強協作文化和方式。
1、概述
1.1 現有上線流程描述
隨着DevOps
在公司的不斷實踐落地,基於環境現狀,目前已經發展成較為成熟和穩定的工作流。負責DevOps
建設的團隊目前的工作是內部Ops
平台開發和不斷發現挖掘內部人員的需求以進一步優化。得益於容器以及k8s
相關技術使得業務穩定性提高,基於Jenkins Pipeline
流水線的任務構建及各類環境的部署發布也變得容易,Prod
生產環境和Pre
預生產環境的上線發版還是由測試或運維人員負責在平台進行點擊和確認發布。
1.2 釘釘OA審批與生產上線的結合
在企業溝通協作軟件的應用中,除了很少企業有足夠的能力、成本用來自建即時通訊或完全內網環境下的通訊軟件,大部分企業中基本都是以常用的企業溝通協作軟件為主,例如騰訊系的企業微信、阿里系的釘釘、字節跳動的飛書等等。
可以參考我之前的文章JenkinsShareLibrary實踐之自定義釘釘通知器
以釘釘為例,釘釘的OA
審批是一個常用的工具,其自帶的應用場景包含請假、調休、加班、用印申請等等。
由於對協作軟件釘釘的“重度依賴”,加上內部運維相關平台中還沒有成熟的審核上線機制,因此作為一個DevOps er
,將釘釘OA
審批與DevOps
工作流中的生產上線流程進行結合是我很想做的。
近期通過對釘釘OA
審批功能的調研,發現釘釘產品大約在2020
年12
月上線了叫做系統集成
的功能,下面是來自釘釘關於系統集成
的介紹
系統集成是新型的雲集成服務,利用統一的數據模型和編排引擎,通過配置化快速實現釘釘與外部系統的集成對接,將企業不同系統整合到統一平台,享受釘釘高效移動辦公體驗。
借助釘釘系統集成服務,企業可以打通釘釘審批與釘釘其他官方應用、SaaS應用以及企業內部應用,目前系統集成示例包含智能人事、用友U8、金蝶、SAP等。
簡單來說,釘釘OA
給我們開放了一個系統集成
(也叫做連接器)的功能,這個功能能夠實現釘釘OA
審批單與釘釘外部系統的對接,從而實現不同系統間的數據整合,進一步提高辦公效率。
經過調研,這個功能是收費的(盡管是收費,但相比花費在雲廠商的服務器費用只能算是九牛一毛),這個功能叫做OA
審批高級版,可以在正式使用前以企業身份申請短期試用。
2、總體實現思路
借助釘釘OA
自定義審批,讓提交人例如測試人員發起上線審批,將相關上線信息填寫在審批單中,然后提交到審批人,例如部門領導、項目經理等人員進行審批,審批通過后由程序自動執行上線發版操作。對於相關上線的信息,當然還是要以直觀的、能夠進行選擇的更為友好,因此審批單中的部分上線信息需要借助調用外部接口生成。
這里以Jenkins
工具為例,前提條件是我們已經有了穩定和對業務環境來說較為完善的發版上線流水線(其中包含各種常用參數化構建、發布類型等等),Jenkins
的相關API
中,RESTful
風格的API
最為通用。通過API
相關方法獲取Jenkins
上的Job
信息、Job
的構建參數相關信息、提供到OA審批單讓用戶進行選擇,這就和在Jenkins
上進行參數化構建是一樣的。
3、流程描述
3.1 泳道圖
這里以本不專業的畫圖功底簡要畫了個泳道圖(如果哪里不對,歡迎留言指出)
3.2 流程描述
按照上面的泳道圖簡要進行描述:
- 自定義的接口程序從
Jenkins
服務器獲取所有正常可用的Job
相關信息(名稱、發布參數、發布類型等),組裝成特定的數據格式提供給OA
審批表單連接器 - 連接器請求接口並接收入參,將數據映射到自定義的
OA
表單 - 發起人按照格式填寫審批單
- 審批單進行基礎校驗,首先根據用戶選項判斷是否有數據庫變更,如果有數據庫變更但未完成則提示用戶先進行數據庫變更再發起審批,如果審批人確認沒有數據庫變更,提交給審批人
- 審批人進行審批,審批通過后提醒審批發起人審批通過並將數據提交到接口程序
- 接口程序根據解析出來的請求參數,入庫記錄並調用
Jenkins API
進行觸發 Job
開始運行,運行完成后向審批人、發起人發送上線成功的通知
4、關鍵實現
4.1、連接器的創建
首先,重要的一點是要向管理員申請企業釘釘工作台OA
模塊的子管理員操作權限。釘釘后台登錄界面如下
有了權限之后,申請OA
高級版的試用,試用開通后,就能進入到釘釘OA
后台創建連接器了
系統集成分為連接器和集成流兩種,兩者相比后者能定制一些更為復雜的邏輯。對於本文的場景,選擇連接器即可
連接器的創建流程是先輸入連接器名稱和描述創建連接器,然后基於創建的連接器創建動作。當然,也可以給每個動作創建單獨的連接器,每個連接器下僅包含一個動作。
根據上面的泳道圖,整個流程涉及到了兩次連接器的數據交互。其實我這里是三次,表單交互一次,關聯表單一次,最終觸發一次
-
第一個連接器動作:請求外部數據,獲取到可讀的
Job
中文名稱列表,並將數據渲染到表單第一個“項目名稱”單選框 -
第二個連接器動作:根據用戶選擇的“項目名稱”,作為條件再次請求外部數據,獲取到該項目下所有的子
Job
任務名稱並渲染到第二個“應用名稱”單選框 -
第三個連接器動作:將審批通過后,發起人填寫的所有數據提交到接口進行處理
連接器的創建界面,以第一個連接器為例,我這里叫做“加載項目名稱”,需要填寫鑒權方式、接口URL、加密密鑰、請求方式、入參參數、出參參數
4.2、審批單的創建
連接器創建好后,創建OA
審批表單,通過圖形界面可視化低代碼模式進行創建,如下所示
審批單表單設計完成后,需要設計流程設計,即審批流程,我這里有一個表單校驗功能是讓用戶確認是否有數據庫變更,只有在沒有數據庫變更或者已完成變更的情況下,發起人才能提交審批,如下所示
4.3、接口程序開發
(這里也許是所有人關注的重點)由於Jenkins
的API
接口提供的只是一些通用的接口方法,而釘釘OA
審批單由僅限於提交數據發起審批,所以需要開發一個接口程序來處理,接口程序是釘釘OA
審批和Jenkins
服務器之間的橋梁,本文記錄的實踐是以Django REST framework
為基礎技術框架實現的,基於我的應用場景,目前此接口包含的主要核心功能如下:
-
主要獲取
Jenkins
的Job
等信息組裝成特定格式,序列化后提供給釘釘OA
連接器 -
接收連接器
POST
過來的“項目名稱”,返回項目下的所有“應用名稱” -
接收連接器最終
POST
過來的表單數據,進行校驗 -
根據數據判斷是立即觸發還是定時觸發
Jenkins
執行構建 -
數據的緩存與入庫記錄等等
這里有個小坑,自動觸發
jenkins
流水線執行並不難,但我的流水線之前定義了在構建后還需要接收用戶input
的步驟,想要自動繞過或自動input
需要一點小技巧,這個下次再聊
由於篇幅有限,這里也就不多展開,后面有機會的話會將此接口程序開源,這里僅僅進行介紹和簡要分析。
5、小結
到這里,基於釘釘OA
審批流完成自動化上線發布操作就完成了,帶來的好處多多:統一了相關人員常用的協作平台、在正常情況下完全無需運維人員介入,極大提高了工作效率,縮短了上線時間。