> ## Documentation Index
> Fetch the complete documentation index at: https://docs.corgea.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Slack

> CorgeaのWebhookでSlack通知を設定する方法

**Integrations → Webhooks**でSlack Workflow BuilderのWebhookを接続し、Corgeaのアラートを送信します。

<Warning>
  Automation Integrationsにある単独の**Slack**項目は非推奨です。新しいSlack通知は**Webhooks**で作成してください。既存のSlack連携は引き続き動作します。**View All**からテストまたは削除できます。
</Warning>

<Frame>
  <img src="https://mintcdn.com/corgea/bUShOerLaxHbdmO7/images/webhooks/webhooks_integrations.png?fit=max&auto=format&n=bUShOerLaxHbdmO7&q=85&s=e84b9d7d75569f68d644ada376ea16bf" alt="非推奨とマークされた Slack 自動化統合" style={{ borderRadius: '0.5rem' }} width="1641" height="240" data-path="images/webhooks/webhooks_integrations.png" />
</Frame>

## 前提条件

* Corgeaの管理者アクセス
* Slackワークスペース内でワークフローを作成する権限

## Slackワークフロービルダーの設定

Slack Workflow Builderを使用すると、Corgeaの**トップレベル**のペイロードフィールドをチャンネルメッセージにマッピングできます。

<Warning>
  Slack Workflow Builderがサポートするのは**トップレベルのJSONキーのみ**です。`data.message`や`data.summary.total_issues`のようなネストされたパスは**サポートされず**、通常はHTTP 400 `invalid_workflow_input`が返されます。

  `Type = Slack`とWorkflow BuilderのURL（`hooks.slack.com/triggers/...`）を使用する場合、Corgeaがトップレベルのペイロードにフラット化するのは、`scan.started`、`scan.completed`、`scan.failed`、`webhook.test`**のみ**です。ネストされた`data.*`ではなく、`message`、`pull_request_id`、`scan_url`、`true_positive_count`をマッピングします。

  同じSlackWebhook上の他の購読イベント(例: `issue.status_changed` や `sla.violation`)は引き続きネストされたエンベロープを受け取ります。Workflow Builderのスキャンライフサイクルサブスクリプションを優先するか、イベントにはカスタムボディ/非Slackの宛先を使うのが良いでしょう。
</Warning>

<Steps>
  <Step title="ワークフローを作成する">
    1. Slackでワークスペースメニューを開く
    2. **Tools → Workflow Builder**を開く
    3. **Create**をクリックする
    4. トリガーとして**Webhook**を選択する
    5. ワークフローに名前を付けて続けます
  </Step>

  <Step title="ワークフローステップの設定">
    1. ワークフロービルダーのWebhookURLをコピーする(`hooks.slack.com/triggers/...`)
    2. **Webhook**トリガーのステップで、Corgeaのトップレベルキーと同じ名前の**変数を追加**します（Slackはペイロードフィールドを自動検出しません）。少なくとも`message`、`pull_request_id`、`scan_url`、`true_positive_count`、`scan_id`、`event_type`、`project_name`、`status`、`branch`、`company`を追加します。
    3. **Send a message**ステップを追加します（必須。Corgea単独ではSlackに投稿しません）
    4. **Insert a variable**を使用して、Webhookの変数をメッセージに挿入します（`{message}`というテキストを直接入力しても動作しません）

    CorgeaがWorkflow Builderに送信するフラットな`scan.completed`ボディの例です。ネストされた`project`、`summary`、`scheduled_scan_ids`は**含まれません**。

    ```json theme={null}
    {
      "event_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "event_type": "scan.completed",
      "timestamp": "2025-01-15T15:45:00.000Z",
      "message": "Scan completed for My Project (PR #42): 5 true-positive findings. View: https://app.corgea.app/project/proj-uuid-9012/?scan_id=scan-uuid-7890",
      "scan_id": "scan-uuid-7890",
      "scan_url": "https://app.corgea.app/project/proj-uuid-9012/?scan_id=scan-uuid-7890",
      "scan_type": "full",
      "pull_request_id": "42",
      "true_positive_count": 5,
      "status": "completed",
      "branch": "feature/auth",
      "project_name": "My Project",
      "company": "comp-uuid-1234",
      "run_id": "run-abc",
      "engine": "corgea"
    }
    ```

    `scan.failed`では、存在する場合にトップレベルの`error`もフラットなボディに含まれます。

    まず、送信可能な要約として`message`を使用し、プルリクエストのトリアージ用に`pull_request_id`、`scan_url`、`true_positive_count`を追加します。

    完了したスキャンの`message`では、問題の総数ではなく、**誤検知でない検出結果**の件数が使用されます。
    `Scan completed for {project} (PR #N): X true-positive finding(s) [(Y with fixes)]. View: {scan_url}`
    `Y with fixes`は、その誤検知でない検出結果に対する修正のみを数えます。

    5. ワークフローを完成させて公開する
  </Step>

  <Step title="Corgeaで設定">
    1. **Integrations → Webhooks**に移動する
    2. 新しいWebhookを作成する
    3. **Type**を`Slack`に設定する
    4. 名前を入力し、ワークフロービルダーのURLを貼り付けます
    5. `scan.completed` および/または `scan.failed` の購読(オプションで `scan.started`)
    6. **スキャンイベントフィルター** (任意):
       * **プルリクエスト/マージリクエストスキャンのみ** — PR以外のスキャンはスキップ
       * **誤検知でない検出結果がある完了済みスキャンのみ** — `true_positive_count`が0の場合は`scan.completed`をスキップします（`scan.failed`には影響しません）
    7. **Webhook作成** をクリックして、ワンタイムのシークレットキーを保存します
    8. **Test**をクリックして配信を確認する
  </Step>
