(一)前言
對于軟件產品而言,文檔是不可或缺的一環。文檔能幫助用戶快速了解并使用軟件,包括不限于特性概覽、用戶手冊、API手冊、安裝部署以及場景實踐教程等。由于軟件與文檔緊密耦合,面對業務的瞬息萬變以及軟件的飛速迭代,如何敏捷高效開發文檔,是擺在每個軟件公司面前必須攻克的難題。
本文從ZStack文檔實踐出發,圍繞結構化文檔開發、結合實際業務的文檔版本管理策略、文檔DevOps平臺設計思路、實際建設難題與攻克等要點,向大家全面深入介紹ZStack文檔DevOps平臺建設的成功實踐。
(二)結構化文檔開發是前提
在軟件開發領域,“Docs?as?Code”的文檔開發理念已深入人心。該理念的核心思想是將文檔作為代碼的一種形式,將其納入到軟件開發生命周期中。傳統的非結構化寫作缺乏模塊化和標準化機制,很難滿足“Docs?as?Code”高效編寫發布文檔的要求。在此背景下,結構化寫作應運而生,成為解決以上問題的有效方案。
結構化寫作十分重視信息架構設計。DITA作為結構化寫作的國際標準之一,已在業內廣泛使用。DITA(Darwin Information Typing Architecture)最初由IBM公司開發,并在2005年被開放標準組織OASIS收錄為開放標準。作為基于XML的體系結構,DITA通過內容與形式分離、內容重用、過濾與定制等機制,充分實現文檔開發的靈活性和標準性。
圖1. DITA的特點
1.內容與形式分離
DITA按模塊組織文本內容,支持DITAMAP、TOPIC、LABEL等不同層級的模塊化。
- DITAMAP:DITAMAP是一本文檔的框架,定義文檔中包含哪些TOPIC以及TOPIC的組織形式。
- TOPIC:TOPIC是一個完整的主題或章節。DITA提供了適用于不同場景的多種TOPIC類型,例如:Concept、Task、Troubleshooting、Reference,并通過DTD規定這些TOPIC的基本架構(即規定TOPIC必須或只能包含哪些LABEL),從而保證同類型主題/章節的規范性和風格一致性。
- LABEL:LABEL是TOPIC中的標記對,通常是組成一個TOPIC的各種元素,包括段落、句子、短語、表格、列表、圖片等。
在文檔開發階段,開發者按照規范,逐級組織DITAMAP和TOPIC架構,并在LABEL層級進行內容編寫。這樣,既保證了開發者始終在框架規范內進行創作,也使得最終輸出的文檔層次分明。
圖2. TOPIC DTD
2.內容重用
DITA支持以模塊為單位進行不同粒度的內容重用。DITAMAP、TOPIC、LABEL均適用重用機制。
- DITAMAP重用:將一個DITAMAP A嵌套到另一個DITAMAP B。這樣,DITAMAP B可以重用DITAMAP A的全部內容。
- TOPIC重用:一個TOPIC可以拖動到多個DITAMAP中。這樣,多本文檔可以重用相同的章節內容。
- LABEL:一個LABLE可以引用到多個TOPIC中。這樣,多個章節可以重用相同的句子、表格或圖片。
在文檔迭代過程中,重用機制既減少了重復勞動也保證了文檔內容一致性。一旦重用來源被修改,所有引用均會被更新。在ZStack技術文檔中,產品名稱、產品版本、術語等均以重用的形式出現在各個文檔、各個章節。一旦發生變動,這些被廣泛使用的內容可“牽一發而動全身”。
圖3. TOPIC重用
3.過濾與定制
在文檔發布階段,配置文件DITAVAL和DITA-OT決定了輸出文檔的內容和樣式。通過調整DITAVAL和DITA-OT,基于同一本DITAMAP可以發布不同內容、不同格式、不同風格的文檔,面對多樣化的業務需求和發布渠道可實現靈活定制。
- DITAVAL:DITAVAL用于對文檔內容進行條件過濾。開發者可以在DITAVAL中定義某個標簽在輸出文檔中被剔除/包含,并給需要過濾的TOPIC、LABEL標記對應的標簽。在文檔輸出過程中,DITAVAL自動識別標簽,使對應的內容最終被呈現/隱藏,實現不同業務場景下的文檔內容定制。
- DITA-OT:DITA-OT用于定義文檔發布樣式,包括文檔格式、封面、字體、字號、顏色、頁眉、頁腳等。靈活配置DITA-OT,可使文檔輸出為多種格式(PDF、HTML等)以配合不同的發布渠道,或改變文檔樣式風格,實現多樣化定制需求。
ZStack基于DITA構建了龐大的結構化文檔庫,總文字規模超過千萬級。由于高度模塊化和標準化,為實現文檔DevOps奠定了堅實基礎。
圖4.?結構化文檔庫
(三)結合實際業務的文檔版本管理策略
ZStack文檔庫采用GIT倉庫托管,通過GIT機制實現文檔版本控制。
在軟件開發領域,GIT是一種被廣泛使用的分布式版本控制系統。開發者在本地完成工作,通過Commit、Push操作提交至遠端,并通過Pull操作獲取遠端更新。GIT提供強大的分支管理功能,開發者可依據業務需要,靈活創建獨立分支,每個分支專注于特定任務,互不沖突。必要時,可通過分支合并實現內容匯總。
以ZStack Cloud技術文檔開發為例,在新版本開發之初,開發者基于穩定的主分支(Master Branch)開出多個特性分支(Feature Branch),并在特性分支進行獨立開發,各特性分支穩定后全部并入主分支。期間,可按需開出Bugfix分支修復問題,還可靈活響應定制項目插隊,隨時開出定制分支(Customized Branch)進行定制開發。最終,基于主分支評估開出合適的發布分支(Release Branch),用于最終發布。
圖5. ZStack?Cloud文檔分支管理
由上可見,ZStack文檔庫具備與代碼庫緊耦合的開發管理能力,同時也為實現文檔DevOps奠定了又一個堅實基礎。
(四)ZStack文檔DevOps平臺整體設計思路
由于ZStack文檔庫已實現結構化和版本控制,因此實現文檔CI/CD,建設一體化文檔DevOps管理平臺順理成章照進現實。
在軟件開發領域,CI/CD是一種通過自動化流程實現代碼持續集成、測試和部署的軟件開發實踐,旨在快速、可靠地交付高質量應用。文檔CI/CD則是通過自動化流程對結構化文檔庫進行批量構建、存儲、回傳,從而實現文檔的快速、可靠、高質量、一體化交付。
ZStack文檔DevOps平臺基于微服務架構設計,依托ZStack Cloud云平臺與Kubernetes(K8s)實現服務的容器化部署與動態編排,并通過微服務間的協同調度,完成從任務發起到構建、存儲、回傳的全流程自動化閉環。
圖6.?整體設計框架
1.安全機制
- 內外網反向代理
將內網Flask代理服務器端口映射到外部端口上,以供輕流訪問。實現網絡隔離,確保內部服務僅通過API暴露,外部請求需經反向代理驗證。
2.API層
- Flask代理服務器
負責初步處理請求、對請求的參數做初步解析、觸發CI/CD構建任務、獲取構建記錄。
- 可視化編譯管理界面
文檔發布者可在該界面維護文檔映射,按需觸發CI/CD構建任務。
3.基礎設施層
- DevOps集群
內部生產環境管理平臺,用于集成CI/CD流水線。
- Jenkins K8s集群
負責以任務為單位,執行文檔構建。
- 數據庫
保存任務的執行參數,執行記錄以及相關Metadata。
4.任務執行層
- 請求參數處理
請求參數標準化:將輕流傳入參數做統一處理和檢查,對不合規參數進行修改或過濾,對合規參數做預處理,以供后 續操作使用。
- 工作區分配
文檔代碼隔離:通過工作區(Workspace),管控代碼分支,同時實現代碼隔離。
- 文檔參數處理
DITA參數修改:針對不用的文檔構建需求,動態修改相關DITAVAL/DITA-OT文件參數。
- 文檔構建
日志整理及輸出:根據DITA-OT構建文檔時輸出的日志,判斷構建是否成功。同時結合構建參數和相關DITAVAL/DITA-OT文件,標準化、結構化輸出日志。最后對任務的所有日志進行匯總、可視化輸出。
文檔交付件構建:通過DITA-OT構建文檔,將最終交付件輸出到MINIO對象存儲上。
(五)ZStack文檔DevOps平臺實際建設難題與攻克
1.批量構建的配置沖突
為確保文檔構建效率及規范化,對文檔構建申請以任務為單位。一個構建任務支持批量構建多本文檔,這也就不可避免會出現多本文檔使用同一個DITAVAL/DITA-OT文件,且對文件內參數需求不同。
引入工作區(Workspace)的概念,從文檔交付件維度,將不存在配置沖突的文檔構建請求放在同一工作區內,同一工作區內使用同一套DITAVAL/DITA-OT文件。在構建文檔時,按序構建每一個工作區的文檔。
2.配置文件的動態維護
DITAVAL/DITA-OT文件內相關參數由實際業務決定(如產品線名稱、文檔廠牌等),隨著業務變化,參數內容必須是動態變化、易于維護的。平臺采用一個獨立配置文件集中維護相關參數,這樣一來,當業務變化觸發參數變化時,能盡可能減少對CI/CD代碼的修改。
此外,平臺將DITA-OT文件放在一個特殊分支上維護,當構建文檔需調用時,只需對工作區內的DITA-OT文件進行替換。同樣地,當業務變化觸發參數變化時,能盡可能減少對現行分支代碼的影響。
3.文檔構建的日志分析
一次文檔構建任務可能生成大量不同文檔,若整體任務失敗,或任務中某些文檔出現問題,文檔工程師面對龐大的文檔日志,分析定位問題十分不便。
平臺對日志文件進行總結、可視化輸出。當文檔構建任務完成后,自動將所有日志進行總結,統計所有日志的編譯輸出,將使用同一套DITAVAL/DITA-OT文件的文檔構建進行整合記錄,最后輸出匯總、可視化的日志報告。
(六)ZStack文檔DevOps平臺價值
1.統一管理、直觀便捷
ZStack文檔DevOps平臺為文檔編譯發布提供統一的可視化管理界面,文檔發布者可一站式維護文檔映射、創建編譯任務,跟進編譯進程及結果。對于構建失敗的任務,可直接查看可視化日志,快速定位問題。
圖7.?集中管理文檔映射
圖8.?集中管理編譯任務
圖9.?可視化日志
2.性能強勁、提效顯著
平臺運行在DevOps集群環境上,提供強大的計算支持和靈活的資源調配,大幅縮短文檔編譯時間,面對大規模批量編譯任務,優勢尤為明顯。以ZStack Cloud全量文檔發布為例,相較于本地編譯,平臺編譯耗時縮短50%以上。
此外,針對定制化文檔場景,平臺直接對接輕流業務接口,業務人員提交定制需求后,系統全程自動完成定制開發、編譯和交付,人工僅需關注構建失敗的任務,分析失敗原因并解決。
(七)結束語
工作流程優化是提升企業效率的重要一環。ZStack文檔一直致力于敏捷高效的文檔開發管理探索與實踐。在科技迅猛發展的今天,如何擁抱新技術,創新構建最適合自身業務的工具鏈,并策略性運用到工作實踐中,提升生產力和效率,是現代企業工作者的重要挑戰。我們一起共勉。(聯合作者:潘玲、程楚喬、王幀頤)