[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jira-chto-takoe-webhooks-v-jira-i-kak-ikh-ispolzovat":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},918,"chto-takoe-webhooks-v-jira-i-kak-ikh-ispolzovat",27,"jira","Jira","📋","Что такое Webhooks в Jira и как их использовать?","Webhook — механизм уведомления внешних систем о событиях в Jira через HTTP POST-запросы. Когда в Jira происходит определённое событие, Jira отправляет JSON-payload на указанный URL.\n\n> **Аналогия из жизни:** webhook — это как SMS-уведомление от банка. Вместо того чтобы каждые 5 минут проверять баланс (polling), банк сам отправляет вам сообщение при каждой операции (push).\n\n### Доступные события\n\n| Событие | Описание |\n|---|---|\n| `jira:issue_created` | Создание задачи |\n| `jira:issue_updated` | Обновление задачи |\n| `jira:issue_deleted` | Удаление задачи |\n| `jira:worklog_updated` | Обновление worklog |\n| `sprint_created` | Создание спринта |\n| `sprint_started` | Старт спринта |\n| `sprint_closed` | Закрытие спринта |\n| `board_created` | Создание доски |\n| `project_created` | Создание проекта |\n| `comment_created` | Добавление комментария |\n| `issuelink_created` | Создание связи |\n\n### Регистрация webhook через REST API\n\n```java\npublic void registerWebhook(String jiraBaseUrl, String token) {\n    String body = \"\"\"\n            {\n                \"name\": \"My Integration Webhook\",\n                \"url\": \"https:\u002F\u002Fmy-app.example.com\u002Fapi\u002Fjira\u002Fwebhook\",\n                \"events\": [\n                    \"jira:issue_created\",\n                    \"jira:issue_updated\"\n                ],\n                \"filters\": {\n                    \"issue-related-events-section\": \"project = PROJ AND type = Bug\"\n                },\n                \"excludeBody\": false\n            }\n            \"\"\";\n\n    restClient.post()\n            .uri(jiraBaseUrl + \"\u002Frest\u002Fwebhooks\u002F1.0\u002Fwebhook\")\n            .header(\"Authorization\", \"Bearer \" + token)\n            .body(body)\n            .retrieve()\n            .toBodilessEntity();\n}\n```\n\n### Структура payload (issue_updated)\n\n```json\n{\n    \"timestamp\": 1700000000000,\n    \"webhookEvent\": \"jira:issue_updated\",\n    \"issue_event_type_name\": \"issue_generic\",\n    \"user\": {\n        \"accountId\": \"5a1234567890\",\n        \"displayName\": \"Ivan Petrov\"\n    },\n    \"issue\": {\n        \"key\": \"PROJ-123\",\n        \"fields\": {\n            \"summary\": \"Исправить баг авторизации\",\n            \"status\": {\"name\": \"In Progress\"},\n            \"assignee\": {\"displayName\": \"Ivan Petrov\"},\n            \"priority\": {\"name\": \"Critical\"}\n        }\n    },\n    \"changelog\": {\n        \"items\": [\n            {\n                \"field\": \"status\",\n                \"fromString\": \"Open\",\n                \"toString\": \"In Progress\"\n            }\n        ]\n    }\n}\n```\n\n### Spring Boot webhook listener\n\n\u003Cdetails>\n\u003Csummary>Код JiraWebhookController\u003C\u002Fsummary>\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fjira\u002Fwebhook\")\npublic class JiraWebhookController {\n\n    private static final Logger log = LoggerFactory.getLogger(JiraWebhookController.class);\n\n    @PostMapping\n    public ResponseEntity\u003CVoid> handleWebhook(\n            @RequestBody Map\u003CString, Object> payload,\n            @RequestHeader(value = \"X-Atlassian-Webhook-Identifier\",\n                           required = false) String webhookId) {\n\n        String event = (String) payload.get(\"webhookEvent\");\n        log.info(\"Получен webhook: event={}, id={}\", event, webhookId);\n\n        switch (event) {\n            case \"jira:issue_created\" -> handleIssueCreated(payload);\n            case \"jira:issue_updated\" -> handleIssueUpdated(payload);\n            default -> log.warn(\"Неизвестное событие: {}\", event);\n        }\n\n        return ResponseEntity.ok().build();\n    }\n\n    private void handleIssueCreated(Map\u003CString, Object> payload) {\n        Map\u003CString, Object> issue = (Map\u003CString, Object>) payload.get(\"issue\");\n        String key = (String) issue.get(\"key\");\n        Map\u003CString, Object> fields = (Map\u003CString, Object>) issue.get(\"fields\");\n        String summary = (String) fields.get(\"summary\");\n        log.info(\"Создана задача: {} - {}\", key, summary);\n    }\n\n    private void handleIssueUpdated(Map\u003CString, Object> payload) {\n        Map\u003CString, Object> changelog = (Map\u003CString, Object>) payload.get(\"changelog\");\n        if (changelog != null) {\n            List\u003CMap\u003CString, Object>> items =\n                    (List\u003CMap\u003CString, Object>>) changelog.get(\"items\");\n            for (Map\u003CString, Object> item : items) {\n                if (\"status\".equals(item.get(\"field\"))) {\n                    log.info(\"Статус изменён: {} → {}\",\n                            item.get(\"fromString\"), item.get(\"toString\"));\n                }\n            }\n        }\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Безопасность\n\n- Shared Secret (DC): при регистрации webhook указывается secret, Jira подписывает payload HMAC-SHA256\n- IP Whitelisting: ограничение входящих запросов по IP Jira-инстанса\n- HTTPS: обязательно для production\n- Идемпотентность: webhook может быть доставлен повторно — обработчик должен быть идемпотентным\n\n### Частые ошибки\n\n- Синхронная тяжёлая обработка в webhook-обработчике — нужно принять webhook, ответить 200 и обработать асинхронно\n- Отсутствие валидации подписи — любой может отправить поддельный webhook\n- Нет обработки дубликатов — Jira может повторно отправить webhook при timeout\n- Регистрация webhook без JQL-фильтра — получение всех событий инстанса перегружает приложение\n\n### Как используется в 2026\n\n- В Cloud рекомендуется использовать Forge Triggers вместо прямой регистрации webhooks\n- Jira Automation (встроенная) заменяет простые webhook-сценарии (if event, then action)\n- Для DC webhooks остаются основным механизмом push-интеграции\n- Тренд на event-driven архитектуру: Jira webhook -> Kafka -> микросервисы\n\n> **На собеседовании:** подчеркните, что webhook — push-модель в отличие от polling. Обязательно упомяните идемпотентность и асинхронную обработку. Webhook должен ответить за 10 секунд (DC) \u002F 30 секунд (Cloud). Для Cloud упомяните Forge Triggers как более надёжную альтернативу.","","middle",[15,16,17,18,7],"rest-api","webhooks","event-driven","spring-boot",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Что такое Webhooks в Jira и как их использовать — Gymterview","Webhooks в Jira: события, регистрация через REST API, структура payload, Spring Boot listener, безопасность (HMAC, идемпотентность). Примеры кода.","Webhooks в Jira: события, payload, Spring Boot обработчик — Gymterview","Как использовать Jira Webhooks: push-модель уведомлений, доступные события, безопасность (HMAC-SHA256), асинхронная обработка.",[27,28,29,30,31,32,33,34],"Jira Webhooks","webhook listener","jira:issue_created","jira:issue_updated","Spring Boot","HMAC","идемпотентность","Java","Webhook — push-механизм уведомления внешних систем о событиях в Jira через HTTP POST. Доступные события: issue_created, issue_updated, sprint_started и другие. Безопасность: Shared Secret (HMAC-SHA256), HTTPS, IP Whitelisting. Webhook должен ответить за 10 секунд (DC) \u002F 30 секунд (Cloud). Обработчик должен быть идемпотентным.",true]