TeamsのGitHub通知をWorkflowに置き換えたかった

Adaptive Cards、Microsoft以外使用していない説 / 2024-07-17T00:00:00.000Z

大きなグループ内の中にIT部門が独立して存在する場合、IT部門とそうではない部門で使用するツールは異なる傾向にあります。特にGitHubという設計図共有サイトは、IT部門の人々にとっては極めて有用なものであるものの、そうではない人々にとっては使いづらいツールとなりがちで、相互の一応の連携にWebhookを代表とする通知機能が使われる場合があります。

私の所属する組織もその例に漏れず、「GitHub Enterprise」アプリを通して、Microsoft Teams上の特定のチャネルに、GitHub上のIssueの更新情報などを流すといった運用をしていました。ところがどうやら雲行きが怪しいようで、何か設定を変える必要があるらしいとのことです。

というわけで何とか頑張ってみました。誰かの参考になれば幸いです。

結論

  1. Workflowを作成し、Webhook先をWorkflowの言う通りに置き換える
  2. 送られてきたJSONをAdaptive Cardsに合うように置き換える
  3. 無理だったのでGitHub側の統合ソフトを導入

Action Required

上記の通り、私の所属している組織では「 GitHub Enterprise 」アプリを通して、特定のチャネルに対してIssue等の更新情報を送信していました。このようにすることによってIT部門のメンバーは使い慣れたGitHub上におけるイシューの管理を、そうではないメンバーはTeams上で大まかにIT部門のメンバーが何をしているかを知ることが出来るようになっていました。

ところが最近以下のような通知が各Issue等の更新情報に付くようになっていました。

Action Required: O365 connectors within Teams will be deprecated and notifications from this service will stop. Learn more about the timing and how the Workflows app provides a more flexible and secure experience. If you want to continue receiving these types of messages, you can use a workflow. Set up workflow

どうやら将来的にTeamsに備えられているコネクターが非推奨になり、それを用いている通知等も停止するとのことで、「Workflow」を使用すれば従来以上にフレキシブルでセキュアな経験が得られるとのことです。「Learn More」に張られているリンクを読むと、Workflowは「ビジネスニーズに応じて拡張可能なアーキテクチャで統合を構築し、情報のセキュリティを最大限に確保」出来るらしく、遅くとも 2024年10月1日まで にはWorkflowへの移行を済ませておく必要があるらしいです。

記事の下部にはそうしたサービスのソース別に移行方法が示されているように見え、Webhook経由で駆動している現在のものをほぼ何もせずに移行できるように思えました。まあそう見えただけなのですが…。

動かない

まあ当然ながら動きません。まず考えられるのはWebhookの送信先が変更になっていることが挙げられます。Teams側から「Workflows」にアクセスします。すると一番最初の「When a Teams webhook request is received」に書かれているPOST先がどう考えても現状のものと異なります。

ということでGitHub側にログインし、Settings→Webhooksへ移動し、当該Webhookを新しいPOST先に差し替えます。そうして

Adaptive Cardsを作成

次にAdaptive Cards Designer(ログイン不要)を使用して「Adaptive Cards」を作成します。この用途ですとデフォルトで設定されている「Bot Framework WebChat」を改変するのが良いのではないかと思います。

{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "size": "Medium",
            "weight": "Bolder",
            "text": "Issue ${action}: ${issue.title}"
        },
        {
            "type": "ColumnSet",
            "columns": [
                {
                    "type": "Column",
                    "items": [
                        {
                            "type": "Image",
                            "style": "Person",
                            "url": "${issue.user.avatar_url}",
                            "altText": "${issue.user.login}",
                            "size": "Small"
                        }
                    ],
                    "width": "auto"
                },
                {
                    "type": "Column",
                    "items": [
                        {
                            "type": "TextBlock",
                            "weight": "Bolder",
                            "text": "${issue.user.login}",
                            "wrap": true
                        },
                        {
                            "type": "TextBlock",
                            "spacing": "None",
                            "text": "作成: ${issue.created_at}",
                            "isSubtle": true,
                            "wrap": true
                        }
                    ],
                    "width": "stretch"
                }
            ]
        },
        {
            "type": "FactSet",
            "facts": [
                {
                    "title": "リポジトリ:",
                    "value": "${repository.full_name}"
                },
                {
                    "title": "Issue Number",
                    "value": " ${issue.number}"
                }
            ]
        },
        {
            "type": "TextBlock",
            "text": "${issue.body}",
            "wrap": true
        }
    ],
    "actions": [
        {
            "type": "Action.OpenUrl",
            "title": "GitHubで見る",
            "url": "${issue.html_url}",
            "style": "positive"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.6"
}

設定する時は右下の「SAMPLE DATA EDITOR」にGitHubの設定画面側からコピーできる送信されたWebhookの中身を貼り付けて行うと便利です。リアルタイムに値が反映されて良いなと思いました。普通にAdaptive Cardをまともに使っている企業が無いので使う機会がそんなにないことが玉に瑕な印象がありますが…。

動かない

上記のJSONみたいなもの(実際JSONなのですが)を「アダプティブカードを投稿して応答を待機する」の「メッセージ」に入れ、テストを走らせたのですが、「ExpressionEvaluationFailed. The execution of template action 'Apply_to_each' failed: the result of the evaluation of 'foreach' expression '@triggerBody()?['attachments']' is of type 'Null'. The result must be a valid array.」と出てきます。

その後も色々こねくり回したのですが、何故か401エラーが出たり勝手にループを増やされたりしたので我慢の限界です。ローコードが素晴らしいと思っている人に設定してもらいたい。

というわけで適当に検索して出てきたGitHub + Microsoft Teams Integrationをインストールしました。最終更新が去年とちょっと怖い面もあるのですが、インストールしてみて動き何の警告も出なかったので、今回はこれで良いことにします。

関連リンク

最後に

インターネット上に情報が極めて断片的にしか存在しなかったので、他の方がこんな苦労をしなくていいように記事を書きました。結果としては動かなかったのですが、部分的な参考になれば幸いです。

Writer

Osumi Akari