投稿

Jenkins パイプライン スクリプトから Telegram メッセージを送信する

もちろん、Jenkins 用の Telegram プラグインもありますが、個人的には試行錯誤したくありませんでした。プラグインがリリースされてから少なくとも 2 年は経過しています。 Linuxのcurlを使って電報メッセージを送信してみます。

Jenkins - 電報プラグイン Jenkins - 電報プラグイン

Telegram メッセージを送信するための Groovy 関数

Jenkins スクリプトで使用する 2 つの Groovy 関数を作成しました。 func_telegram_sendMessage_message は、文字列を挿入するだけで Telegram メッセージを送信する関数です。もう 1 つの func_telegram_sendMessage_file は、テキスト ファイルの内容を Telegram メッセージとして送信する関数です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// -----------------------------------------------
// func_telegram_sendMessage_message
// -----------------------------------------------
def func_telegram_sendMessage_message(title, message, token, chatid) {
    echo "### func_telegram_sendMessage_message, title=${title}, message=${message}, token=${token}, chatid=${chatid}"

    try {
        sh """
        curl -X POST \
                -d chat_id=${chatid} \
                -d parse_mode=HTML \
                -d text='<b>${title}</b>\n\n${message}' \
                https://api.telegram.org/bot${token}/sendMessage
        """
    } catch(Exception e) {
        currentBuild.result = 'SUCCESS'
    }
}

// -----------------------------------------------
// func_telegram_sendMessage_fileContents
// -----------------------------------------------
def func_telegram_sendMessage_fileContents(title, file, token, chatid) {
    echo "### func_telegram_sendMessage_file, title=${title}, file=${file}, token=${token}, chatid=${chatid}"

    boolean isFileExist = true
    def filecontents = ""
    if (fileExists("${file}") == true) {
        def filetext = sh(script: "cat ${file}", returnStdout: true).trim()
        filecontents = "<b>${file}</b>\n${filetext}"
    } else {
        filecontents = "<b>${file}</b>\nFile does not exist"
        isFileExist = false
    }

    func_telegram_sendMessage_message(title, filecontents, token, chatid)

    return isFileExist
}

// -----------------------------------------------
// func_telegram_sendDocument_file
// -----------------------------------------------
def func_telegram_sendDocument_file(file, token, chatid) {
    echo "### func_telegram_sendMessage_file, file=${file}, token=${token}, chatid=${chatid}"

    if (fileExists("${file}") == false) {
        return false
    }

    try {
        sh """
        curl -k \
        -F chat_id=${chatid} \
        -F document=@\"${file}\" \
                https://api.telegram.org/bot${token}/sendDocument
        """
    } catch(Exception e) {
        currentBuild.result = 'SUCCESS'
        return false
    }

    return true
}

curl を介して Telegram メッセージを送信するときにまだエラーが発生したことはありませんが、パイプライン プロセスがエラーによって停止するのを防ぐために、curl ステートメントを try-catch ステートメントでラップしました。私個人としては、Telegram メッセージの送信よりもパイプライン処理の方が優先度が高いと考えています。

パイプラインステップ内で関数を使用する

以下は、パイプラインステップで上で作成した関数を呼び出す方法です。 Telegram ボットのtokenchatidをハードコーディングしました。後で必要になったら、Jenkins のCredentials機能を使用して実装してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
steps {
    script {
        def token = g_si.TELEGRAM_TOKEN;
        def chatid = g_si.TELEGRAM_CHATID;
        
        func_telegram_sendMessage_message("title", "im message", token, chatid)
        func_telegram_sendMessage_file("file title", "./_report/aa.txt", chatid, chatid)
        
        func_telegram_sendMessage_message("im title", "im message", token, chatid)
        def rst = func_telegram_sendMessage_fileContents("im file title", "./_report/aa.txt", token, chatid)
        if (rst == true ) {
            func_telegram_sendMessage_file("./_report/aa.txt", token, chatid)
        }                        
    }
}

この記事は著作権者のライセンス:LICENSE_NAMEに従います。