如何在 GitLab CI 中检测到在创建合并请求时触发了管道
How to detect in GitLab CI that a pipeline was triggered when a Merge Request was created
我正在编写一个脚本,该脚本根据 GitLabs 合并请求的某些事件在 Ryver 中发送消息。支持的场景:
- 创建合并请求时
- 进行评论时(代码审查)
- 当新提交使管道失败时
以下允许将管道限制为仅合并请求:
only:
- merge_requests
script:
- ./ryver.sh #This does the logic of sending the message based on the events
我尝试使用 export
打印管道中的所有变量,但找不到明确检测触发此作业的事件(代码审查、创建等)的方法。
我试过了:
- 合并请求状态
- 比较提交
- 使用次数(不是很靠谱的方式)
我想知道:
- 我们能否检测到什么事件触发了合并请求范围内的管道?
或者
- 我需要使用 WebHook 来访问这些信息吗?
或者
- 还有另一种方法可以完成我的团队正在尝试做的事情吗?
我愿意接受与 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_failure
或 when: 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
我正在编写一个脚本,该脚本根据 GitLabs 合并请求的某些事件在 Ryver 中发送消息。支持的场景:
- 创建合并请求时
- 进行评论时(代码审查)
- 当新提交使管道失败时
以下允许将管道限制为仅合并请求:
only:
- merge_requests
script:
- ./ryver.sh #This does the logic of sending the message based on the events
我尝试使用 export
打印管道中的所有变量,但找不到明确检测触发此作业的事件(代码审查、创建等)的方法。
我试过了:
- 合并请求状态
- 比较提交
- 使用次数(不是很靠谱的方式)
我想知道:
- 我们能否检测到什么事件触发了合并请求范围内的管道? 或者
- 我需要使用 WebHook 来访问这些信息吗? 或者
- 还有另一种方法可以完成我的团队正在尝试做的事情吗?
我愿意接受与 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_failure
或 when: 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