在软件研发过程中,代码开发完成并不意味着软件已经具备交付条件。 从代码合并到正式上线,中间通常还要经过编译构建、单元测试、集成测试、安全扫描、制品归档、版本审批和环境部署等多个环节。任何一个环节缺少统一规则,都可能导致代码版本、测试版本和生产版本不一致,甚至出现无法确认某个生产软件包由哪份代码构建而来的情况。 因此,现代集成发布体系需要解决的,并不只是“如何更快地执行构建脚本”,而是如何将需求、代码、测试结果、构建制品、审批记录和部署过程关联起来,形成一条可以重复执行、验证和追溯的软件交付链路。 基于软件工厂理念,Gitee DevSecOps 将代码托管、项目协作、流水线、制品管理、安全扫描和研发度量等能力连接起来,围绕产品版本组织研发活动。其核心思路不是用一个平台替代全部研发工具,而是通过基线版本、自动化流水线、质量门禁和制品流转机制,把分散的研发过程纳入统一的版本上下文中。
一、传统集成发布流程为什么容易失控
不少企业已经开始使用代码仓库、CI/CD 流水线和制品库,但在实际交付中,仍然可能遇到版本关系不清、流程可以绕过、制品来源无法确认等问题。
- 代码版本与交付版本缺少统一关联 研发人员通常通过代码分支、提交记录或 Git Tag 管理代码版本,但测试报告、数据库脚本、配置文件、部署文档和软件包可能仍然分散在不同系统中。 当生产环境出现问题时,团队虽然能够找到部署包,却不一定能够快速回答:
- 这个软件包由哪次代码提交构建?
- 构建时使用了哪些依赖和参数?
- 该版本经过了哪些测试和安全检查?
- 当前部署包是否就是测试阶段使用的软件包?
- 是谁批准该制品进入生产环境? 问题的根源并不是缺少版本号,而是缺少一个能够统一组织交付物料的版本对象。
- 流水线自动化了操作,却没有约束流程 流水线可以自动执行编译、测试和部署,但如果缺少权限控制和质量门禁,使用者仍然可能跳过测试、替换制品,或者将未经批准的构建结果部署到生产环境。 例如,测试人员使用的是流水线生成的制品,但上线时运维人员又从本地重新打包。即使两次构建使用的是同一份代码,也可能因为依赖版本、构建环境和参数不同而产生不同结果。 这说明,自动化并不天然等于可控。流水线还需要和版本状态、审批节点、制品权限及操作日志结合。
- 发布证据分散,问题难以复盘 构建日志可能保存在 CI 系统中,测试报告位于测试平台,制品存放在共享目录,审批记录则存在于办公系统。 这些工具分别完成了局部任务,但没有围绕一次发布形成完整证据链。当需要进行安全审计、质量复盘或故障排查时,团队只能在多个系统之间人工核对信息。
Gitee DevSecOps 软件工厂尝试解决的正是这一问题:以产品和版本为核心,将 Gitee Code 中的代码变更、Gitee Team 中的需求与任务、Gitee Pipe 中的构建过程、Gitee Scan 中的安全检查以及 Gitee Repo 中的制品关联起来。
二、基线版本不是一个标签,而是一组可交付资产
基线版本可以理解为产品在某个阶段形成的、经过确认的稳定状态。 它不仅包含一个版本号或代码标签,还可以关联本次交付涉及的需求、代码、测试用例、测试报告、部署手册、配置文件、数据库脚本和构建制品。 一个相对完整的基线版本通常包括:
本次版本对应的需求、缺陷和变更项;
对应的代码仓库、分支、提交记录或标签;
编译环境、构建参数和第三方依赖;
单元测试、集成测试和安全扫描结果;
最终生成的软件包、镜像或其他制品;
部署说明、配置文件和数据库变更脚本;
评审、审批、出入库及发布操作记录。
与普通 Git Tag 相比,基线版本关注的不是单一代码节点,而是一次完整的软件交付状态。 在 Gitee DevSecOps 软件工厂中,团队可以按照组织、产品和版本建立产品目录,并通过版本视图查看产品的演进过程。研发活动不再只是围绕某个代码仓库展开,而是围绕“本次版本需要交付什么”展开。 例如,一个版本可以依次经历:
开发中
↓
待集成
↓
测试中
↓
待发布
↓
已发布
↓
已归档
每次状态变化都需要满足相应条件。 进入“测试中”前,需要完成构建并生成制品;进入“待发布”前,需要通过测试和安全门禁;进入“已发布”前,则需要完成审批和部署确认。 这种状态驱动的方式,可以将原本写在研发规范中的流程,转化为平台能够执行和检查的规则。
三、Gitee Pipe 负责执行,质量门禁负责判断
在软件工厂中,流水线承担的是标准化任务执行。 以 Gitee Pipe 为例,团队可以将代码拉取、依赖安装、编译打包、单元测试、集成测试、安全扫描、制品上传和环境部署等步骤编排到同一条流水线中。 一条常见的集成发布流水线可能包括:
代码提交
↓
编译构建
↓
单元测试
↓
代码质量检查
↓
依赖与漏洞扫描
↓
生成制品
↓
上传 Gitee Repo
↓
部署测试环境
↓
发布审批
↓
部署生产环境
流水线的价值不仅是减少人工命令,还在于统一构建过程。 当不同项目都使用标准化流水线模板时,编译环境、扫描规则、制品命名和发布步骤能够保持相对一致,降低因为个人操作习惯不同而产生的交付差异。 但流水线只负责执行任务,并不能单独决定当前版本能否进入下一阶段。 这就需要设置质量门禁。 常见的质量门禁可以包括:
- 单元测试通过率是否达到要求;
- 是否存在阻断级代码问题;
- 第三方依赖是否包含高风险漏洞;
- 开源许可证是否符合组织策略;
- 制品是否已经上传到指定仓库;
- 当前发布内容是否经过指定角色审批;
- 操作人员是否具有目标环境权限。 在 Gitee DevSecOps 的组合使用中,Gitee Scan 可以为代码和依赖风险提供检测结果,Gitee Pipe 根据检测结果决定流水线是否继续执行,版本管理模块则根据门禁结果控制版本状态变化。 因此,流水线回答的是“需要执行哪些任务”,质量门禁回答的是“当前结果能否进入下一阶段”。
四、通过三库分离控制制品流转
在配置管理要求较高的组织中,软件资产通常会按照开发库、受控库和产品库进行分级管理。
开发库
开发库用于存放开发和持续集成阶段产生的软件配置项,例如开发版本软件包、测试镜像和中间构建结果。 这一阶段的内容变化频繁,主要面向研发人员和内部验证环境。
受控库
受控库用于存放已经完成一定评审、测试或安全检查的阶段性制品。制品进入受控库后,不应再被随意覆盖。如果后续发现问题,应重新触发构建并生成新版本,而不是直接修改原有软件包。
产品库
产品库用于保存已经完成验收或发布审批、可以用于生产部署或正式交付的制品。 产品库通常需要更加严格的写入权限、审批流程、完整性检查和审计记录。 三库分离的重点并不是建立三个文件夹,而是建立制品的晋级机制:
开发制品
↓
构建与基础检测开发库
↓
测试、安全扫描与审批 受控库
↓
发布评审与完整性确认 产品库
↓
生产部署或正式交付
在 Gitee DevSecOps 软件工厂中,版本配置项可以按照不同阶段进行出入库管理。版本进入下一个阶段时,需要执行相应审批,并记录操作人员、操作时间、制品信息和审批结果。 Gitee Repo 则承担制品存储、版本管理和分发功能。流水线构建完成后,可以将生成的软件包、容器镜像或其他制品上传至指定仓库,后续测试和部署流程直接引用该制品,而不是重新打包。 这样可以减少“测试的是一个包,上线的是另一个包”的情况。
五、制品库正在从存储空间变成供应链节点
传统制品库主要解决软件包集中存放的问题。 随着软件供应链治理要求提高,企业开始更加关注制品的来源、构建过程和依赖关系。一个可以用于正式交付的制品,除了软件包本身,还应尽可能保留以下信息:
来源代码及提交标识;
构建工具和构建环境;
构建参数及执行主体;
构建过程中使用的第三方依赖;
软件物料清单;
测试和安全检测结果;
制品摘要、签名或完整性信息;
审批、分发和部署记录。 这意味着,未来的交付对象可能不再只是一个 ZIP 包、JAR 包或容器镜像,而是由多类信息共同组成的发布单元: 软件制品
软件物料清单
构建来源信息
测试报告
安全检测报告
完整性信息
审批与发布记录 在这一过程中,Gitee Repo 不只是保存构建结果,还可以与 Gitee Pipe 的构建记录、Gitee Scan 的安全检测结果以及软件工厂中的基线版本建立关联。 当制品进入受控库或产品库后,使用者能够进一步确认该制品由哪次构建生成、对应哪份代码、经过哪些检查,以及是否完成必要审批。 这种模式使制品库从单纯的软件包存储空间,逐步转变为连接代码、构建、检测、审批和部署的软件供应链节点。
六、版本状态可以自动驱动测试和部署 在传统发布流程中,不同角色通常通过即时通信工具传递信息。 研发人员通知测试人员“新版本已经打包”,测试人员完成验证后再通知运维人员“可以上线”。这种协作方式依赖人工沟通,很容易出现通知遗漏、状态理解不一致和制品传递错误。 状态驱动的发布流程可以减少这类问题。 例如,当基线版本从“待集成”变更为“测试中”时,Gitee DevSecOps 可以触发相应流水线,将指定制品部署至测试环境;当测试和扫描结果满足门禁条件后,版本可以进入“待发布”状态,并发起发布审批;审批通过后,再触发生产部署流程。 整个过程可以表示为:
版本状态变化
↓
触发 Gitee Pipe
↓
部署指定制品
↓
执行测试与扫描
↓
回写执行结果
↓
判断质量门禁
↓
进入下一版本状态
与单纯依赖流水线相比,状态驱动的方式将自动化执行与版本管理结合起来。 流水线不再因为某个人点击按钮而孤立运行,而是服务于某个具体版本,并把执行结果重新写回版本记录中。
七、审计与追溯应覆盖整个发布过程 在软件交付过程中,仅记录最终发布结果是不够的。 团队还需要保留版本在不同阶段发生了哪些变化,包括:
- 谁创建了基线版本;
- 哪些需求和代码被纳入版本;
- 谁触发了构建;
- 流水线使用了哪些环境和参数;
- 生成了哪些制品;
- 测试和安全检查结果如何;
- 谁批准制品进入受控库或产品库;
- 谁执行了最终发布;
- 版本最终部署到了哪些环境。 Gitee DevSecOps 软件工厂通过版本操作日志、审批记录、流水线执行记录和制品仓库信息,将这些过程数据保留下来。 当生产环境出现问题时,团队可以从部署版本反向定位到制品,再从制品追溯到流水线、代码提交和关联需求。 生产环境 -->发布版本 --> 产品库制品 --> 构建流水线 -->代码提交 --> 需求与变更记录 这条链路不仅用于事故排查,也可以为内部审计、质量分析和研发效能改进提供数据基础。 Gitee Insight 等研发度量工具则可以在这些过程数据基础上,对流水线成功率、交付周期、缺陷分布、代码质量和版本发布情况进行分析。
八、AI 可以辅助集成发布,但不能替代责任边界 随着 AI 在研发工具中的应用增加,智能化能力也开始进入集成发布流程。 在版本管理和流水线场景中,AI 可以承担一些辅助性工作,例如:
- 自动汇总当前版本包含的需求和缺陷;
- 分析流水线失败日志;
- 推荐可能缺失的测试步骤;
- 对比两个版本之间的代码和依赖变化;
- 识别异常发布操作;
- 生成版本说明和发布摘要;
- 根据历史数据提出流程优化建议。 对于 Gitee DevSecOps 而言,这类能力可以和 Gitee Team 中的需求信息、Gitee Pipe 的流水线日志、Gitee Scan 的检测结果以及 Gitee Repo 的制品数据结合,减少人工整理和重复分析工作。 但 AI 更适合作为辅助分析工具,而不是独立决定软件能否进入生产环境。 涉及生产发布、制品晋级、安全例外和高权限凭证时,仍然需要由确定性的质量门禁、权限策略和责任人审批进行控制。 较为稳妥的模式是:
- AI 汇总信息并提供建议
- Gitee Pipe 执行确定性任务
- Gitee Scan 等工具输出检测结果
- 质量门禁自动判断
- 责任人完成关键审批
- 系统执行发布并记录过程
- AI 可以降低分析成本,但发布责任仍需要由明确的流程、角色和制度承担。
九、如何逐步建设软件工厂式集成发布体系
软件工厂通常不适合一次性替换企业现有的全部研发工具,更现实的方式是围绕版本管理逐步建设。
第一步:明确产品和交付对象 先梳理哪些代码仓库、服务、配置文件、数据库脚本和部署资源共同构成一个产品。 在 Gitee DevSecOps 中,可以通过产品目录和项目结构,逐步建立产品与代码仓库、任务及制品之间的关系。
第二步:定义最低可用的基线版本 明确每个正式版本至少需要包含哪些信息,例如代码提交、需求清单、构建制品、测试报告和部署说明。 初期不需要一次性纳入所有物料,可以先解决版本信息分散和交付对象不清的问题。
第三步:建立统一流水线模板 将编译、测试、安全扫描和制品上传等重复步骤沉淀为 Gitee Pipe 模板,减少不同团队重复编写脚本。
第四步:接入安全检测和质量门禁 根据项目风险等级,逐步引入代码扫描、依赖检测、测试覆盖率和人工审批等门禁。 并不是所有项目都需要相同强度的流程。内部工具、普通业务系统和核心生产系统可以采用不同策略。
第五步:统一管理正式制品 将 Gitee Repo 或其他制品平台作为测试和生产环境的软件来源,减少通过聊天工具、共享目录或个人电脑传递正式部署包。
第六步:建立制品晋级和审批机制 根据组织实际情况划分开发库、受控库和产品库,并明确不同仓库之间的流转条件和责任人。
第七步:补齐追溯和度量能力 逐步关联需求、代码、构建、测试、制品、审批和部署数据,再利用 Gitee Insight 等工具进行交付周期、失败原因和质量趋势分析。
第八步:在流程稳定后引入 AI 只有当流程已经标准化、数据已经形成关联后,AI 才能更准确地分析异常、生成版本摘要和提供优化建议。
常见问题
基线版本和 Git Tag 有什么区别?
Git Tag 主要用于标记代码仓库中的某次提交。 基线版本覆盖的范围更广,可以同时关联需求、代码、测试结果、构建制品、部署文档和审批记录。
使用 Gitee Pipe 后是否就完成了软件工厂建设?
不是。 流水线只是软件工厂中的执行工具。完整的软件工厂还需要产品和版本模型、制品管理、质量门禁、权限控制、审批流程、审计记录和度量分析。
三库分离是否必须建设三个独立平台?
不一定。 开发库、受控库和产品库可以是三个物理仓库,也可以是 Gitee Repo 等制品平台中的不同逻辑仓库。重点在于权限隔离、晋级条件和操作审计。
接入 Gitee Scan 后是否就完成了 DevSecOps?
安全扫描只是 DevSecOps 的一个环节。 完整的 DevSecOps 体系还需要覆盖安全需求、代码评审、依赖治理、凭证管理、构建环境、制品完整性、漏洞响应、发布门禁和审计追溯。
自动化程度是不是越高越好?
并不是。 重复、低风险、规则明确的任务适合自动执行;生产发布、安全例外、权限变更和核心制品晋级等操作,通常仍需要保留审批或双人复核。
结语
软件工厂并不是简单地把更多研发工具连接到一条流水线上,而是围绕产品版本建立统一的交付对象、执行流程和责任边界。 在这一体系中,基线版本负责组织需求、代码、测试结果和交付物料;Gitee Pipe 负责执行构建、测试和部署任务;Gitee Scan 负责提供代码与依赖风险信息;Gitee Repo 负责保存和流转软件制品;Gitee Team 和 Gitee Code 分别提供需求协作与代码变更数据;Gitee Insight 则为交付过程分析提供度量基础。 这些模块并不是彼此独立的功能,而是共同服务于同一条软件交付链路。 当一个发布版本能够回答“包含哪些需求、对应哪份代码、由什么环境构建、经过哪些检查、生成了什么制品、由谁批准并部署到哪里”时,集成发布才真正从自动化操作升级为可治理、可追溯的软件工程过程。 对于企业而言,建设这类体系的重点也不在于一次性部署多少工具,而在于能否先建立清晰的版本对象,再逐步把流水线、制品、安全和审计能力连接起来。Gitee DevSecOps 软件工厂提供的是其中一种实现路径,具体流程仍需要结合企业现有研发工具、组织结构、业务风险和合规要求进行配置。