首页/开发/CI/CD 与发布速查/可复用流水线模板
流水线设计54 条

可复用流水线模板

把通用片段抽成模板:GitLab include/extends 与 CI 组件、GitHub 可复用工作流、Jenkins 共享库,避免复制粘贴漂移。

CI/CD 与发布速查开发更新于 2026-10-13

模板解决什么问题

流水线里的构建、测试、扫描步骤复制到每个仓库后,修复与升级就无法同步:改一处要改几十处。GitLab 用 include 引入共享 YAML、extends 做键级合并;GitHub 用可复用工作流(workflow_call)与复合 Action;Jenkins 用共享库。目标是把公共逻辑收敛到单一维护源,各项目只保留差异参数;模板仓库本身按代码管理,变更走评审、引用锁版本。

基本信息

GitLabinclude 支持同项目文件、跨项目(project+file)与远程 URL;extends 按键合并、子级可覆盖
GitHub可复用工作流用 on: workflow_call 定义,按 inputs/secrets 传参;复合 Action 打包一组步骤
JenkinsShared Library:vars/ 提供全局步骤、src/ 提供类,用 @Library 声明加载
版本化引用固定标签或提交 SHA,避免上游改动波及所有项目

三种平台对照

平台复用单元引用方式
GitLabinclude 文件与 CI 组件project+ref+file,ref 锁版本
GitHub可复用工作流与复合 Actionuses: owner/repo/path@ref
Jenkins共享库与 vars 全局步骤@Library('lib@1.2') 可带版本

典型使用场景

  • 多仓库统一构建规范:Node/Go/Java 模板收敛到一处,升级默认版本只改模板
  • 安全扫描统一注入:依赖扫描、密钥扫描挂进模板,新项目接入即生效
  • 发布流程标准化:统一制品命名、签名与入库步骤,避免各仓库自创流程
  • 平台工程自助能力:业务团队按参数调用模板,不关心底层实现
  • 迁移期灰度:模板预留开关,按项目逐个切换新旧行为

GitLab 引入与合并

GitLab 引入与合并
include:
  - project: 'platform/ci-templates'
    ref: v2.3.0            # 锁定版本,避免上游漂移
    file: '/templates/node.yml'

build:
  extends: .base-build     # 键级合并,本处键覆盖模板
  variables:
    NODE_ENV: production

GitHub 可复用工作流

GitHub 可复用工作流
# 被复用方 .github/workflows/build.yml
on:
  workflow_call:
    inputs:
      node:
        type: string
        required: true
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: echo "node ${{ inputs.node }}"

# 调用方(固定版本号,勿用浮动分支)
# uses: org/repo/.github/workflows/build.yml@v2.3.0
模板仓库同样要版本化:引用固定标签或提交,避免上游改动波及所有项目。
GitHub 可复用工作流有嵌套上限(顶层调用方加三层被调);GitLab 多来源 include 与 extends 叠加时,冲突键的最终取值以合并结果为准,用 CI Lint 核对而不是凭记忆。

易错点

  • 模板引用浮动分支或 latest:上游一次改动改变所有项目行为,出现没动代码流水线却失败,必须锁定 ref 或 SHA
  • 复制粘贴模板后各自魔改:上游修复无法回灌、审计漏项,差异应通过参数或 extends 覆盖表达
  • 把真实凭据写进模板默认值:所有调用方共享同一凭据、轮换困难,模板只放占位与引用
  • 模板输入改名不升大版本:引用固定版本的项目无感,浮动引用的项目突然断流,接口变更要语义化升版

数据来源与参考

  • GitLab Docs《CI/CD components》
  • GitHub Docs《Reusing workflows》
  • Jenkins Docs《Extending with shared libraries》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