模板解决什么问题
流水线里的构建、测试、扫描步骤复制到每个仓库后,修复与升级就无法同步:改一处要改几十处。GitLab 用 include 引入共享 YAML、extends 做键级合并;GitHub 用可复用工作流(workflow_call)与复合 Action;Jenkins 用共享库。目标是把公共逻辑收敛到单一维护源,各项目只保留差异参数;模板仓库本身按代码管理,变更走评审、引用锁版本。
基本信息
| GitLab | include 支持同项目文件、跨项目(project+file)与远程 URL;extends 按键合并、子级可覆盖 |
|---|---|
| GitHub | 可复用工作流用 on: workflow_call 定义,按 inputs/secrets 传参;复合 Action 打包一组步骤 |
| Jenkins | Shared Library:vars/ 提供全局步骤、src/ 提供类,用 @Library 声明加载 |
| 版本化 | 引用固定标签或提交 SHA,避免上游改动波及所有项目 |
三种平台对照
| 平台 | 复用单元 | 引用方式 |
|---|---|---|
| GitLab | include 文件与 CI 组件 | project+ref+file,ref 锁版本 |
| GitHub | 可复用工作流与复合 Action | uses: 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: productionGitHub 可复用工作流
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 核对而不是凭记忆。