这是我最近开发的一个基于 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;例如…