Redmine 7.0のWebhookを用いてMicrosoft Teamsへ通知する方法
Redmine 7.0では、チケットの作成・更新・削除などを外部サービスへ通知するWebhook機能が標準で追加されました。この記事では、RedmineのWebhookを用いて、チケットの更新をTeamsへ通知する方法を解説します。
まず、Redmineから送信されたJSONがTeamsのチャットに表示されることを確認します。 その後、Power AutomateでJSONを解析し、次の2種類の通知を作成します。
- チケットの担当者が特定のユーザーへ変更されたときの通知
- 特定のユーザーが担当しているチケットにコメントが追加されたときの通知
目次
Teamsへのチャット通知を確認する
1. この記事で作成する連携
この記事で作成する連携の構成は次のとおりです。
Redmine 7.0
↓ Redmine標準のWebhook JSON
Teams Workflows
↓
フロー ボットから指定ユーザーとのチャットへ投稿
2. 動作確認環境
この記事で使用する環境は次のとおりです。
| 項目 | 環境 |
|---|---|
| Redmine | Redmine 7.0.0 |
| Power Automate | Teams Workflowsから作成したクラウドフロー |
| Microsoft Teams | バージョン 26198.202.4929.7171 |
| Microsoft 365 | Microsoft 365 Business Basic |
| ブラウザ | Chrome |
| OS | macOS 26.6 |
| 投稿先 | フロー ボットから指定したユーザーとのチャット |
| 動作確認日 | 2026年8月6日 |
3. 安全に利用するための注意事項
RedmineのWebhookには、チケットの件名、プロジェクト、担当者、コメント、更新者などの情報が含まれます。
最初は、外部サービスへ送信しても問題のないテスト用プロジェクトとテスト用チケットを使用してください。
また、次の点に注意してください。
- Webhookを登録するユーザーには必要最小限の権限を設定する
- Teams WorkflowsのWebhook URLを公開しない
- Power Automateの実行履歴にチケット情報が記録されることを認識する
この記事では、Teams Webhookトリガーの認証方法として次を選択します。
Anyone
この設定では、Webhook URLを知っている第三者からもフローを呼び出せる可能性があります。Teams WorkflowsのWebhook URLは、パスワードやAPIキーと同様に秘密情報として管理してください。
4. Teams WorkflowsでWebhookを受信するフローを作成する
Microsoft Teamsを開き、左側の「ワークフロー」を選択します。
「ワークフロー」が表示されていない場合は、「アプリ」から検索してください。
「最初から構築」を選択します。
次のトリガーを追加します。 表示されない場合は、「Power Automateでの構築で、より多くのトリガーを表示する」を選択し、Power Automateから追加してください。
Webhook 要求を受信したとき
認証方法は次を選択します。
Anyone
Teams WorkflowsでWebhook要求を受信する
新しいステップを選択し、次のアクションを追加します。
チャットまたはチャネルでメッセージを投稿する
各項目を次のように設定します。
| 項目 | 設定内容 |
|---|---|
| 投稿者 | フロー ボット |
| 投稿先 | フロー ボットとチャットをする |
| Recipient | 投稿先ユーザーのメールアドレス |
| メッセージ | @{string(triggerBody())} |
メッセージ欄で</>をクリックしてコードビューに切り替え、次の式を貼り付けます。
キーボードで直接入力すると、式ではなく文字列として処理されます。
@{string(triggerBody())}
フローに次の名前をつけて保存します。
RedmineからTeamsへのデータ送信
上記の設定では、RedmineのJSON文字列をそのままチャットへ投稿します。
受信したRedmineのJSON文字列をフロー ボットとのチャットへ投稿する
フローを保存したら、「When a Teams webhook request is received」を開きます。 「HTTP POSTのURL」欄にある「URLのコピー」をクリックし、Webhook URLをコピーして安全な場所へ一時的に保存してください。 コピーしたURLは、RedmineのWebhook送信先として使用します。
Redmineへ登録するWebhook URLを取得する
5. RedmineでWebhookを有効にする
Redmineの管理者アカウントでログインし、次の順に開きます。
管理 > 設定 > 連携
「Webhookを有効にする」にチェックを入れ、「保存」をクリックします。
Redmine全体でWebhookを有効にする
6. Webhookを利用する権限を設定する
Webhookを登録するユーザーが所属するロールに、Webhookを利用する権限を設定します。
Redmineの管理画面から、次の順に開きます。
管理 > ロールと権限 > Webhookを登録するユーザーのロール
権限の一覧から「Webhookの使用」にチェックを入れ、「保存」をクリックします。
Webhookを登録するユーザーのロールに権限を設定する
RedmineのWebhookは、Webhookを登録したユーザーの権限で動作します。登録したユーザーが閲覧できないチケットのイベントは送信されません。
7. RedmineにWebhookを登録する
Webhookを登録するユーザーでRedmineにログインし、「個人設定」を開きます。
Webhookが有効で、ユーザーに権限がある場合は、「Webhook」が表示されます。
「Webhook」を開き、新しいWebhookを作成します。設定例は次のとおりです。
| 項目 | 設定内容 |
|---|---|
| URL | Teams Workflowsで発行されたHTTP POST URL |
| Secret | 空欄 |
| イベント | Issueを更新しました |
| プロジェクト | テストプロジェクト |
| 有効 | ON |
Teams WorkflowsをRedmineのWebhook送信先として登録する
Redmineの「Secret」を設定すると署名がHTTPヘッダーへ追加されますが、この記事では署名検証を行わないため空欄にします。
8. Redmineから送信されたデータをTeamsで確認する
すべての設定が完了したら、テストプロジェクトのチケットを開きます。
以降の手順で使用しますので、チケットには担当者を設定してください。 テスト用のコメントを追加して、チケットを更新してください。
Teams連携の動作確認です。
Teamsのフロー ボットとのチャットに、次のようなRedmineのJSONが表示されることを確認します。
{
"type": "issue.updated",
"timestamp": "...",
"data": {
"issue": {
"id": ...,
...
"subject": "テスト用チケット",
...
},
...,
"journal": {
"notes": "Teams連携の動作確認です。",
...,
},
...
}
}
実際には、プロジェクト、トラッカー、ステータス、担当者、更新者など、チケットに関するほかの情報も含まれます。 後の手順で使用するため、表示されたJSONをテキストファイルなどにコピーしておいてください。
TeamsのチャットにJSONが表示されれば、次の通信経路が動作しています。
Redmine
↓
Teams Workflows
↓
Microsoft Teams
ここまで確認できれば、RedmineとTeamsの接続は完了です。
以降の手順では、動作確認用の投稿を削除し、このJSONをPower Automateで解析して通知条件と表示内容を設定します。
実用的なチャット通知例
9. Power AutomateでRedmineのJSONを解析する
RedmineのJSONはTeams WorkflowsのWebhookトリガーが受信します。Power Automateでは、トリガーの本文を「JSON の解析」で処理します。 以降は操作が複雑になるため、「https://make.powerautomate.com/」でフローを編集します。 画面左側の「マイ フロー」から作成したフローを開き、「編集」をクリックしてください。「新しいデザイナー」がオフの場合は、オンに変更します。
Power Automateで作成したフローを開く
9.1 動作確認用の投稿を削除する
RedmineからTeamsまでの接続を確認するために追加した「チャットまたはチャネルでメッセージを投稿する」アクションを削除します。
このアクションを残すと、チケットを更新するたびに、生のJSONと整形後のAdaptive Cardが両方とも投稿されます。
9.2 RedmineのJSONを解析する
トリガーの直下へ、JSON の解析を追加します。
アクション名を次のように変更します。
Redmine-JSONの解析
「Content」には、Teams Webhookトリガーの「本文」を選択します。
「/」を入力し、「動的コンテンツを挿入する」を選択することで、本文が選択できます。
「Schema」の「サンプル ペイロードを使用してSchemaを生成する」を選択し、手順8でTeamsのチャットへ表示されたRedmineのJSONを貼り付け、「完了」をクリックします。 「Schema」欄に生成されたスキーマが表示されます。
RedmineのWebhook JSONをPower Automateで利用できる形に解析する
10. 通知対象ユーザーと変数を設定する
10.1 通知対象ユーザーのIDを確認する
通知対象ユーザーのIDには、Redmineの表示名ではなくユーザーIDを使用します。ユーザーIDは、ユーザープロフィールのURLで確認できます。例えば、プロフィールURLが次の場合、ユーザーIDは5です。
https://redmine.example.net/users/5
以降の例では、通知対象ユーザーのIDを5とします。実際のユーザーIDへ置き換えてください。
10.2 変数を初期化する
「Redmine-JSONの解析」の下へ、「変数を初期化する」を追加します。
次の変数を、それぞれ別のアクションで初期化します。
| 名前 | タイプ | 値 |
|---|---|---|
notification_title |
文字列 | 空欄 |
notification_body |
文字列 | 空欄 |
notification_color |
文字列 | Accent |
notification_titleが空欄の場合、Teamsには投稿されません。担当者変更またはコメント追加の条件に一致したときだけ、通知用の変数に値を設定します。
11. 担当者変更を判定する
最初に、「今回の更新によって、担当者が通知対象ユーザーへ変更されたか」を判定します。
現在の担当者だけを条件にすると、そのユーザーが担当するチケットが更新されるたびに通知されます。今回の更新で担当者が変更されたかどうかは、data.journal.detailsで確認します。
担当者をユーザーID5へ変更した場合、概ね次の情報が含まれます。
property = attr
prop_key = assigned_to_id
value = 5
11.1 担当者変更を抽出する
最後の「変数を初期化する」アクションの下へ、「アレイのフィルター処理」を追加します。
「From」には、下記を貼り付けます。
@{body('Redmine-JSONの解析')?['data']?['journal']?['details']}
Filter Queryでは「詳細設定モードで編集する」を選択し、次の式を貼り付けます。
@and(
equals(item()?['property'], 'attr'),
equals(item()?['prop_key'], 'assigned_to_id'),
equals(string(item()?['value']), '5')
)
今回の更新に含まれる担当者変更を抽出する
11.2 担当者変更の有無を判定する
「アレイのフィルター処理」の下へ「条件」を追加し、フィルター結果が1件以上か判定します。
「条件」アクションを追加し、名称を担当者変更の有無を判定するにします。
左側の値を選択しますに下記を貼り付けます。
@{length(body('アレイのフィルター処理'))}
条件はより大きいを選択し、右の値を選択しますは0にします。
条件の「True」側で、次の変数を設定します。
| 名前 | 値 |
|---|---|
notification_title |
チケットの担当者に設定されました |
notification_color |
Accent |
notification_body |
チケット番号、件名、プロジェクト、ステータス、優先度、担当者、更新者などの情報 |
notification_bodyには、下記を貼り付けます。
#@{body('Redmine-JSONの解析')?['data']?['issue']?['id']} @{body('Redmine-JSONの解析')?['data']?['issue']?['subject']}
プロジェクト: @{body('Redmine-JSONの解析')?['data']?['issue']?['project']?['name']}
ステータス: @{body('Redmine-JSONの解析')?['data']?['issue']?['status']?['name']}
優先度: @{body('Redmine-JSONの解析')?['data']?['issue']?['priority']?['name']}
担当者: @{body('Redmine-JSONの解析')?['data']?['issue']?['assigned_to']?['name']}
更新者: @{body('Redmine-JSONの解析')?['data']?['journal']?['user']?['name']}
これは次のような内容を設定しています。
#13 VPNに接続できない
プロジェクト: テストプロジェクト
ステータス: 新規
優先度: 通常
担当者: 赤田 舞
更新者: 佐藤 一郎
12. コメント追加を判定する
担当者変更を判定する条件の「False」側に、もう一つ「条件」を追加します。
判定する内容は次の2つです。
- 現在の担当者が通知対象ユーザーである
- 今回の更新にコメントが入力されている
「条件」アクションを追加し、名称をコメント追加を判定するにします。
2つの条件をどちらも満たす必要があるため、条件の結合方法にはかつを選択してください。
左側の値を選択しますに下記を貼り付けます。
@{body('Redmine-JSONの解析')?['data']?['issue']?['assigned_to']?['id']}
条件は等しいを選択し、右の値を選択しますは5にします。
5は、通知対象ユーザーのRedmineユーザーIDへ置き換えてください。
2行目の条件の左側の値を選択しますに下記を貼り付けます。
@{body('Redmine-JSONの解析')?['data']?['journal']?['notes']}
条件は異なるを選択し、右の値を選択しますは空欄にします。
条件の「True」側で、次の変数を設定します。
| 名前 | 値 |
|---|---|
notification_title |
担当中のチケットにコメントが追加されました |
notification_color |
Warning |
notification_body |
チケット番号、件名、コメント投稿者、コメント本文、現在の担当者、現在のステータスなどの情報 |
notification_bodyには、下記を貼り付けます。
#@{body('Redmine-JSONの解析')?['data']?['issue']?['id']} @{body('Redmine-JSONの解析')?['data']?['issue']?['subject']}
コメント投稿者: @{body('Redmine-JSONの解析')?['data']?['journal']?['user']?['name']}
@{body('Redmine-JSONの解析')?['data']?['journal']?['notes']}
担当者: @{body('Redmine-JSONの解析')?['data']?['issue']?['assigned_to']?['name']}
ステータス: @{body('Redmine-JSONの解析')?['data']?['issue']?['status']?['name']}
これは次のような内容を設定しています。
#12 VPNに接続できない
コメント投稿者: 佐藤 一郎
接続時に表示されたエラー画面を添付しました。
確認をお願いします。
担当者: 赤田 舞
ステータス: 進行中
この条件ではコメントの投稿者を判定していません。そのため、通知対象ユーザー自身がコメントを追加した場合も通知されます。
担当者変更の有無、コメント追加の有無を判定する条件設定
13. Adaptive Cardを1つだけ作成してTeamsへ投稿する
どちらの通知にも同じAdaptive Card投稿アクションを使用します。条件分岐内では通知用の変数だけを設定し、分岐後にAdaptive Cardを1回投稿します。
13.1 通知が必要か判定する
担当者変更を判定する「条件」の後へ、もう一つ「条件」を追加します。
notification_titleが空でない場合を「True」と判定します。
「条件」アクションを追加し、名称を通知が必要か判定するにします。
左側の値を選択しますに下記を貼り付けます。
@{variables('notification_title')}
条件は異なるを選択し、右の値を選択しますは空欄にします。
13.2 Adaptive Card投稿アクションを追加する
条件の「True」側へ、Microsoft Teamsの次のアクションを追加します。
チャットまたはチャネルにカードを投稿する
各項目を次のように設定します。
| 項目 | 設定内容 |
|---|---|
| 投稿者 | フロー ボット |
| 投稿先 | フロー ボットとチャットをする |
| Recipient | 通知先ユーザーのメールアドレス |
「アダプティブ カード」欄には、次を貼り付けます。
{
"$schema": "https://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "Container",
"style": "emphasis",
"items": [
{
"type": "TextBlock",
"text": "@{variables('notification_title')}",
"weight": "Bolder",
"size": "Medium",
"color": "@{variables('notification_color')}",
"wrap": true
}
]
},
{
"type": "TextBlock",
"text": "@{variables('notification_body')}",
"wrap": true
}
],
"actions": [
{
"type": "Action.OpenUrl",
"title": "チケットを開く",
"url": "@{concat('https://redmine.example.net/issues/', string(body('Redmine-JSONの解析')?['data']?['issue']?['id']))}"
}
]
}
https://redmine.example.netは、実際のRedmineのURLへ置き換えてください。
条件に一致した場合だけ共通のAdaptive Cardを投稿する
14. 担当者変更通知を確認する
「保存」をクリックし、Power Automateのフローを保存します。
Redmineでテスト用チケットを開き、担当者を別のユーザーから通知対象ユーザーへ変更します。
Teamsのフロー ボットとのチャットに、次のような通知が届くことを確認します。
チケットの担当者に設定されました
#13 VPNに接続できない
プロジェクト: テストプロジェクト
ステータス: 新規
優先度: 通常
担当者: 赤田 舞
更新者: 佐藤 一郎
[チケットを開く]
次の内容が正しく表示されていれば、担当者変更通知の設定は完了です。
- 通知タイトル
- チケット番号と件名
- プロジェクト
- ステータス
- 優先度
- 新しい担当者
- 更新者
- チケットを開くボタン
担当者に設定されたことがTeamsのチャットへ通知された
15. コメント追加通知を確認する
通知対象ユーザーが担当しているテスト用チケットに、次のコメントを追加します。
接続時に表示されたエラー画面を添付しました。
確認をお願いします。
Teamsのフロー ボットとのチャットに、次のような通知が届くことを確認します。
担当中のチケットにコメントが追加されました
#13 VPNに接続できない
コメント投稿者: 佐藤 一郎
接続時に表示されたエラー画面を添付しました。
確認をお願いします。
担当者: 赤田 舞
ステータス: 進行中
[チケットを開く]
次の内容が正しく表示されていれば、コメント追加通知の設定は完了です。
- 通知タイトル
- チケット番号と件名
- コメント投稿者
- コメント本文
- 現在の担当者
- 現在のステータス
- チケットを開くボタン
担当中のチケットにコメントが追加されたことが通知された
Microsoft Teamsコネクタで投稿できるメッセージのサイズには上限があります。
非常に長いコメントを扱う場合は、コメントを一定の文字数で切り詰め、全文はRedmineのチケットで確認する運用を検討してください。
16. 担当者変更とコメント追加を同時に行った場合の動作について
Redmineでは、1回の更新で担当者の変更とコメントの追加を同時に行えます。
この記事では、担当者変更の条件の「False」側にコメント追加の条件を配置しています。つまり、判定順は次のようになります。
担当者が通知対象ユーザーへ変更されたか
↓
はい
↓
担当者変更通知
↓
コメント追加は判定しない
担当者変更ではない
↓
現在の担当者が通知対象ユーザーか
↓
コメントが追加されているか
↓
はい
↓
コメント追加通知
そのため、次の操作を同時に行うと、Teamsには担当者変更通知だけが1件投稿されます。
- 担当者を通知対象ユーザーへ変更する
- コメントを入力する
- チケットを更新する
コメント追加通知を別に投稿したい場合は、2つの条件を独立させてください。担当者変更通知へコメントも含めたい場合は、担当者変更時のnotification_bodyへjournal.notesを追加します。
トラブルシューティング
正常に動作しない場合は、次の項目を確認してください。
Teamsのチャットにデータが表示されない
Power Automateの実行履歴を開き、Webhookトリガーが実行されているか確認してください。
- 実行履歴がない場合は、Redmineに登録したWebhook URLとRedmineから外部へのHTTPS接続を確認する
- フローが失敗している場合は、失敗したアクションのエラーを確認する
- フローが成功している場合は、投稿先ユーザーとTeamsのチャットを確認する
18. まとめ
この記事では、Redmine 7.0のWebhookで送信されたデータをMicrosoft Teamsのチャットへ表示し、そのJSONをPower Automateで解析して通知する方法を紹介しました。
構成は次のとおりです。
Redmine
↓
Teams Workflows
↓
Power AutomateでJSONを解析・条件判定
↓
フロー ボットからTeamsユーザーとのチャットへAdaptive Cardを投稿
最初に生のJSONをTeamsへ投稿して通信経路を確認した後、Power AutomateでJSONを解析し、次の通知を設定しました。
- チケットの担当者が特定のユーザーへ変更されたときの通知
- 特定のユーザーが担当しているチケットにコメントが追加されたときの通知
通知条件と表示内容はPower Automate側へ集約しているため、フローを編集して通知内容を調整できます。
Webhookにはチケットやコメントの情報が含まれます。Webhookを登録するユーザー、対象プロジェクト、Teams WorkflowsのWebhook URL、Power Automateの実行履歴を適切に管理してください。