Workflowsを利用したGitlab – Teams通知設定

初めに

従来はTeamsOffice365コネクタを利用して、GitlabからTeamsWebhook要求を送信しTeams側の指定チャネルに更新通知を投稿することが可能でした。
ただ2024年にアナウンスがあり以下の日程で廃止することが決まっています。

https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/

2024年08月15日:新規コネクタの作成不可
2025年12月31日:TeamsOffice365コネクタサービス停止
 ※元々は2024年10月01日サービス停止予定だったが延期

移行先としてWorkflowsを利用した通知方法が公開されていますが、通知元がアダプティブカード形式でメッセージを送信する必要があります。

https://support.microsoft.com/en-us/office/create-incoming-webhooks-wit

今回はGitlab側がアダプティブカード形式での通知メッセージに対応していないためGitlab通知用のWorkflowsを作成しました。
ゴールとしては
 Gitlabリポジトリの各種更新通知をTeamsのプライベートチャネルに投稿する
という内容になります。
 ※Gitlabバージョン:15.11

通知投稿イメージ

本記事は以下のissueを参考にしています
Microsoft Teams notifications integration to stop working October 1st, 2024

事前準備

通知チャネル/ユーザーの設定
通知用のプライベートチャネルを作成し作成ユーザーを参加させてください。
デフォルトでは作成ユーザーが通知の投稿ユーザーになります。
一般チャネルであれば bot が利用できますがプライベートチャネルでの投稿には
利用できないため実際のユーザーが通知を行います。

手順1 – Workflowsの作成

Teams左部のアプリメニューから Workflows を選択

WorkFlowsのホームが表示されたら新しいフローを選し必要事項を入力し新規フローを作成
以下の画面が表示されたらWebhook用のURLを退避
※作成したフローからも確認は可能です

手順2 – Workflowの設定

注意点
 編集中にページを閉じてしまうと編集内容が破棄されてしまいます
 閉じる場合は必ず保存してください

ホームに戻り作成されたフローを選択し 編集 を選択
以下のフローが表示されたら不要な Send each adaptive card を削除

新しいステップ → 検索窓に JSON と入力 → JSONの解析 アクションを選択
名前を Parse JSON に変更(後述するアクションで参照するため)
コンテンツに動的コンテンツの 本文 を、スキーマに以下を設定

{
    "type": "object",
    "properties": {
        "sections": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "activityTitle": {
                        "type": "string"
                    },
                    "activitySubtitle": {
                        "type": "string"
                    },
                    "activityText": {
                        "type": "string"
                    },
                    "activityImage": {
                        "type": "string"
                    },
                    "text": {
                        "type": "string"
                    }
                },
                "required": []
            }
        },
        "title": {
            "type": "string"
        },
        "summary": {
            "type": "string"
        }
    }
}

新しいステップ → 検索窓に 変数 と入力 → 変数名を初期化する アクションを選択
以下の値を設定する
 名前:cardBody
 種類:アレイ
  値:入力不要
cardBody変数はアダプティブカードの出力情報格納のために利用します

再度同様の手順を実施し以下の値を設定する
以下の値を設定する
 名前:title
 種類:文字列
  値:@body(‘Parse_JSON’)?[‘title’]

新しいステップ → 検索窓に 変数 と入力 → 配列変数に追加 アクションを選択
以下の値を設定する
 名前:cardBody
  値:以下を設定

{
  "type": "TextBlock",
  "text": @{variables('title')},
  "id": "Title",
  "size": "Large"
}

再度同様の手順を実施し以下の値を設定する
 名前:cardBody
  値:以下を設定

{
  "type": "TextBlock",
  "fontType": "Default",
  "size": "Default",
  "wrap": true,
  "text": "@{body('Parse_JSON')?['summary']}"
}

新しいステップ → 検索窓に コントロール と入力 → 条件 アクションを選択
判定文に以下を設定
  判定式:title
 判定条件:次のもので終わる
  判定値:送信元のリポジトリ名(今回はGitlab-Noticeリポジトリ)
この判定でタイトルからリポジトリごとに通知先のチャネルを切りかえます

作成された判定ブロックの はいの場合 のアクションの追加を選択
検索窓に コントロール と入力 → 条件 アクションを選択
判定分に以下を設定
  判定式:length(body(‘Parse_JSON’)?[‘sections’])(式タブに切り替えて入力)
 判定条件:次の値に等しい
  判定値:1
この判定の目的としては通知イベントによって詳細情報が存在するもの(pushなど)があるためです。
2以上であればcardBodyに詳細情報を追加します

作成された判定ブロックの はいの場合 のアクションの追加を選択
検索窓に Teams と入力 → チャットまたはチャネルでメッセージを投稿する アクションを選択
以下を設定
   投稿者:ユーザー
   投稿先:チャネル
   チーム:投稿先のチーム
  チャネル:投稿先のチャネル
 メッセージ:以下を設定

{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.4",
    "body": @{variables('cardBody')}
}

作成された判定ブロックの いいえの場合 のアクションの追加を選択
新しいステップ → 検索窓に 変数 と入力 → 配列変数に追加 アクションを選択
以下の値を設定する
 名前:cardBody
  値:以下を設定

{
  "type": "Container",
  "style": "emphasis",
  "items": [
    {
      "type": "TextBlock",
      "text": "@{body('Parse_JSON')?['sections'][1]['text']}",
      "wrap": true,
      "fontType": "Monospace",
      "size": "Default"
    }
  ]
}

続けて はいの分岐 で実行した チャットまたはチャネルでメッセージを投稿する アクションと同様の設定を追加する

以上で設定は完了です。
フローチェッカーにエラーが出ていないことを確認し保存してください。
対象のリポジトリを追加したい場合は タイトルの判定分岐を都度追加してください。

手順3 – Gitlabの設定

通知を設定したいリポジトリを開き 設定 → インテグレーション を選択
Add an integration から、Microsoft Teams notifications を選択

Microsoft Teams notifications の設定画面が表示されるため要件に応じて設定

 Connection details
  workflows作成時に対比したwebhookURLを設定

 Trigger
  通知をあげる対象のトリガーにチェック

 Notification settings
  通知をあげる対象ブランチを設定

設定が完了したら、画面下部の Test settings をクリックし、テスト通知を実行
Teamsプライベートチャネルに通知が投稿されていることを確認する。
投稿されていることを確認したら Save Change をクリックし設定を保存

以上でGitlabからTeamsに通知をあげるための作業は完了です。

終わりに

今回は要件を満たすことを目的として対応したためTeamsの通知メッセージのフォーマットはシンプルなもので作成しています。
ブラウザで直接操作しアダプティブカードをデザインできるAdaptiveCardDesigner というサービスもMicrosoftから公開されているため、デザインにこだわりたい方は利用してみてください。

一覧へ戻る

PAGE TOP