基于 Jenkins Pipeline 實現 DITA 文檔自動化構建與發布(開源方案)

這是我最近開發的一個基于 Jenkins Pipeline 的 DITA 文檔自動化構建方案。對于需要維護大量 DITA 格式文檔的團隊來說,手動構建不僅效率低下,還容易出現版本不一致的問題。通過這套開源方案,我們可以實現代碼拉取、多地圖并行構建、結果歸檔與報告發布的全流程自動化,希望能幫到有類似需求的程序猿,在看之前可以去了解一下 GitHub Actions

為什么需要 DITA 文檔自動化構建?

DITA(Darwin Information Typing Architecture)作為一種基于 XML 的文檔結構化標準,廣泛用于技術文檔、用戶手冊等場景。但手動執行 DITA-OT(DITA Open Toolkit)構建命令存在不少痛點:

  • 重復勞動:每次代碼更新都需要手動觸發構建
  • 效率低下:多份文檔需依次構建,耗時較長
  • 環境不一致:不同開發者本地環境路徑、配置差異可能導致構建失敗
  • 結果難追溯:構建產物分散,不方便團隊共享查看

而通過 Jenkins Pipeline 自動化構建,能完美解決這些問題 —— 統一環境、自動觸發、并行構建、集中管理產物,大幅提升團隊協作效率。

方案準備:環境與工具

