Cette page décrit les webhooks Secure Source Manager. Pour configurer un webhook, suivez les instructions de la section Configurer des webhooks.
Les webhooks sont des requêtes HTTP déclenchées par un événement dans un dépôt Secure Source Manager, puis envoyées à une URL spécifiée par l'utilisateur.
Paramètres de webhooks
Les Webhooks ne peuvent être configurés que dans l'interface Web Secure Source Manager. Les champs suivants sont configurables :
- ID du crochet
- Nom lisible du webhook. Les ID de hook doivent respecter la convention d'attribution de noms des ressources. Ils ne doivent inclure que des lettres minuscules, des chiffres ou des tirets, doivent commencer par une lettre et ne peuvent pas être modifiés après la création du webhook.
- URL cible
- URL cible du webhook. Une cible de webhook est une URL ouverte et publique.
- Chaîne de requête sensible
Les chaînes de requête sensibles sont ajoutées à la fin de l'URL cible comme suit :
TARGET_URL?SENSITIVE_QUERY_STRING.La plupart des services fournissent un jeton ou un secret pour s'assurer que les requêtes entrantes proviennent d'un service autorisé. Pour valider la requête, vous pouvez stocker le jeton ou le secret requis dans la chaîne de requête sensible.
Les chaînes de requête sensibles sont statiques et durables. Elles doivent être créées, permutées et validées manuellement. Utilisez des chaînes de requête sensibles pour cibler les outils qui attendent un secret partagé, une clé API ou un jeton dans les paramètres de requête de l'URL. Vous pouvez également utiliser des chaînes de requête sensibles dans les cas où la cible du webhook n'est pas compatible avec l'authentification par jeton basée sur l'en-tête
auth.- Activer l'authentification par compte de service
Sélectionnez cette option pour authentifier le webhook à l'aide d'un compte de service. Lorsque l'autorisation du compte de service est activée, Secure Source Manager crée un jeton d'ID OpenID Connect (OIDC) signé par Google pour le compte de service du dépôt et l'envoie en tant que jeton du porteur dans la requête de webhook.
L'autorisation du compte de service est de courte durée et ne nécessite pas de gestion manuelle des jetons. Nous vous recommandons d'utiliser l'autorisation de compte de service lorsque vos Webhooks ciblent des services ou des points de terminaison qui valident les jetons d'ID Google OIDC à l'aide d'IAM au lieu d'utiliser des secrets partagés. Par exemple, les services Cloud Run privés ou les fonctions Cloud Run.
- Trigger on
Événement déclenchant la requête webhook. Les options sont Push (déclencheur lors d'un push vers le dépôt), État de la demande d'extraction modifié (déclencheur lorsqu'une demande d'extraction est ouverte, fermée, rouverte ou modifiée) et Commentaire sur la demande d'extraction (déclencheur lorsqu'un commentaire est ajouté, modifié ou supprimé sur une demande d'extraction d'extraction).
- Filtre des références Git pour les événements push
Filtre permettant de spécifier les branches sur lesquelles générer des rapports pour les événements push spécifiés sous forme de modèle glob. Pour connaître la syntaxe, consultez la documentation glob.
- Actif
Le webhook envoie des requêtes sur les événements déclencheurs lorsqu'ils sont sélectionnés. Si cette option n'est pas sélectionnée, aucune requête n'est envoyée.
Tester les webhooks
Une fois votre webhook configuré, vous pouvez le tester à l'aide du bouton Tester l'envoi dans l'onglet "Webhooks".
Exemples d'informations sur les événements
Les exemples suivants montrent les informations sur les événements envoyées par Secure Source Manager à l'URL cible pour différents événements de webhook.
Charge utile de l'événement push
Le contenu d'une charge utile d'événement push est semblable à ce qui suit :
En-tête
Request URL: https://example.com?{sensitive_query_string_placeholder}
Request method: POST
Content-Type: application/json
X-SecureSourceManager-Delivery: 6546af81-25c6-46d9-aa41-70c00dc67752
X-SecureSourceManager-Event: push
X-SecureSourceManager-Signature:
Body
{
"secret": "",
"ref": "refs/heads/main",
"before": "f22fe95d6097bc18ba2ace7c5808ef53c0211a2e",
"after": "85c7e78e6dfb63bcad4a0bb0953c0b3554ed0e93",
"compare_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo/compare/f22fe95d6097bc18ba2ace7c5808ef53c0211a2e...85c7e78e6dfb63bcad4a0bb0953c0b3554ed0e93",
"commits": [
{
"id": "85c7e78e6dfb63bcad4a0bb0953c0b3554ed0e93",
"message": "Push Event'\n",
"url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo/commit/85c7e78e6dfb63bcad4a0bb0953c0b3554ed0e93",
"author": {
"name": "user",
"email": "user@example.com",
"username": "user@example.com"
},
"committer": {
"name": "user",
"email": "user@example.com",
"username": "user@example.com"
},
"verification": null,
"timestamp": "2024-07-03T18:27:38Z",
"added": [],
"removed": [],
"modified": [
"README.md"
]
}
],
"head_commit": null,
"repository": {
"id": 4,
"owner": {"id":2,"login":"my-project","full_name":"","email":"email-address@example.com","avatar_url":"b2653dbf52c7e078e04b8b20020eaadeafe0337787cc0e19b976efc8d594aefb","language":"","is_admin":false,"last_login":"1970-01-01T00:00:00Z","created":"2023-06-02T14:18:40Z","restricted":false,"username":"my-project"},
"name": "my-repo",
"full_name": "my-project/my-repo",
"description": "",
"empty": false,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 4,
"html_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"ssh_url": "git@my-instance-123456789-ssh.us-central1.sourcemanager.dev:my-project/my-repo.git",
"clone_url": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 1,
"release_counter": 1,
"default_branch": "main",
"archived": false,
"created_at": "2023-06-06T20:34:36Z",
"updated_at": "2024-04-04T18:19:14Z",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": false,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"uris": {
"api": "https://my-instance-123456789-api.us-central1.sourcemanager.dev/v1/projects/my-project/locations/us-central1/repositories/my-repo",
"html": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"git_https": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git"
}
},
"pusher": {"id":4,"login":"user@example.com","full_name":"user","email":"user@example.com","avatar_url":"https://this-is-avatar.com","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T20:53:58Z","restricted":false,"username":"user@example.com"},
"sender": {"id":4,"login":"user@example.com","full_name":"user","email":"user@example.com","avatar_url":"https://this-is-avatar.com","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T20:53:58Z","restricted":false,"username":"user@example.com"}
}
Charge utile de l'événement Pull
Le contenu d'une charge utile d'événement d'extraction est semblable à ce qui suit.
En-tête
Request URL: https://example.com?{sensitive_query_string_placeholder}
Request method: POST
Content-Type: application/json
X-SecureSourceManager-Delivery: d7bb9273-17cf-431d-835c-b334c9702eee
X-SecureSourceManager-Event: pull_request
X-SecureSourceManager-Signature:
Body
{
"secret": "",
"action": "opened",
"number": 4,
"pull_request": {
"id": 18,
"url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo/pulls/4",
"number": 4,
"user": {"id":4,"login":"user@example.com","full_name":"user","email":"user@example.com","avatar_url":"https://page-address.com","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T20:53:58Z","restricted":false,"username":"user@example.com"},
"title": "Open a Pull Request'",
"body": "",
"labels": [],
"milestone": null,
"assignee": null,
"assignees": null,
"state": "open",
"is_locked": false,
"comments": 0,
"html_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/cloud-git-test-pso-instance/test2/pulls/4",
"diff_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo/pulls/4.diff",
"patch_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo/pulls/4.patch",
"mergeable": false,
"merged": false,
"merged_at": null,
"merge_commit_sha": null,
"merged_by": null,
"base": {
"label": "main",
"ref": "main",
"sha": "85c7e78e6dfb63bcad4a0bb0953c0b3554ed0e93",
"repo_id": 4,
"repo": {
"id": 4,
"owner": {"id":2,"login":"my-project","full_name":"","email":"email-address@example.com","avatar_url":"b2653dbf52c7e078e04b8b20020eaadeafe0337787cc0e19b976efc8d594aefb","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T14:18:40Z","restricted":false,"username":"my-project"},
"name": "my-repo",
"full_name": "my-project/my-repo",
"description": "",
"empty": false,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 4,
"html_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"ssh_url": "git@my-instance-123456789-ssh.us-central1.sourcemanager.dev:my-project/my-repo.git",
"clone_url": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 1,
"default_branch": "main",
"archived": false,
"created_at": "2023-06-06T20:34:36Z",
"updated_at": "2024-07-03T18:27:42Z",
"permissions": {
"admin": false,
"push": false,
"pull": false
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": false,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"uris": {
"api": "https://my-instance-123456789-api.us-central1.sourcemanager.dev/v1/projects/my-project/locations/us-central1/repositories/my-repo",
"html": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"git_https": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git"
}
}
},
"head": {
"label": "dev",
"ref": "dev",
"sha": "06aa2c971d8e06e5271ce04248ef1920341ce208",
"repo_id": 4,
"repo": {
"id": 4,
"owner": {"id":2,"login":"my-project","full_name":"","email":"email-address@example.com","avatar_url":"b2653dbf52c7e078e04b8b20020eaadeafe0337787cc0e19b976efc8d594aefb","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T14:18:40Z","restricted":false,"username":"my-project"},
"name": "my-repo",
"full_name": "my-project/my-repo",
"description": "",
"empty": false,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 4,
"html_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"ssh_url": "git@my-instance-123456789-ssh.us-central1.sourcemanager.dev:my-project/my-repo.git",
"clone_url": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 1,
"default_branch": "main",
"archived": false,
"created_at": "2023-06-06T20:34:36Z",
"updated_at": "2024-07-03T18:27:42Z",
"permissions": {
"admin": false,
"push": false,
"pull": false
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": false,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"uris": {
"api": "https://my-instance-123456789-api.us-central1.sourcemanager.dev/v1/projects/my-project/locations/us-central1/repositories/my-repo",
"html": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"git_https": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git"
}
}
},
"merge_base": "af065efa8d3d7549154c560da5cb3ec236ad3002",
"due_date": null,
"created_at": "2024-07-03T18:40:21Z",
"updated_at": "2024-07-03T18:40:21Z",
"closed_at": null
},
"repository": {
"id": 4,
"owner": {"id":2,"login":"my-project","full_name":"","email":"email-address@example.com","avatar_url":"b2653dbf52c7e078e04b8b20020eaadeafe0337787cc0e19b976efc8d594aefb","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T14:18:40Z","restricted":false,"username":"my-project"},
"name": "my-repo",
"full_name": "my-project/my-repo",
"description": "",
"empty": false,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 4,
"html_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"ssh_url": "git@my-instance-123456789-ssh.us-central1.sourcemanager.dev:my-project/my-repo.git",
"clone_url": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 1,
"release_counter": 1,
"default_branch": "main",
"archived": false,
"created_at": "2023-06-06T20:34:36Z",
"updated_at": "2024-07-03T18:27:42Z",
"permissions": {
"admin": false,
"push": false,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": false,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"uris": {
"api": "https://my-instance-123456789-api.us-central1.sourcemanager.dev/v1/projects/my-project/locations/us-central1/repositories/my-repo",
"html": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"git_https": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git"
}
},
"sender": {"id":4,"login":"user@example.com","full_name":"user","email":"user@example.com","avatar_url":"https://this-is-avatar.com","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T20:53:58Z","restricted":false,"username":"user@example.com"},
"review": null
}
Charge utile de l'événement de commentaire de demande d'extraction
Le contenu d'une charge utile d'événement de commentaire de demande d'extraction d'extraction est semblable à ce qui suit :
En-tête
Request URL: https://example.com?{sensitive_query_string_placeholder}
Request method: POST
Content-Type: application/json
X-SecureSourceManager-Delivery: d7bb9273-17cf-431d-835c-b334c9702eee
X-SecureSourceManager-Event: pull_request_comment
X-SecureSourceManager-Signature:
Body
{
"secret": "",
"action": "created",
"issue": {
"id": 18,
"url": "https://my-instance-123456789-api.us-central1.sourcemanager.dev/v1/projects/my-project/locations/us-central1/repositories/my-repo/issues/4",
"html_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo/pulls/4",
"number": 4,
"user": {"id":4,"login":"user@example.com","full_name":"user","email":"user@example.com","avatar_url":"https://page-address.com","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T20:53:58Z","restricted":false,"username":"user@example.com"},
"original_author": "",
"original_author_id": 0,
"title": "Open a Pull Request'",
"body": "This is the description of the pull request.",
"ref": "",
"labels": [],
"milestone": null,
"assignee": null,
"assignees": null,
"state": "open",
"is_locked": false,
"comments": 1,
"created_at": "2024-07-03T18:40:21Z",
"updated_at": "2024-07-03T18:40:21Z",
"closed_at": null,
"due_date": null,
"pull_request": {
"merged": false,
"merged_at": null
},
"repository": {
"id": 4,
"name": "my-repo",
"owner": "my-project",
"full_name": "my-project/my-repo"
},
"etag": "PSIsycnIx2xBaS1CtNRhB0qY-NCtxuHIeYlo8H12E1Q"
},
"comment": {
"id": 1,
"html_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo/pulls/4#issuecomment-1",
"pull_request_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo/pulls/4",
"issue_url": "",
"user": {"id":4,"login":"user@example.com","full_name":"user","email":"user@example.com","avatar_url":"https://page-address.com","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T20:53:58Z","restricted":false,"username":"user@example.com"},
"original_author": "",
"original_author_id": 0,
"body": "this is a comment",
"created_at": "2024-07-03T18:40:21Z",
"updated_at": "2024-07-03T18:40:21Z"
},
"repository": {
"id": 4,
"owner": {"id":2,"login":"my-project","full_name":"","email":"email-address@example.com","avatar_url":"b2653dbf52c7e078e04b8b20020eaadeafe0337787cc0e19b976efc8d594aefb","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T14:18:40Z","restricted":false,"username":"my-project"},
"name": "my-repo",
"full_name": "my-project/my-repo",
"description": "",
"empty": false,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 4,
"html_url": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"ssh_url": "git@my-instance-123456789-ssh.us-central1.sourcemanager.dev:my-project/my-repo.git",
"clone_url": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 1,
"release_counter": 1,
"default_branch": "main",
"archived": false,
"created_at": "2023-06-06T20:34:36Z",
"updated_at": "2024-07-03T18:27:42Z",
"permissions": {
"admin": false,
"push": false,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": false,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"uris": {
"api": "https://my-instance-123456789-api.us-central1.sourcemanager.dev/v1/projects/my-project/locations/us-central1/repositories/my-repo",
"html": "https://my-instance-123456789.us-central1.sourcemanager.dev/my-project/my-repo",
"git_https": "https://my-instance-123456789-git.us-central1.sourcemanager.dev/my-project/my-repo.git"
}
},
"sender": {"id":4,"login":"user@example.com","full_name":"user","email":"user@example.com","avatar_url":"https://this-is-avatar.com","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-06-02T20:53:58Z","restricted":false,"username":"user@example.com"},
"is_pull": true
}
Étapes suivantes
- Utilisez des webhooks pour vous connecter à Jenkins.
- Configurez les Webhooks.