【Redmine】Redmineの更新をPowerAutomateを利用してTeamsに通知する

## この記事で取り扱うこと
- 任意のRedmineの作成・更新をTeams宛に投稿すること。
- Power Automateのサンプルフロー

## この記事では取り扱わないこと
- Redmineの構築方法
- Power Automateの基本操作
- Teams以外のチャットツールへの連携

## ゴール
Teamsの任意のチャネルに対してRedmineのチケット作成情報が投稿されること。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/b19161c1-c53a-3418-5b99-59b739f4eb95.png)

## はじめに
弊社の新人研修の一つにチケット管理ツールの講義がありますが、
その中でRedmineについて取り上げて利点や使い方を説明しています。
<details><summary>ツールについてダラダラと書きます。本編に関係ないので省略。</summary>

Redmineの類似としてWrike、Jira、Backlog、Trello、Notion、~~Excel~~、、など大小さまざまなツールが跋扈しています。
その中でもRedmineはそこそこフルスタックかつオープンソースなので、自分でデプロイ・メンテナンスすればコストは低く抑えられ、プラグインなどのカスタマイズも可能なのがメリットかなと思います。
デメリットはメリットの裏返しで、自由度が高すぎてルールをしっかり定めないとカオスになりがちなのと、Rails製アプリということもありRuby・Rails・DBなどのミドルウェアの管理を自分でやらなければならないことが挙げられます。
※ただし、SaaSとしてRedmineの機能を提供するような「[My Redmine](https://hosting.redmine.jp/)」や「[Lychee Redmine](https://lychee-redmine.jp/)」などもあります。その分月額利用料は掛かります。
</details>

Redmine自体、メールの設定さえ出来ていればメール配信は行えますが、
今はリアルタイムに見るならメールよりチャットツールの方が通知先として
利用されているのかなと思います。
チャットツールというと、Slackはツール間での通知の連携は柔軟な印象で、
Redmineもググったりすれば参考記事が色々出たので、
それと比較した際、参考記事などの無さからTeamsェ...と思っていました。
（[プラグイン](https://www.redmine.org/plugins/redmine_msteams)もあるにはあるけど、2017年モノということで怪しさ満点です）
ただ、どうやらPower AutomateにRedmine連携用のコネクタがあるようで、
今回はそちらを試してみます。

今回の記事では以下記事も参考にさせていただきました。
[redmineとTeamsをMicrosoft PowerAutomateを使って連携する](https://qiita.com/xi_nesk/items/74a88911802515e8190e)

## 前準備
- 構築済みのRedmine  
今回はHerokuにデプロイしています。構築場所はAWSでもAzureでもオンプレでもどこでも構いません。
今回は素のまま利用していますが、Basic認証やIP制限などまで掛けていると今回の方法で連携が行えるか怪しいので参考程度に閲覧ください。

## Redmine連携用のトリガー
Power Automate上で関連の情報を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/607f2d1b-3a66-c1ad-0981-9783448dcc1c.png)

「コネクトとアクションを検索する」で「Redmine」と検索すると上記のプロジェクトの作成、問題の作成・更新をトリガーとすることができます。
「問題」は「イシュー」を日本語化したものかと思うのですが正直微妙なので、
今回はRedmine側に合わせて「問題」→「チケット」と表記します。

上記のトリガーを利用する際にはID,APIKey,RedmineのURLを設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/e1d55db9-62ce-018e-95bd-d89aa79df15e.png)

上記設定や試行した際の挙動から、トリガーと記載されているものの
やっていることとしてはPower Automate側で特定の間隔に一度RedmineのAPIを叩いて
プロジェクトやチケットの更新を見ているものと考えています。

<details><summary>逆にRedmine側を更新するためのアクションも以下の通り用意されています。</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/df36b589-e11c-e693-ff4f-34837ff08071.png)
</details>

## Redmineの設定
上記の通り、APIを有効化し、API Keyを取得する設定を行います。[参考](https://redmine.jp/glossary/r/rest-api/)
### APIの設定
管理者の設定メニュー上で「API」→「RESTによるWebサービスを有効にする」をチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/fa13373e-b67e-a207-ad9b-fd6c4d20c410.png)

