如何在 GitLab CI 中检测到在创建合并请求时触发了管道

How to detect in GitLab CI that a pipeline was triggered when a Merge Request was created

我正在编写一个脚本,该脚本根据 GitLabs 合并请求的某些事件在 Ryver 中发送消息。支持的场景:

  1. 创建合并请求时
  2. 进行评论时(代码审查)
  3. 当新提交使管道失败时

以下允许将管道限制为仅合并请求:

  only:
  - merge_requests
  script:
  - ./ryver.sh #This does the logic of sending the message based on the events

我尝试使用 export 打印管道中的所有变量,但找不到明确检测触发此作业的事件(代码审查、创建等)的方法。

我试过了:

我想知道:

  1. 我们能否检测到什么事件触发了合并请求范围内的管道? 或者
  2. 我需要使用 WebHook 来访问这些信息吗? 或者
  3. 还有另一种方法可以完成我的团队正在尝试做的事情吗?

我愿意接受与 gitlab-ci.yml 无关的建议或其他方法,只要它是免费的

您可以使用这样的逻辑来检测提交来自合并请求:

$CI_PIPELINE_SOURCE == 'merge_request_event'

有关如何控制启动管道的内容的更多详细信息,请参阅 here

您可以通过查看此变量找出是什么触发了管道:

CI_PIPELINE_SOURCE

来自文档:

有关 pre-defined 个变量的更多详细信息,请参阅 here

Can we detect what event triggered the pipeline within the Merge Request scope?

是的,这包含在预定义的 CI_PIPELINE_SOURCE 变量中,如 frakman1 answered

Do I need to use a WebHook to access this information?

这取决于你想做什么。如上所述,此信息在管道中作为预定义 variable.However 固有地可用,应该注意的是,只有某些事件才触发 merge request pipelines

例如,对合并请求的评论不会触发管道。如果您想对评论或状态更改做出反应,您可能需要一个 webhook。

管道源信息在 webhook 和响应的 source 键中的 list pipelines API 中均可用(在 GitLab 14.3+ 中)。
Webhooks 在 X-Gitlab-Event header 和 payload 中为相关事件公开事件。

There is another way to do what my team is trying to do?

Webhook 可能比依赖 in-pipeline 作业更可靠,因为 webhook 可以捕获比 jobs/pipelines 更多的事件。例如,即使根本没有创建管道,Webhook 也可以向您发送通知。如果您的管道由于某种原因 blocked/timed 出现问题,它也会起作用。

然而,缺点是您需要开发和托管自己的 Web 应用程序来处理传入的 Webhook。

GitLab 中内置了许多 project integrations,用于将通知 webhook 直接发送到各种服务。不幸的是,Ryver 不是其中之一。

如果你想从工作发送通知,我发现使用 apprise simplifies this greatly and supports ryver

基本模板作业可能如下所示:

.send_notification:
  image: python:3.9-slim
  before_script:
    - pip install apprise
  variables:
    RYVER_ORG: "YourOrganization"
    # Define RIVER_TOKEN in your CI/CD variables settings
    NOTIFICATION_TITLE: "Placeholder Title"
    NOTIFICATION_BODY: "Placehodler Body"
  script:
    - apprise -vv -t "${NOTIFICATION_TITLE}" -b "${NOTIFICATION_BODY}" "ryver:///${RYVER_ORG}/${RYVER_TOKEN}"

将作业与 when: on_failurewhen: on_success 结合使用可能会有用:

stages:
  - build
  - build_notification

build:
  stage: build
  script:
    - make build

notify_build_failure:
  stage: build_notification
  when: on_failure
  extends: .send_notification
  variables:
    NOTIFICATION_TITLE: "Failed - $CI_PROJECT_NAME pipeline $CI_PIPELINE_ID"
    NOTIFICATION_BODY: "The build failed for the pipeline. See $CI_PIPELINE_URL"


notify_build_success:
  stage: build_notification
  when: on_success # the default
  extends: .send_notification
  variables:
    NOTIFICATION_TITLE: "Build Success - $CI_PROJECT_NAME pipeline $CI_PIPELINE_ID"
    NOTIFICATION_BODY: "The build has succeeded. See $CI_PIPELINE_URL"

或者使用默认值 after_script,即使作业失败也会 运行。这是在每个作业后评估 ryver.sh 脚本的简单方法。脚本逻辑可以判断是否发送通知以及通知的内容。

default:
  after_script:
    - ./ryver.sh