使用 GitLab 事件触发器

概述

GitLab 事件触发器允许您通过 GitLab 的 Webhook 事件自动触发 Tekton 管道。它支持多种事件类型,包括代码推送、合并请求、评论等,使您能够构建完整的 CI/CD 自动化工作流程。

核心特性

  • 多事件类型支持:支持多种 GitLab 事件,如推送、合并请求、评论等。
  • 标准化触发器绑定:提供标准化的 ClusterTriggerBindings,以确保跨平台的一致性。
  • 灵活的参数映射:自动从 GitLab 事件中提取关键数据以用于管道参数。
  • 安全的 Webhook 集成:支持 Webhook 安全验证。

支持的事件类型

基本事件信息

所有输出变量都可以用于管道参数映射。您可以使用 $(tt.params.<param name>) 访问参数值。

基本变量(所有事件通用)

变量名称描述示例值
project-idGitLab 项目 ID1234
project-name项目名称my-project
project-path项目全路径group/my-project
project-web-url项目网页 URLhttps://gitlab.com/group/my-project
git-repo-urlGit HTTP URLhttps://gitlab.com/group/my-project.git
git-repo-ssh-urlGit SSH URLgit@gitlab.com:group/my-project.git
git-repo-name仓库名称my-project
user-name用户全名John Doe
user-username用户名johndoe
user-email用户邮箱john@example.com

1. 推送事件

当开发者向 GitLab 仓库推送代码时触发。适用于:

  • 持续集成构建
  • 自动化部署
  • 代码质量检查

推送事件变量

变量名称描述示例值
git-revisionGit 修订版refs/heads/main
git-commit-sha提交 SHA8a1b3c4d5e6f...
git-commit-message提交信息Update README.md
git-commit-timestamp提交时间戳2025-01-26T10:30:00Z

2. 合并请求事件

当创建、更新或关闭合并请求时触发。适用于:

  • 自动化代码审查
  • 预发布环境部署
  • 自动化测试

合并请求事件变量

变量名称描述示例值
mergereq-sha最后提交 SHA8a1b3c4d5e6f...
mergereq-action合并请求操作open, reopen, update, close, merge
mergereq-state合并请求状态opened, closed, merged
mergereq-number合并请求编号42
mergereq-url合并请求 URLhttps://gitlab.com/group/project/-/merge_requests/42
mergereq-title合并请求标题Add new feature
mergereq-description合并请求描述This PR adds...
mergereq-merge-status合并状态can_be_merged
mergereq-source-branch源分支feature/new-feature
mergereq-target-branch目标分支main
mergereq-source-path源仓库路径group/my-project
mergereq-target-path目标仓库路径group/my-project
TIP

请参考您的 GitLab 实例的 webhook 文档或 GitLab 的官方合并请求事件文档

3. 评论事件

支持以下类型的评论:

  • 合并请求评论
  • 提交评论

适用于:

  • ChatOps 评论自动化

基本评论事件变量(所有评论事件通用)

变量名称描述示例值
comment评论内容LGTM 👍
comment-url评论 URLhttps://gitlab.com/group/project/-/merge_requests/42#note_123

3.1 合并请求评论变量

变量名称描述示例值
mergereq-sha最后提交 SHA8a1b3c4d5e6f...
mergereq-action合并请求操作open, reopen, update, close, merge
mergereq-state合并请求状态opened, closed, merged
mergereq-number合并请求编号42
mergereq-url合并请求 URLhttps://gitlab.com/group/project/-/merge_requests/42
mergereq-title合并请求标题Add new feature
mergereq-description合并请求描述This PR adds...
mergereq-merge-status合并状态can_be_merged
mergereq-source-branch源分支feature/new-feature
mergereq-target-branch目标分支main
mergereq-source-path源仓库路径group/my-project
mergereq-target-path目标仓库路径group/my-project

3.2 提交评论变量

变量名称描述示例值
git-commit-sha提交 SHA8a1b3c4d5e6f...
git-commit-message提交信息Update README.md
git-commit-timestamp提交时间戳2025-01-26T10:30:00Z
git-commit-url提交 URLhttps://gitlab.com/group/project/-/commit/8a1b3c4d

配置指南

先决条件

  1. 环境中已创建 EventListener,并能够处理目标命名空间中的 Trigger。请联系您的平台管理员获取更多信息。
  2. GitLab 可以访问上述提到的 EventListener
  3. 所需的 Pipeline 及必要的运行配置已创建。
  4. 您有权限修改 GitLab 项目的 Webhook 设置。