### API Keyの発行
ユーザー毎の個人設定から右のメニューにあるAPI Keyを発行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/222c9ef8-7ed3-c58c-f1c7-d5e47edc9a0e.png)

これでPower Automateの連携用の情報が揃ったのでフロー作成に移ります。

### カテゴリーの作成
後ほど、チケットのカテゴリーに応じて配信先を分けるようにするために
カテゴリーを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/d769d396-148e-1209-2d71-3078ab1e71b9.png)

## Power Automateのフロー作成
それではフローを作成します。
概要は以下です。
1. Redmineにチケットが作成された際にトリガーする
1. 投稿先のチャネルを初期化し、作成されたチケットのカテゴリーに応じて投稿先を決定する（条件に当てはまらない場合には終了）
1. 上記で決定した配信先に配信を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/234502c9-d4bf-624f-28b7-b6c278c5966f.png)

### トリガーの設定
Redmineの「問題が作成されたとき」のトリガーを利用し、
接続の情報として以下を設定します。
- 接続名：任意の文字列　※Redmine上のIDと合わせるとAPI Keyとの関係が明確かと思います
- API Key：先ほど払い出したAPI Key
- Site url：RedmineのURL
また、接続の設定後、Redmine上の対象のプロジェクトを選択します。

### 配信先チャネルの決定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/474ee93e-e199-230a-6428-15b86e00afb0.png)

- 切替の条件
[トリガーの返り値](https://docs.microsoft.com/ja-jp/connectors/redmine/#issueresponse)として、チケットの情報が得られます。
これらの情報は「動的なコンテンツ」を設定する際に自動的にサジェストされます。
ただしカテゴリー名についてはサジェストされないため、上図のように`triggerOutputs()?['body/category/name']`のような式で取得しています。

- 各条件での変数への設定
カテゴリーの文字列に応じて変数にチャネルIDを設定しています。
ここで、TeamsでのチャネルIDについては[参考記事](https://www.teijitaisya.com/powerautomate-team-mention/#index_id6)のように取得しました。
また、条件に当てはまらない場合は配信を行わず終了としています。

### Teamsへの配信
以下のように配信先、メッセージを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/0a45b4fa-7df5-4f1b-a7b1-ba23add57cc3.png)

- 投稿者：フローボット
- 投稿先・チーム・チャネル：チャネルは上記で設定したチャネルIDを利用します。チームについては固定としています。
- メッセージ：トリガーから得られる動的なコンテンツを利用し、メッセージを構築しています。
※「チケットのリンク」の箇所では`https://{RedmineURL}/issues/⁠@{triggerOutputs()?['body/id']}`のようにリンク先を設定することで、チケットへのリンクとしています。（ただこの記述の場合、2回目以降編集画面を開くとバグりました。。）

## テスト配信
上記フローを保存したあと、Redmineでチケットを作成するとTeamsへの配信が行われます。即時で配信されるわけではなく、最大10分程度時間差がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289995/b19161c1-c53a-3418-5b99-59b739f4eb95.png)
また、想定通りカテゴリーに応じて投稿先のチャネルが振り分けられることも確認しております。

## ディスカッション
### 配信先の切替条件はカテゴリーが良い？
カテゴリーとしましたが、「トラッカー」などとすることも可能です。
デフォルトの設定ではカテゴリーは任意に追加が可能かつチケット作成時の設定が任意なので、実運用ではチケット作成時に必須項目かつマスタ管理されているような項目が良いかと思います。

### チケットの更新の場合のフローはどうする？
理想としてはチャネルに投稿されたチケット別のメッセージに対して返信を行っていくことを考えています。
2022年6月現在Teamsの投稿への返信系のアクションが[Power Automate上でバグがあるらしく](https://art-break.net/tech/?p=15001)、ご注意ください。

### Teams側の通知設定はどうする？
任意のカテゴリーやトラッカーで配信先チャネルの切替が行えるようになったので、
障害連絡は全員通知ONにしてウォッチしておく、問合せはカスタマーサポート担当者が通知ONしておくなどと決めて周知しておくと良いかと思います。

## 最後に
アラート疲れしない程度に運用や設定を設計し、必要な情報がリアルタイムで得られる生活を目指しましょう。