</Steps>

## Webhookテストで想定される結果

Slackワークフロービルダーの送信先で **テストWebhook** をクリックすると、Corgeaは次のようなフラットサンプルを送信します:

```json theme={null}
{
  "event_id": "...",
  "event_type": "webhook.test",
  "timestamp": "2025-01-15T15:45:00.000Z",
  "message": "This is a test webhook from Corgea",
  "test": true,
  "webhook_name": "My Slack Hook",
  "company": "comp-uuid-1234",
  "company_id": "comp-uuid-1234",
  "scan_id": "00000000-0000-0000-0000-000000000000",
  "scan_url": "https://app.corgea.app/project/example/?scan_id=00000000-0000-0000-0000-000000000000",
  "scan_type": "full",
  "pull_request_id": "123",
  "true_positive_count": 2,
  "status": "completed",
  "branch": "main",
  "project_name": "Example Project",
  "run_id": "test-run",
  "engine": "corgea"
}
```

`company`は実際のスキャンイベントと同じ値です。`company_id`は従来のテストクライアント向けに用意された同じ値です。Slack以外の送信先では、同じフィールドが通常のエンベロープの`data`内にネストされて届きます。

想定される結果:

* SlackからHTTP 2xxが返される（400 `invalid_workflow_input`ではない）
* トップレベルの`message`変数をマッピングすると、空でないSlackメッセージが届く
* 本番スキャンイベントと同じ変数名を使用できる（テスト時にプルリクエスト番号、スキャンリンク、誤検知でない検出結果の件数をマッピング可能）

## 通知内容

Slack Workflow Builder（`Type = Slack` + `hooks.slack.com/triggers/...`）では、次の**トップレベルフィールド**をマッピングします。

| フィールド                 | 説明                                                   |
| --------------------- | ---------------------------------------------------- |
| `message`             | そのまま送信できる概要（プルリクエスト番号、誤検知でない検出結果の件数、利用可能な場合はスキャンURL） |
| `event_type`          | e.g. `scan.completed`, `scan.failed`, `webhook.test` |
| `event_id`            | デリバリーイベント UUID                                       |
| `timestamp`           | ISO 8601 タイムスタンプ                                     |
| `scan_id`             | スキャンのUUID                                            |
| `scan_url`            | Corgea内のスキャンへのディープリンク                                |
| `scan_type`           | スキャンタイプを示す文字列                                        |
| `pull_request_id`     | プルリクエストスキャンの場合はPR/MR番号(PRでない場合は空)                    |
| `true_positive_count` | 誤検知を除き、コード品質を除いた削除されていないセキュリティ検出結果                   |
| `status`              | `started`、 `completed`、または `failed`                  |
| `branch`              | Git branch                                           |
| `project_name`        | プロジェクト名                                              |
| `company`             | 会社ID(ライブスキャンペイロードと同じキー)                              |
| `company_id`          | `company` と同じ値(`webhook.test` のみ、ライブ `scan.*`ではなし)   |
| `run_id`              | スキャン実行ID                                             |
| `engine`              | スキャナーエンジン                                            |
| `error`               | 失敗理由(`scan.failed` がある場合のみ)                          |
| `test`                | `webhook.test`の場合のみ`true`                            |
| `webhook_name`        | Webhook表示名(`webhook.test` のみ)                        |

