本ブログは2024年8月21日の情報を元に記載しています。

こんにちは、テクマトリックスの長久保です。
Jenkinsの実行結果をMicrosoft Teamsに連携させることは、CI/CD環境を実現するうえで有効な方法です。JenkinsとMicrosoft Teamsを連携させる方法の一つに、Office 365 Connectorプラグインの利用があります。このプラグインは、Office 365 Connectorsを利用してMicrosoft Teamsに通知を送る機能を提供しており、多くのユーザーに利用されています。
しかし、2024年7月3日にMicrosoftがOffice 365 Connectorsの機能を廃止することを発表しました。
Retirement of Office 365 connectors within Microsoft Teams

これに伴い、Office 365 Connectorプラグインの今後の対応について、現在もGitHub上で活発に議論が行われています(Retirement of Office 365 connectors within Microsoft Teams #355)。

Office 365 Connectorプラグインの更新により、今回の仕様変更が吸収される可能性もありますが、今後何らかの対応が必要になることも考えられます。そこで今回は、JenkinsからMicrosoft Teamsへ通知するための代替手段として、Workflows(旧名:Power Automate)を使用する方法をご紹介します。

また、Workflowsの設定方法については、以下のブログでも紹介しています。
Microsoft TeamsのIncoming Webhookが廃止になるので、Workflows(Power Automate)で通知する方法を調べた
Webhook URLの取得方法やスクリプトの記載方法など、内容が重複する部分についての詳細な説明は本ブログでは割愛します。

Microsoft Teamsへの通知設定手順

Webhook用URLを取得する

まず、Microsoft Teamsで通知を受け取りたいチャンネルのWebhook URLを取得します。
Retirement of Office 365 connectors within Microsoft Teams
上記ブログ内でも紹介されている、Workflowsのテンプレートのうち、「Webhook 要求を受信したらチャットに投稿する」を利用します。

連携先に、通知を送信したいMicrosoft Teamsのチームを選択するとWebhook URLが作成されます。

通知用のスクリプトを作成する

Microsoft Teamsに通知するためのPythonスクリプトを作成します。
第一引数としてWebook URL、第二引数としてJenkinsのジョブの実行結果を渡して実行します。

import requests
import json
import sys

def send_teams_message(webhook_url, text):
    # 送信するメッセージ
    message = {
        "attachments": [
            {
                "contentType": "application/vnd.microsoft.card.adaptive",
                "content": {
                    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                    "type": "AdaptiveCard",
                    "version": "1.2",
                    "body": [
                        {
                            "type": "TextBlock",
                            "text": text,
                            "wrap": True,
                            "markdown": True
                        }
                    ]
                }
            }
        ]
    }

    # POSTリクエストを送信
    response = requests.post(
        url=webhook_url,
        data=json.dumps(message),
        headers={'Content-Type': 'application/json'}
    )

    # レスポンスを確認
    if response.status_code == 200 or response.status_code == 202:
        print("メッセージが送信されました")
    else:
        print(f"エラーが発生しました: {response.status_code}, {response.text}")

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print("Usage: python send_teams_notification.py <webhook_url> <text>")
        sys.exit(1)

    webhook_url = sys.argv[1]
    text = sys.argv[2]
    send_teams_message(webhook_url, text)
    

このスクリプトをJenkinsのパイプラインから実行可能な場所に配置します。

Jenkinsパイプラインから実行する

Jenkinsのパイプラインに組み込む際には、Postセクションを活用すると良いでしょう。
ビルドが成功した場合と失敗した場合で異なるメッセージを送ることが可能です。また、環境変数を利用して該当のジョブのURL(${env.BUILD_URL})をメッセージ内に埋め込むことを推奨します。

pipeline {
    agent any
    
    environment {
        WEBHOOK_URL = '送信先のWEBHOOK_URL'
    }

    stages {
        stage('Build') {
            steps {
                echo 'ビルドステップの実行'
            }
        }
    }

    post {
        success {
            script {
                def message = "ビルド成功:[ビルドURL](${env.BUILD_URL})"
                powershell """
                    \$webhookUrl = '${env.WEBHOOK_URL}'
                    \$message = '${message}'
                    python send_teams_notification.py \"\$webhookUrl\" \"\$message\"
                """
            }
        }
        failure {
            script {
                def message = "ビルド失敗:[ビルドURL](${env.BUILD_URL})"
                powershell """
                    \$webhookUrl = '${env.WEBHOOK_URL}'
                    \$message = '${message}'
                    python send_teams_notification.py \"\$webhookUrl\" \"\$message\"
                """
            }
        }
    }
}

今回検証時に作成したWebhook URLにはパーセント記号(%2)が含まれており、Jenkinsのbatステップでエスケープ処理されました。そのため、PowerShellで実行しています。
このようにJenkinsfileを作成することで、JenkinsからMicrosoft Teamsへ通知を送ることができます。

まとめ

今回は通知の種類としてアダプティブカードを用いて、シンプルなメッセージとURLを通知しましたが、アダプティブカードにはテキスト、音声、画像、ボタン、入力フィールドなどを持たせることも可能です。
アダプティブ カード
Teams でカードを書式設定する
メンションを飛ばすことも可能なので、Jenkinsジョブの実行者に対してメンション付きで書き込むようにすると、より利便性が高まるかもしれません。

また、従来Microsoft Teamsとの連携に活用していたOffice 365 Connectorプラグインの、2024年8月21日時点での最新バージョンである4.21.5ではWorkflowsと連携はできませんが、今後何か更新があれば本ブログも更新をしたいと思います。

バージョン4.21.5ではOffice 365 Connectorプラグインを利用し、連携しようとしてもパラメータが足りずに失敗します。

弊社が提供している環境構築・コンサルティングサービス

ソフトウェア開発基盤構築ソリューション

テクマトリックスでは、CI/CD環境の構築、運用支援、環境アセスメント、トレーニングなど、多岐にわたるソリューションを提供しています。お客さまのニーズに応じた最適なサポートを通じて、開発プロセスの効率化と品質の向上を目指します。

By nagakubo

主にCI環境構築をメインで担当しています。 Certified CloudBees Jenkins Engineer (CCJE)