通过 Webhook 发送构建状态通知
urls: 必填,Webhook 通知地址列表,支持多个地址method: 选填,HTTP 请求方法,支持 GET、POST、PUT 等。默认为 POST。content_type: 选填,HTTP 请求的 Content-Type。默认为 application/json。headers: 选填,自定义 HTTP 请求头,格式为 key=value 对的数组valid_response_codes: 选填,有效的 HTTP 响应状态码列表(可选),只有返回这些状态码才认为请求成功。格式为整数数组debug: 选填,是否启用调试模式,true 或 false,默认为 false。启用后将输出详细的请求和响应信息username: 选填,HTTP 基本认证的用户名。password: 选填,HTTP 基本认证的密码。token_type: 选填,认证令牌的类型,如 Bearer、Token 等。默认为 Bearer。
添加到请求头的 Authorization 中,格式为 Authorization: ${token_type} ${token_value}.token_value: 选填,认证令牌的值。signature_header: 选填,签名请求头的名称,用于请求 HMAC-SHA256 签名验证signature_secret: 选填,签名密钥,用于生成 HMAC-SHA256 请求签名skip_verify: 选填,是否跳过 SSL 证书验证。默认为 false。template: 选填,自定义消息模板,用于格式化发送的消息内容。如果未设置,将使用默认的 JSON 格式。
其中 template 的变量替换支持两种替换方式:
{{ variable }} 语法引用环境变量。变量值带有特殊字符会被转义。${ variable },
这种方式如果环境变量中带有双引号、换行等会导致 json 格式错乱的字符,
可能会导致 JSON 无法正常解析。其中 variable 可使用 CNB 提供的环境变量,如 ${CNB_REPO_NAME}、{{ CNB_REPO_NAME }}。
{
"repoName": "{{ CNB_REPO_NAME }}",
"repoUrl": "${CNB_REPO_URL_HTTPS}"
}
如果未设置template,将使用默认 JSON 字符串格式作为请求 body,默认格式如下,变量含义详见:
{
"CNB_WEB_PROTOCOL",
"CNB_WEB_HOST",
"CNB_WEB_ENDPOINT",
"CNB_API_ENDPOINT",
"CNB_GROUP_SLUG",
"CNB_GROUP_SLUG_LOWERCASE",
"CNB_EVENT",
"CNB_EVENT_URL",
"CNB_BRANCH",
"CNB_BRANCH_SHA",
"CNB_TOKEN_USER_NAME",
"CNB_TOKEN",
"CNB_TOKEN_FOR_AI",
"CNB_IS_CRONEVENT",
"CNB_DOCKER_REGISTRY",
"CNB_HELM_REGISTRY",
"CNB_BEFORE_SHA",
"CNB_COMMIT",
"CNB_COMMIT_SHORT",
"CNB_COMMIT_MESSAGE",
"CNB_COMMIT_MESSAGE_TITLE",
"CNB_COMMITTER",
"CNB_COMMITTER_EMAIL",
"CNB_IS_TAG",
"CNB_TAG_MESSAGE",
"CNB_TAG_RELEASE_TITLE",
"CNB_TAG_RELEASE_DESC",
"CNB_TAG_IS_RELEASE",
"CNB_TAG_IS_PRE_RELEASE",
"CNB_IS_NEW_BRANCH",
"CNB_IS_NEW_BRANCH_WITH_UPDATE",
"CNB_REPO_SLUG",
"CNB_REPO_SLUG_LOWERCASE",
"CNB_REPO_NAME",
"CNB_REPO_NAME_LOWERCASE",
"CNB_REPO_ID",
"CNB_REPO_URL_HTTPS",
"CNB_BUILD_ID",
"CNB_BUILD_WEB_URL",
"CNB_BUILD_START_TIME",
"CNB_BUILD_USER",
"CNB_BUILD_USER_ID",
"CNB_BUILD_STAGE_NAME",
"CNB_BUILD_JOB_NAME",
"CNB_BUILD_JOB_KEY",
"CNB_BUILD_WORKSPACE",
"CNB_BUILD_FAILED_MSG",
"CNB_BUILD_FAILED_STAGE_NAME",
"CNB_PIPELINE_NAME",
"CNB_PIPELINE_KEY",
"CNB_PIPELINE_ID",
"CNB_PIPELINE_DOCKER_IMAGE",
"CNB_RUNNER_IP",
"CNB_CPUS",
"CNB_IS_RETRY",
"CNB_PULL_REQUEST",
"CNB_PULL_REQUEST_LIKE",
"CNB_PULL_REQUEST_PROPOSER",
"CNB_PULL_REQUEST_TITLE",
"CNB_PULL_REQUEST_BRANCH",
"CNB_PULL_REQUEST_SHA",
"CNB_PULL_REQUEST_TARGET_SHA",
"CNB_PULL_REQUEST_MERGE_SHA",
"CNB_PULL_REQUEST_SLUG",
"CNB_PULL_REQUEST_ACTION",
"CNB_PULL_REQUEST_ID",
"CNB_PULL_REQUEST_IID",
"CNB_PULL_REQUEST_REVIEWERS",
"CNB_PULL_REQUEST_REVIEW_STATE",
"CNB_REVIEW_REVIEWED_BY",
"CNB_REVIEW_LAST_REVIEWED_BY",
"CNB_VSCODE_WEB_URL",
"CNB_ISSUE_ID",
"CNB_ISSUE_IID",
"CNB_ISSUE_TITLE",
"CNB_ISSUE_DESCRIPTION",
"CNB_ISSUE_OWNER",
"CNB_ISSUE_STATE",
"CNB_ISSUE_IS_RESOLVED",
"CNB_COMMENT_ID",
"CNB_COMMENT_BODY"
}
# .cnb.yml
main:
push:
- stages:
- name: notify
image: cnbcool/webhook
settings:
urls:
- https://api.example.com/webhook
method: POST
content_type: application/json
template: |
{
"owner": "{{ CNB_BUILD_USER }}",
"repo": "{{ CNB_REPO_SLUG }}",
"url": "{{ CNB_REPO_URL_HTTPS }}",
"event": "{{ CNB_EVENT }}"
}
# .cnb.yml
main:
push:
- stages:
- name: notify
image: cnbcool/webhook
settings:
urls:
- https://api.example.com/webhook1
- https://api.example.com/webhook2
method: POST
username: webhook-user
password: webhook-password
content_type: application/json
template: |
{
"owner": "{{ CNB_BUILD_USER }}",
"repo": "{{ CNB_REPO_SLUG }}",
"url": "{{ CNB_REPO_URL_HTTPS }}",
"event": "{{ CNB_EVENT }}"
}
headers:
- "X-Custom-Header=custom-value"
- "Authorization=Bearer my-token"
token_type: "Bearer"
token_value: "my-token"
signature_header: "X-CNB-Signature"
signature_secret: "your-signature-secret"
valid_response_codes: [200, 201, 204]
skip_verify: false
debug: true