`true_positive_count`はスキャンUIのセキュリティ件数と一致し、`status=false_positive`、`hold_reason=false_positive`、`detected_by=code-quality`を除外します。`summary`、`project`、`scheduled_scan_ids`、`scan_errors`、`created_at`、`processed_at`などのネストされたフィールドは、Zapier/Otherと配信履歴では`data`内で利用できますが、Slack Workflow Builderではフラット化されません。

## 互換性に関する注意事項

* **Zapier / その他:** は依然として入れ子状のエンベロープ(`event_id`、 `event_type`、 `timestamp`、 `data`)を受け取ります。これには `data.message`、 `data.summary`、および `data`の下にある新しいトリアージフィールドが含まれます。
* ネストされた`data.*`をマッピングしている**既存のSlack Workflow Builder設定**は動作しません。`data.message`ではなく`message`など、トップレベルのキーに再マッピングします。
* Corgeaの**配信履歴**には、SlackがフラットなHTTPボディを受信する場合でも、ネストされたエンベロープが保存されます。
* Slack Workflow BuilderのWebhookでは、**スキャン以外のイベント**はフラット化されません。利用可能なSlack変数が必要な場合は、Zapier、Other、またはCustom Bodyを使用してください。

## Incoming WebhooksとWorkflow Builderの比較

* **推奨**：Workflow BuilderのURL（`hooks.slack.com/triggers/...`）と**Send a message**ステップを使用します。Corgeaは`Type = Slack`に対して`scan.*`と`webhook.test`をフラット化します。
* **Incoming Webhooks**（`hooks.slack.com/services/...`）:レンダリング後のJSONに、トップレベルで空でない文字列の`text`フィールドが含まれる[Custom Body](/ja/webhooks)を追加しない限り、保存時に拒否されます。Slackのフォールバックテキストとして`text`が必要で、任意で`blocks`も併用できます。`{"text": "{{message}}"}`が機能するのは、Webhookを`scan.started`、`scan.completed`、`scan.failed`、`scheduled_scan.daily_report`に限定した場合だけです（その他のイベントでは`{{message}}`が空になります）。有効なボディがないと配信に失敗し、Webhookが自動停止する可能性があります。

## 既存のSlack統合管理

非推奨のSlack項目に既存の連携がある場合は、**View All**を開いてテストまたは削除します。

<Frame>
  <img src="https://mintcdn.com/corgea/bUShOerLaxHbdmO7/images/webhooks/slack_view_all_modal.png?fit=max&auto=format&n=bUShOerLaxHbdmO7&q=85&s=82712d185c56db9be7b35b1e8eff1931" alt="既存の統合管理のためのすべての Slack 統合モードを見る" style={{ borderRadius: '0.5rem' }} width="839" height="350" data-path="images/webhooks/slack_view_all_modal.png" />
</Frame>

## カスタマイズオプション

ワークフロービルダーを使えば、以下のことが可能です:

* メッセージを重大度やプロジェクトごとに異なるチャネルにルーティングする
* リマインダーやフォローアップの手順を追加する
* スキャン結果を中心に条件付き論理を構築する(例: `true_positive_count` が0より大きい時のみ通知)
* 同じペイロード変数を複数のアクションで再利用する

Zapierなどのサードパーティ製フラット化ツールを使用せず、スケジュールスキャンやフルスキャンからの不要な通知を避けるには、Corgeaの**Scan Event Filters**（プルリクエストのみ、検出結果がある完了済みスキャンのみ）を使用します。

## 追加リソース

* [Slack ワークフロービルダーガイド](https://slack.com/help/articles/360035692513-Guide-to-Workflow-Builder)
* [ワークフロービルダーの JSON をフラット化する](https://slack.dev/flatten-json-for-workflow-builder/)
* [Corgea Webhook](/ja/webhooks)