通过 GitLab UI 配置 Webhook

  1. 访问您的 GitLab 项目设置。
  2. 导航到 Settings > Webhooks
  3. 根据 EventListener 的部署模式添加 Webhook URL,例如,使用 https 模式:
    https://<your-eventlistener-url>
  4. 根据需要选择事件类型:
    • 推送事件
    • 合并请求事件
    • 评论
  5. (可选)配置密钥令牌。
  6. 点击 "Add webhook"。

管道触发器配置示例

如果目标是在触发器上实现持续集成,具体要求如下:

  • 代码提交后自动触发 CI 功能。
  • 当合并请求被打开时自动触发 CI 管道。

为了简化文档,我们假设该管道已准备好,并提供以下参数:

参数名称描述示例值
git-revision执行目标管道的 Git 修订版refs/heads/main
git-repo-urlGit 仓库 URLhttps://gitlab.com/group/project.git
TIP

请用实际的管道信息替换。

信息描述
my-namespace命名空间名称
my-pipeline管道名称
workspaces工作空间配置,依据实际的管道工作空间配置及要求进行修改

接下来,我们只需配置以下两个触发器:

创建推送触发器

将以下 YAML 保存为 gitlab-push-trigger.yaml

apiVersion: triggers.tekton.dev/v1alpha1
kind: Trigger
metadata:
    name: my-pipeline-push   # 建议根据管道名称修改前缀
    namespace: my-namespace  # 更改为实际命名空间
spec:
    bindings:
    - ref:
        kind: ClusterTriggerBinding
        name: gitlab-push
    template:
      spec:
        params:
        - name: git-revision
        - name: git-repo-url
        resourcetemplates:
        - apiVersion: tekton.dev/v1
          kind: PipelineRun
          metadata:
              generateName: my-pipeline-push- # 建议根据管道名称修改前缀
          spec:
              pipelineRef:
                name: my-pipeline  # 更改为实际管道名称
              params:
              - name: git-revision
                value: $(tt.params.git-revision)
              - name: git-repo-url
                value: $(tt.params.git-repo-url)
              workspaces: # 根据管道要求及环境配置需要修改工作空间
              - name: source
                volumeClaimTemplate:
                  spec:
                    accessModes:
                    - ReadWriteMany
                    resources:
                      requests:
                        storage: 1Gi

在环境中创建资源:

kubectl apply -f gitlab-push-trigger.yaml

创建合并请求触发器

将以下 YAML 保存为 gitlab-merge-request-trigger.yaml

apiVersion: triggers.tekton.dev/v1alpha1
kind: Trigger
metadata:
  name: my-pipeline-merge-request # 建议根据管道名称修改前缀
  namespace: my-namespace # 更改为实际命名空间
spec:
  bindings:
    - ref:
        kind: ClusterTriggerBinding
        name: gitlab-merge-request
  interceptors: # 添加拦截器以过滤打开的 MR 事件,暂时忽略其他事件
  - ref:
      kind: ClusterInterceptor
      name: cel
    params:
    - name: filter
      value: |
        body.object_attributes.state == "opened" &&  body.object_attributes.action == "open"
  template:
    spec:
      params:
        - name: mergereq-sha
        - name: git-repo-url
      resourcetemplates:
      - apiVersion: tekton.dev/v1
        kind: PipelineRun
        metadata:
          generateName: my-pipeline-mr- # 建议根据管道名称修改前缀
        spec:
          pipelineRef:
            name: my-pipeline # 根据管道名称修改
          params:
            - name: git-revision
              value: $(tt.params.mergereq-sha)
            - name: git-repo-url
              value: $(tt.params.git-repo-url)
          workspaces: # 根据管道要求及环境配置需要修改工作空间
            - name: source
              volumeClaimTemplate:
                spec:
                  accessModes:
                    - ReadWriteMany
                  resources:
                    requests:
                      storage: 1Gi
TIP

请根据需要调整拦截器配置。

在环境中创建资源:

kubectl apply -f gitlab-merge-request-trigger.yaml

验证触发器

通过提交代码并创建合并请求来进行验证。

CLI:

您可以使用 kubectl -n <namespace> get pipelinerun 获取管道执行状态。

控制台:

访问 Pipelines > PipelineRuns 查看已触发的管道。