使用 GitLab Event Triggers

概述

GitLab Event Triggers 允许您通过 GitLab 的 Webhook 事件自动触发 Tekton pipelines。它支持多种事件类型,包括代码推送、merge request、评论等,帮助您构建完整的 CI/CD 自动化工作流。

核心特性

  • 多事件类型支持:支持 Push、Merge Request、评论等多种 GitLab 事件。
  • 标准化触发绑定:提供标准化的 ClusterTriggerBindings,确保跨平台一致性。
  • 灵活的参数映射:自动从 GitLab 事件中提取关键信息,用于 pipeline 参数。
  • 安全的 Webhook 集成:支持 Webhook 安全验证。

支持的事件类型

基本事件信息

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

基本变量(适用于所有事件)

变量名称描述示例值
project-idGitLab Project ID1234
project-nameProject Namemy-project
project-pathProject Full Pathgroup/my-project
project-web-urlProject Web 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-nameRepository Namemy-project
user-nameUser Full NameJohn Doe
user-usernameUsernamejohndoe
user-emailUser Emailjohn@example.com

1. Push 事件

当开发人员向 GitLab repository 推送代码时触发。适用于:

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

Push 事件变量

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

2. Merge Request 事件

当 merge request 被创建、更新或关闭时触发。适用于:

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

Merge Request 事件变量

变量名称描述示例值
mergereq-sha最后一次提交 SHA8a1b3c4d5e6f...
mergereq-actionMerge Request 操作open, reopen, update, close, merge
mergereq-stateMerge Request 状态opened, closed, merged
mergereq-numberMerge Request 编号42
mergereq-urlMerge Request URLhttps://gitlab.com/group/project/-/merge_requests/42
mergereq-titleMerge Request 标题Add new feature
mergereq-descriptionMerge Request 描述This PR adds...
mergereq-merge-status合并状态can_be_merged
mergereq-source-branch源分支feature/new-feature
mergereq-target-branch目标分支main
mergereq-source-path源 Repository Pathgroup/my-project
mergereq-target-path目标 Repository Pathgroup/my-project
TIP

请参考您的 GitLab instance 的 webhook 文档,或 GitLab's official merge request event documentation

3. Comment 事件

支持以下类型的评论:

  • Merge Request 评论
  • Commit 评论

适用于:

  • ChatOps 评论自动化

基本 Comment 事件变量(适用于所有 Comment 事件)

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

3.1 Merge Request 评论变量

变量名称描述示例值
mergereq-sha最后一次提交 SHA8a1b3c4d5e6f...
mergereq-actionMerge Request 操作open, reopen, update, close, merge
mergereq-stateMerge Request 状态opened, closed, merged
mergereq-numberMerge Request 编号42
mergereq-urlMerge Request URLhttps://gitlab.com/group/project/-/merge_requests/42
mergereq-titleMerge Request 标题Add new feature
mergereq-descriptionMerge Request 描述This PR adds...
mergereq-merge-status合并状态can_be_merged
mergereq-source-branch源分支feature/new-feature
mergereq-target-branch目标分支main
mergereq-source-path源 Repository Pathgroup/my-project
mergereq-target-path目标 Repository Pathgroup/my-project

3.2 Commit 评论变量

变量名称描述示例值
git-commit-shaCommit SHA8a1b3c4d5e6f...
git-commit-messageCommit 信息Update README.md
git-commit-timestampCommit 时间戳2025-01-26T10:30:00Z
git-commit-urlCommit URLhttps://gitlab.com/group/project/-/commit/8a1b3c4d

配置指南

前提条件

  1. 环境中已创建 EventListener,并且能够在目标 namespace 中处理 Trigger。请联系您的 platform administrator 了解更多信息。
  2. GitLab 可以访问上述 EventListener。
  3. 已创建所需的 Pipeline 以及必要的运行配置。
  4. 您具有修改 GitLab project Webhook 设置的权限。

通过 GitLab UI 配置 Webhook

  1. 进入您的 GitLab project 设置。
  2. 导航到 Settings > Webhooks。
  3. 根据 EventListener 的部署模式添加 Webhook URL,例如使用 https 模式:
    https://<your-eventlistener-url>
  4. 按需选择事件类型:
    • Push events
    • Merge request events
    • Comments
  5. (可选)配置 Secret Token。
  6. 点击 "Add webhook"。

Pipeline 触发配置示例

如果目标是通过触发器实现持续集成,并满足以下需求:

  • 在提交代码后自动触发自动化 CI 功能。
  • 在 merge request 打开时自动触发 CI pipeline。

为简化本文档,我们假设 pipeline 已准备就绪,并提供以下参数:

参数名称描述示例值
git-revision用于执行目标 pipeline 的 Git revisionrefs/heads/main
git-repo-urlGit Repository URLhttps://gitlab.com/group/project.git
TIP

请替换为您的实际 pipeline 信息。

信息描述
my-namespaceNamespace 名称
my-pipelinePipeline 名称
workspacesWorkspace 配置,请根据实际 pipeline workspace 配置和需求进行修改

接下来,我们只需配置以下两个 trigger:

创建 Push Trigger

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

apiVersion: triggers.tekton.dev/v1alpha1
kind: Trigger
metadata:
    name: my-pipeline-push   # It is suggested to modify the prefix based on the pipeline name
    namespace: my-namespace  # Change to actual 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- # It is suggested to modify the prefix based on the pipeline name
          spec:
              pipelineRef:
                name: my-pipeline  # Change to actual pipeline name
              params:
              - name: git-revision
                value: $(tt.params.git-revision)
              - name: git-repo-url
                value: $(tt.params.git-repo-url)
              workspaces: # Workspaces need to be modified based on pipeline requirements and environment configuration
              - name: source
                volumeClaimTemplate:
                  spec:
                    accessModes:
                    - ReadWriteMany
                    resources:
                      requests:
                        storage: 1Gi

在环境中创建该资源:

kubectl apply -f gitlab-push-trigger.yaml

创建 Merge Request Trigger

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

apiVersion: triggers.tekton.dev/v1alpha1
kind: Trigger
metadata:
  name: my-pipeline-merge-request # It is suggested to modify the prefix based on the pipeline name
  namespace: my-namespace # Change to actual namespace
spec:
  bindings:
    - ref:
        kind: ClusterTriggerBinding
        name: gitlab-merge-request
  interceptors: # Add Interceptor to filter opened MR events, ignore others for now
  - 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- # It is suggested to modify the prefix based on the pipeline name
        spec:
          pipelineRef:
            name: my-pipeline # Modify based on the pipeline name
          params:
            - name: git-revision
              value: $(tt.params.mergereq-sha)
            - name: git-repo-url
              value: $(tt.params.git-repo-url)
          workspaces: # Workspaces need to be modified based on pipeline requirements and environment configuration
            - name: source
              volumeClaimTemplate:
                spec:
                  accessModes:
                    - ReadWriteMany
                  resources:
                    requests:
                      storage: 1Gi
TIP

请根据需要调整 Interceptor 配置。

在环境中创建该资源:

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

验证 Trigger

通过提交代码和创建 Merge Request 来进行验证。

CLI:

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

Console:

进入 Pipelines > PipelineRuns 查看已触发的 pipelines。