在開始前,我們需要準備這些基礎組件:

  1. 基礎環境

    • JDK 17(DITA-OT 運行依賴,需記錄安裝路徑)
    • Oxygen XML Editor(內置 DITA-OT,需找到其DITA-OT目錄路徑,通常在Oxygen XML Editor X.X\frameworks\dita\DITA-OT
    • DITA-OT(如果你的 OXE 木有內置的 DITA-OT,就要去官網下載)
  2. Jenkins 插件(前提先有 Jenkins)
    需管理員(如果你是個人,那你就一個人整吧)在 Jenkins 中安裝以下插件(均為開源插件,可從 Jenkins 官方倉庫獲取):

    • Git Plugin:用于從遠程倉庫拉取 DITA 文檔代碼
    • Pipeline:支持編寫自動化腳本(Jenkinsfile)
    • HTML Publisher Plugin:發布構建生成的 HTML 文檔,方便在線查看

step-by-step:從零搭建自動化流程

1. Jenkins 全局配置

首先讓管理員(如果你是個人,那你就一個人整吧)配置 JDK 17(全局工具配置):
進入 Jenkins 首頁 → 系統管理 → 全局工具配置 → JDK,添加 JDK 17 并填寫安裝路徑。建議團隊統一 JDK 路徑,后續可共用 Jenkinsfile,避免路徑適配問題。

2. 創建 Pipeline 任務

在 Jenkins 中新建任務,選擇 “Pipeline” 類型,然后配置源代碼管理:

  • 進入任務配置 → Pipeline 部分 → Definition 選擇 “Pipeline script from SCM”
  • SCM 選擇 Git,填寫遠程倉庫地址(例如https://github.com/your-repo/dita-docs.git),并指定分支(如 main)

3. 核心:編寫 Jenkinsfile(開源腳本)

在代碼倉庫根目錄創建Jenkinsfile,這是自動化流程的核心腳本。以下是完整腳本及關鍵步驟解析:

?pipeline {agent anyenvironment {// 配置Oxygen內置DITA-OT路徑(根據實際環境修改)DITA_OT = 'C:\\...\\DITA-OT'// DITA地圖文件(.ditamap)所在目錄MAP_DIR = './map'// PDF自定義模板路徑PDF_TEMPLATE = './pdf/custom.xsl'// HTML自定義樣式路徑HTML_CSS = './html/custom.css'}stages {stage('Checkout') {steps {// 從遠程倉庫拉取最新代碼git branch: 'main', url: 'https://github.com/your-repo/dita-docs.git'}}stage('Discover Maps') {steps {script {// 自動發現所有.ditamap文件(支持子目錄)def mapFiles = bat(script: 'dir /b /s %MAP_DIR%\\*.ditamap', returnStdout: true).trim().split('\r\n')// 存儲地圖文件列表到環境變量,供后續階段使用env.MAP_FILES = mapFiles.join(',')echo "找到 ${mapFiles.size()} 個DITA地圖文件"// 打印發現的地圖文件(調試用)for (mapFile in mapFiles) {echo "地圖文件: ${mapFile}"}}}}stage('Build All Maps') {parallel {// 并行構建每個地圖文件(提升效率)script {def mapFiles = env.MAP_FILES.split(',')def parallelStages = [:]for (mapFile in mapFiles) {// 提取地圖文件名(用于輸出目錄命名)def mapName = mapFile.tokenize('\\')[-1].replace('.ditamap', '')parallelStages[mapName] = {stage("Build ${mapName}") {steps {echo "開始構建地圖: ${mapFile}"// 創建PDF和HTML輸出目錄bat "mkdir output\\${mapName}\\pdf"bat "mkdir output\\${mapName}\\html"// 構建PDF文檔(使用自定義模板)bat """${DITA_OT}\\bin\\dita.bat -i ${mapFile} -f pdf -o output\\${mapName}\\pdf -Dargs.xsl.custom=${PDF_TEMPLATE}"""// 構建HTML5文檔(使用自定義樣式)bat """${DITA_OT}\\bin\\dita.bat -i ${mapFile} -f html5 -o output\\${mapName}\\html -Dargs.css=${HTML_CSS}"""// 歸檔構建產物(PDF和HTML)archiveArtifacts artifacts: "output/${mapName}/pdf/*.pdf", fingerprint: truearchiveArtifacts artifacts: "output/${mapName}/html/**/*", fingerprint: true}}}}return parallelStages}}}stage('Publish Reports') {steps {script {def mapFiles = env.MAP_FILES.split(',')for (mapFile in mapFiles) {def mapName = mapFile.tokenize('\\')[-1].replace('.ditamap', '')// 發布HTML報告到Jenkins,方便在線查看publishHTML([allowMissing: true,alwaysLinkToLastBuild: true,keepAll: true,reportDir: "output/${mapName}/html",reportFiles: 'index.html',reportName: "HTML: ${mapName}",reportTitles: mapName])}}}}}post {success {echo '所有地圖構建成功!'}failure {echo '至少有一個地圖構建失敗!'}}
}
腳本關鍵步驟解析:
  • 環境變量(environment):集中配置路徑信息,后續修改只需改這里,方便維護。
  • Checkout 階段:拉取遠程倉庫最新代碼,確保構建基于最新內容。
  • Discover Maps 階段:自動掃描所有.ditamap 文件,無需手動指定,支持文檔數量動態變化。
  • Build All Maps 階段:通過并行(parallel)構建多個地圖文件,大幅縮短總耗時;同時生成 PDF 和 HTML 兩種格式,并使用自定義模板和樣式。
  • Publish Reports 階段:將 HTML 結果發布到 Jenkins,團隊成員可直接在 Jenkins 頁面查看,無需下載。
  • post 部分:構建結束后輸出結果狀態,方便快速判斷是否成功。

4. 配置自動觸發

為了實現 “代碼更新后自動構建”,可在 Jenkins 任務配置中設置定時檢查:

  • 進入任務配置 → Build Triggers → 勾選 “Build periodically”
  • 填寫 Cron 表達式,例如*/30 * * * *(每 30 分鐘檢查一次代碼更新,有變化則觸發構建)。

5. 執行與驗證

  1. 點擊任務頁面的 “Build Now” 手動觸發第一次構建,在 “控制臺輸出” 中查看實時日志,確認各階段是否正常執行。
  2. 構建成功后,可在左側 “HTML reports” 中查看生成的 HTML 文檔,在 “Artifacts” 中下載 PDF 文件。

注意事項(避坑指南)

  1. 路徑正確性DITA_OTMAP_DIR等路徑需根據實際環境修改(Windows 用\,Linux/macOS 用/)。
  2. 項目結構:確保倉庫目錄結構與腳本一致(map 目錄放.ditamap,pdf/html 目錄放自定義模板)。
  3. 權限問題:Jenkins 服務需有訪問 JDK、DITA-OT 目錄及代碼倉庫的權限(團隊則聯系管理員配置)。
  4. 并行構建資源:若地圖文件過多,并行構建可能消耗較多資源,可根據服務器性能調整并行數量。

總結

這套基于 Jenkins Pipeline 的 DITA 文檔自動化方案完全開源,核心腳本(Jenkinsfile,使用 Groovy 寫的聲明式流水線腳本)可直接復用并根據團隊需求修改。通過自動化構建,我們能減少 80% 的手動操作,同時保證文檔構建的一致性和可追溯性。

如果你的團隊也需要實現 DITA 文檔發布自動化,不妨試試這個方案,歡迎在評論區交流改進建議!

開源聲明

1. 許可證說明

本文中提供的 Jenkins Pipeline 腳本(Jenkinsfile)、自動化流程設計及相關配置示例,采用 MIT License 開源。
你可以自由地:

  • 復制、使用、修改本方案的代碼和流程;
  • 將本方案用于個人、商業或開源項目;
  • 分發或二次開發本方案的衍生作品。

前提條件:在所有副本或重要衍生部分中,需保留原始版權聲明和本許可證說明。
MIT 許可證全文可參考:The MIT License – Open Source Initiative

2. 版權歸屬

? 2025 作者:Allenliu_Andy。
本文及包含的代碼示例、流程設計等內容的版權歸作者所有,未經許可不得擅自移除或修改本版權聲明。

3. 免責聲明

本方案及代碼僅為示例參考,基于特定技術環境(JDK 17、Oxygen XML Editor、Jenkins 及插件等)開發。盡管已盡力確保內容的準確性和可用性,但不對以下內容做任何明示或暗示保證:

  • 方案在所有環境中的兼容性;
  • 代碼無缺陷或錯誤;
  • 使用本方案產生的任何直接 / 間接結果(如數據丟失、業務影響等)。

使用提示:在生產環境使用前,請務必根據自身場景測試驗證,作者不對因使用本方案導致的任何損失承擔責任。

4. 第三方依賴說明

本方案的實現依賴以下開源工具 / 組件,其使用需遵循各自的開源許可證:

  • Jenkins 及插件(Git Plugin、Pipeline、HTML Publisher Plugin 等):遵循 MIT License;
  • DITA-OT(DITA Open Toolkit):遵循 Apache License 2.0;
  • Oxygen XML Editor:本文僅涉及對其內置 DITA-OT 的路徑引用,其軟件許可請參考 Oxygen 官方條款。

使用本方案即表示你同意遵守上述第三方工具的許可條款。

5. 貢獻與引用規范

  • 歡迎通過 issue 或代碼提交提出改進建議,所有貢獻內容將默認采用與本方案相同的 MIT License 授權;
  • 若將本方案或代碼用于公開文檔、項目或產品中,請注明原始來源(如:參考自 Allenliu_Andy 的《基于 Jenkins Pipeline 實現 DITA 文檔自動化構建與發布(開源方案)》)。

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

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

相關文章

reinterpret_cast and static cast

什么時候使用 reinterpret_cast&#xff1f;指針類型之間的轉換&#xff1a; 當需要將一種類型的指針轉換為另一種類型的指針時&#xff0c;可以使用 reinterpret_cast。例如&#xff1a;int* intPtr new int(10); void* voidPtr reinterpret_cast<void*>(intPtr); // …

自動化運維 | 樂維8.0安裝及簡單使用

文章目錄1.創建虛擬機2.安裝樂維8.03.Web界面登錄訪問4.添加第一個監控在文章的開頭需要感謝樂維帶來這么好的自動化運維系統提供我們學習參考或是在生產環境中進行使用&#xff0c;并附上樂維官網供大家參考和學習&#xff1a;https://www.lwops.cn/1.創建虛擬機 在VMware wo…

無印良品:回歸本質的管理哲學

一、底層管理哲學 First, the underlying management philosophy核心思想&#xff1a;「無印」即「無品牌標識」&#xff0c;回歸產品本質Core idea: "Muji" means "no brand logo", returning to the essence of products.拒絕過度營銷&#xff0c;靠產品…

Redis面試精講 Day 13:Redis Cluster集群設計與原理

【Redis面試精講 Day 13】Redis Cluster集群設計與原理 開篇 歡迎來到"Redis面試精講"系列第13天&#xff0c;今天我們將深入探討Redis Cluster的集群設計與實現原理。作為Redis官方提供的分布式解決方案&#xff0c;Redis Cluster是面試中必問的高頻考點&#xff…

LangChain-Unstructured 基礎使用:PDF 與 Markdown 處理解析

文章目錄LangChain-Unstructured 基礎使用&#xff1a;PDF 與 Markdown 處理解析一、核心依賴與庫說明二、核心類與方法詳解1.UnstructuredLoader&#xff08;1&#xff09;類原型與核心功能&#xff08;2&#xff09;初始化參數詳解&#xff08;3&#xff09;核心方法詳解① l…

uboot使用指南

1.uboot的分類本節是 uboot 的使用&#xff0c;所以就直接使用正點原子已經移植好的 uboot&#xff0c;這個已經放到了開發板光盤中了&#xff0c;路徑為&#xff1a;開發板光盤->1、程序源碼->3、正點原子 Uboot 和 Linux 出廠源碼->uboot-imx-2016.03-2.1.0-ge468cd…

學習率預熱總結

學習率預熱是什么&#xff1f; 學習率預熱&#xff08;Learning Rate Warmup&#xff09; 是一種在深度學習訓練初期逐漸增加學習率的策略。其核心思想是&#xff1a;在訓練開始時使用較小的學習率&#xff0c;逐步增加到目標學習率&#xff0c;以避免模型參數在初始階段因學習…

初識SYSCFG(System Configuration Controller)寄存器映射

SYSCFG&#xff08;System Configuration Controller&#xff09;寄存器映射的詳細說明&#xff0c;以 STM32&#xff08;如 F1/F4/F7 系列&#xff09;為例。SYSCFG 控制器用于系統級配置&#xff0c;如外部中斷映射、存儲器重映射等。SYSCFG 寄存器映射概述 基地址&#xff1…

《P3403 跳樓機》

題目背景DJL 為了避免成為一只咸魚&#xff0c;來找 srwudi 學習壓代碼的技巧。題目描述Srwudi 的家是一幢 h 層的摩天大樓。由于前來學習的蒟蒻越來越多&#xff0c;srwudi 改造了一個跳樓機&#xff0c;使得訪客可以更方便的上樓。經過改造&#xff0c;srwudi 的跳樓機可以采…

【GPT-OSS 全面測評】釋放推理、部署和自主掌控的 AI 新紀元

目錄 一、背景與意義 二、核心參數對比 三、性能評測&#xff08;Benchmark&#xff09; 四、硬件適配與優化 五、安全性與風險 六、部署方式 七、適用場景 八、大型語言模型對比表&#xff08;2025 年 8 月版&#xff09; 總結 一、背景與意義 &#x1f4a1; 為什么…

醫療健康Agent:診斷輔助與患者管理的AI解決方案

醫療健康Agent&#xff1a;診斷輔助與患者管理的AI解決方案 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我放…

python魔法屬性__doc__介紹

doc: 魔法屬性。類、函數的描述信息。 __doc__在python中類的使用方法&#xff1a; class Person(object):"""人類---類的描述信息""" # 只能使用多行注釋&#xff0c;單行注釋無效passprint(Person.__doc__)運行結果如圖所示&#xff1a;__d…

PostgreSQL 批量COPY導入優化參數配置

&#x1f4a1; 場景假設我們進行的是 頻繁批量導入、對數據持久性容忍較高 的場景&#xff0c;比如日志表、緩存表、臨時數據表等。如果系統崩潰可重導入&#xff0c;那我們就可以犧牲一點寫入安全性來換極致性能。?? 參數配置推薦&#xff08;postgresql.conf&#xff09;參…

BeanDefinition 與 Bean 生命周期(面試高頻考點)

Bean 是 Spring 應用的核心組件&#xff0c;而 BeanDefinition 作為 Bean 的 “元數據描述”&#xff0c;貫穿了 Bean 從定義到銷毀的全生命周期。理解 BeanDefinition 的加載注冊機制&#xff0c;以及 Bean 的完整生命周期&#xff0c;是掌握 Spring 容器管理邏輯的關鍵&#…

node.js 學習筆記2 進程/線程、fs

進程和線程 進程&#xff1a;進行中的程序。比如有一段程序&#xff0c;程序已經載入內存了&#xff0c;CPU正在執行這段程序&#xff0c;這時候就會產生一個進程。進程&#xff0c;也可以看做程序的一次執行過程。 在window中打開任務管理器&#xff0c;可以查看計算機中的所…

【線性代數】其他

上一節&#xff1a;【線性代數】線性方程組與矩陣——&#xff08;3&#xff09;線性方程組解的結構 總目錄&#xff1a;【線性代數】目錄 文章目錄11. 向量的內積、長度及正交性12. 方陣的特征值與特征向量13. 相似矩陣14. 對稱矩陣的對角化15. 二次型及其標準形11. 向量的內積…

Spring Cloud LoadBalancer 實現自定義負載均衡策略(基于服務元數據篩選)

&#x1f4a1; Spring Cloud LoadBalancer 實現自定義負載均衡策略&#xff08;基于服務元數據篩選&#xff09; 在微服務架構中&#xff0c;我們常常希望對服務實例進行更精細的路由控制&#xff0c;例如&#xff1a; 灰度發布&#xff1a;不同環境訪問不同版本操作系統差異&a…

Javaweb(1)html、css、js

注:圖來自黑馬 一、HTML(超文本標記語言) HTML 是網頁的 “骨架”,負責定義頁面的結構和內容,通過標簽(tag)描述文本、圖片、鏈接等元素。 1. 基礎結構 文檔聲明:<!DOCTYPE html>(告訴瀏覽器這是 HTML5 文檔)。 根標簽:<html> 包裹整個文檔,包含 &l…

MQTT:Dashboard數據集成(待補充)

目錄一、工作原理二、基本使用三、連接器基本使用一、工作原理 數據集成使用sink和source組件與外部數據系統對接。 sink&#xff1a;用于將消息發送到外部數據系統&#xff0c;例如MySQL、Kafka或Http服務等。source&#xff1a;用于從外部數據系統接收消息&#xff0c;例如…