ZStack文档DevOps平台建设实践

(一)前言

对于软件产品而言,文档是不可或缺的一环。文档能帮助用户快速了解并使用软件,包括不限于特性概览、用户手册、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文档一直致力于敏捷高效的文档开发管理探索与实践。在科技迅猛发展的今天,如何拥抱新技术,创新构建最适合自身业务的工具链,并策略性运用到工作实践中,提升生产力和效率,是现代企业工作者的重要挑战。我们一起共勉。(联合作者:潘玲、程楚乔、王帧颐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git创建分支操作指南

1. 创建新分支但不切换&#xff08;仅创建&#xff09; git branch <分支名>示例&#xff1a;创建一个名为 new-feature 的分支git branch new-feature2. 创建分支并立即切换到该分支 git checkout -b <分支名> # 传统方式 # 或 git switch -c <分支名&g…

package.json 中的那些版本数字前面的符号是什么意思?

1. 语义化版本&#xff08;SemVer&#xff09; 语义化版本的格式是 MAJOR.MINOR.PATCH&#xff0c;其中&#xff1a; MAJOR&#xff1a;主版本号&#xff0c;表示不兼容的 API 修改。MINOR&#xff1a;次版本号&#xff0c;表示新增功能但保持向后兼容。PATCH&#xff1a;修订号…

如何有效防止服务器被攻击

首先&#xff0c;我们要明白服务器被攻击的危害有多大。据不完全统计&#xff0c;每年因服务器遭受攻击而导致的经济损失高达数十亿。这可不是一个小数目&#xff0c;就好比您辛苦积攒的财富&#xff0c;瞬间被人偷走了一大半。 要有效防止服务器被攻击&#xff0c;第一步就是…

Chainlit 快速构建Python LLM应用程序

背景 chainlit 是一款简单易用的Web UI goggle&#xff0c;它支持使用 Python 语言快速构建 LLM 应用程序&#xff0c;提供了丰富的功能&#xff0c;包括文本分析&#xff0c;情感分析等。 这里我们以官网openai提供的例子&#xff0c;快速的开发一个带有UI的聊天界面&#xf…

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品…

【数据结构_6】双向链表的实现

一、实现MyDLinkedList&#xff08;双向链表&#xff09; package LinkedList;public class MyDLinkedList {//首先我们要创建节点&#xff08;因为双向链表和单向链表的节点不一样&#xff01;&#xff01;&#xff09;static class Node{public String val;public Node prev…

做Data+AI的长期主义者,加速全球化战略布局

在Data与AI深度融合的新纪元&#xff0c;唯有秉持长期主义方能真正释放数智化的深层价值。2025年是人工智能从技术爆发转向规模化落地的关键节点&#xff0c;也是标志着袋鼠云即将迎来十周年的重要里程碑。2025年4月16日&#xff0c;袋鼠云成功举办了“做DataAI的长期主义者——…

构建基于PHP和MySQL的解梦系统:设计与实现

引言 梦境解析一直是人类心理学和文化研究的重要领域。随着互联网技术的发展,构建一个在线的解梦系统能够帮助更多人理解自己梦境的含义。本文将详细介绍如何使用PHP和MySQL构建一个功能完整的解梦系统,包括系统架构设计、数据库模型、核心功能实现以及优化策略。 本文源码下…

【桌面】【系统应用】Samba共享文件夹

目录 场景一&#xff1a;银河麒麟桌面与银河麒麟桌面之间共享文件夹 环境准备 实现目标 操作步骤 &#xff08;一&#xff09;配置主机A共享文件夹 1、环境准备 2、在主机A创建共享文件夹 3、设置共享文件密码 &#xff08;二&#xff09;主机B访问主机A 场景二&…

OpenCV 图形API(37)图像滤波-----分离过滤器函数sepFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用一个可分离的线性滤波器到一个矩阵&#xff08;图像&#xff09;。 该函数对矩阵应用一个可分离的线性滤波器。也就是说&#xff0c;首先&a…

webpack理解与使用

一、背景 webpack的最初目标是实现前端工程的模块化&#xff0c;旨在更高效的管理和维护项目中的每一个资源。 最早的时候&#xff0c;我们通过文件划分的方式实现模块化&#xff0c;也就是将每个功能及其相关状态数据都放在一个JS文件中&#xff0c;约定每个文件就是一个独立…

rac环境下,增加一个控制文件controlfile

先关闭节点二&#xff0c;在节点一上操作 1、查看控制文件个数和路径 SQL> show parameter control 2、备份参数文件 SQL> create pfile/home/oracle/orcl.pfile20250417 from spfile; 3、修改控制文件参数 SQL> alter system set contr…

git安装(windows)

通过网盘分享的文件&#xff1a;资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用&#xff0c;所以不用创建。 用vscode&#xff0c;所以这么选择。

Spring Boot整合难点?AI一键生成全流程解决方案

在当今的软件开发领域&#xff0c;Spring Boot 凭借其简化开发流程、快速搭建项目的优势&#xff0c;成为了众多开发者的首选框架。然而&#xff0c;Spring Boot 的整合过程并非一帆风顺&#xff0c;常常会遇到各种难点。而飞算 JavaAI 的出现&#xff0c;为解决这些问题提供了…

Python批量处理PDF图片详解(插入、压缩、提取、替换、分页、旋转、删除)

目录 一、概述 二、 使用工具 三、Python 在 PDF 中插入图片 3.1 插入图片到现有PDF 3.2 插入图片到新建PDF 3.3 批量插入多张图片到PDF 四、Python 提取 PDF 图片及其元数据 五、Python 替换 PDF 图片 5.1 使用图片替换图片 5.2 使用文字替换图片 六、Python 实现 …

山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到

在开发中医知识问答历史对话查看功能的时候&#xff0c;出现了前后端信息获取异同的问题&#xff0c;在经过非常非常非常艰难的查询之后终于解决了这一问题&#xff0c;而这一问题的罪魁祸首就是后端没有setter和getter方法&#xff01;&#xff01;&#xff01;&#xff01;&a…

Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)

目录 应用全局UI状态存储和持久化V2版本 AppStorageV2 connect remove keys 示例 使用限制 PersistenceV2 connect remove keys save notifyOnError 示例 使用限制 Type 使用限制 应用全局UI状态存储和持久化V2版本 以下实例AppStorageV2、PersistenceV2和装饰…

最大子序和问题——动态规划/贪心算法解决

目录 一&#xff1a;问题描述 二&#xff1a;解决思路1——动态规划思想 三&#xff1a;C 语言代码实现 四&#xff1a;复杂度分析 五&#xff1a;解决思路2——贪心算法思想 六&#xff1a;具体步骤 七: C语言代码实现 八&#xff1a;复杂度分析 一&#xff1a;问题描述 …

【Python入门】文件读取全攻略:5种常用格式(csv/excel/word/ppt/pdf)一键搞定 | 附完整代码示例

大家好&#xff0c;我是唐叔&#xff01;今天给大家带来一篇Python文件读取的终极指南。无论是数据分析、办公自动化还是爬虫开发&#xff0c;文件读取都是Python程序员必须掌握的核心技能。本文将详细介绍Python处理5大常用文件格式的方法&#xff0c;包含完整可运行的代码示例…

四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现)

四、小白如何用Pygame制作一款跑酷类游戏&#xff08;页面暂停和主角跑步动作的实现&#xff09; 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 四、小白如何用Pygame制作一款跑酷类游戏&#xff08;页面暂停和主…