Jenkinsfile2 19.8 KB
Newer Older
L
liuyq-617 已提交
1 2 3
import hudson.model.Result
import hudson.model.*;
import jenkins.model.CauseOfInterruption
4
docs_only=0
L
liuyq-617 已提交
5 6 7 8
node {
}

def abortPreviousBuilds() {
T
tangfangzhi 已提交
9 10 11 12
    def currentJobName = env.JOB_NAME
    def currentBuildNumber = env.BUILD_NUMBER.toInteger()
    def jobs = Jenkins.instance.getItemByFullName(currentJobName)
    def builds = jobs.getBuilds()
L
liuyq-617 已提交
13

T
tangfangzhi 已提交
14 15 16 17
    for (build in builds) {
        if (!build.isBuilding()) {
            continue;
        }
L
liuyq-617 已提交
18

T
tangfangzhi 已提交
19 20 21
        if (currentBuildNumber == build.getNumber().toInteger()) {
            continue;
        }
L
liuyq-617 已提交
22

T
tangfangzhi 已提交
23 24
        build.doKill()    //doTerm(),doKill(),doTerm()
    }
L
liuyq-617 已提交
25 26 27 28
}
//  abort previous build
abortPreviousBuilds()
def abort_previous(){
T
tangfangzhi 已提交
29 30 31
    def buildNumber = env.BUILD_NUMBER as int
    if (buildNumber > 1) milestone(buildNumber - 1)
    milestone(buildNumber)
L
liuyq-617 已提交
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 65 66 67 68 69 70 71 72 73 74
def check_docs() {
    if (env.CHANGE_URL =~ /\/TDengine\//) {
        sh '''
            hostname
            date
            env
        '''
        sh '''
            cd ${WKC}
            git reset --hard
            git clean -fxd
            rm -rf examples/rust/
            git remote prune origin
            git fetch
        '''
        script {
            sh '''
                cd ${WKC}
                git checkout ''' + env.CHANGE_TARGET + '''
            '''
        }
        sh '''
            cd ${WKC}
            git pull >/dev/null
            git fetch origin +refs/pull/${CHANGE_ID}/merge
            git checkout -qf FETCH_HEAD
        '''
        def file_changed = sh (
            script: '''
                cd ${WKC}
                git --no-pager diff --name-only FETCH_HEAD `git merge-base FETCH_HEAD ${CHANGE_TARGET}`|grep -v "^docs/en/"|grep -v "^docs/zh/"
            ''',
            returnStdout: true
        ).trim()
        if (file_changed == '') {
            echo "docs PR"
            docs_only=1
        } else {
            echo file_changed
        }
    }
}
L
liuyq-617 已提交
75
def pre_test(){
76 77 78
    sh '''
        hostname
        date
79
        env
80 81 82 83
    '''
    sh '''
        cd ${WK}
        git reset --hard
84 85
        git remote prune origin
        git fetch
86 87
        cd ${WKC}
        git reset --hard
88
        git clean -fxd
H
Hui Li 已提交
89
        rm -rf examples/rust/
90 91
        git remote prune origin
        git fetch
92
    '''
L
liuyq-617 已提交
93
    script {
94 95 96 97 98 99
        sh '''
            cd ${WK}
            git checkout ''' + env.CHANGE_TARGET + '''
            cd ${WKC}
            git checkout ''' + env.CHANGE_TARGET + '''
        '''
T
tangfangzhi 已提交
100
    }
T
tangfangzhi 已提交
101 102 103
    if (env.CHANGE_URL =~ /\/TDengine\//) {
        sh '''
            cd ${WKC}
T
tangfangzhi 已提交
104
            git remote prune origin
T
tangfangzhi 已提交
105
            git pull >/dev/null
106
            git log -5
107
            echo "`date "+%Y%m%d-%H%M%S"` ${JOB_NAME}:${BRANCH_NAME}:${BUILD_ID}:${CHANGE_TARGET}" >>${WKDIR}/jenkins.log
T
tangfangzhi 已提交
108
            echo "CHANGE_BRANCH:${CHANGE_BRANCH}" >>${WKDIR}/jenkins.log
109
            echo "community log: `git log -5`" >>${WKDIR}/jenkins.log
T
tangfangzhi 已提交
110 111
            git fetch origin +refs/pull/${CHANGE_ID}/merge
            git checkout -qf FETCH_HEAD
112
            git log -5
113
            echo "community log merged: `git log -5`" >>${WKDIR}/jenkins.log
T
tangfangzhi 已提交
114 115
            cd ${WK}
            git pull >/dev/null
116
            git log -5
117
            echo "tdinternal log: `git log -5`" >>${WKDIR}/jenkins.log
T
tangfangzhi 已提交
118 119 120 121 122
        '''
    } else if (env.CHANGE_URL =~ /\/TDinternal\//) {
        sh '''
            cd ${WK}
            git pull >/dev/null
123
            git log -5
124
            echo "`date "+%Y%m%d-%H%M%S"` ${JOB_NAME}:${BRANCH_NAME}:${BUILD_ID}:${CHANGE_TARGET}" >>${WKDIR}/jenkins.log
T
tangfangzhi 已提交
125
            echo "CHANGE_BRANCH:${CHANGE_BRANCH}" >>${WKDIR}/jenkins.log
126
            echo "tdinternal log: `git log -5`" >>${WKDIR}/jenkins.log
T
tangfangzhi 已提交
127 128
            git fetch origin +refs/pull/${CHANGE_ID}/merge
            git checkout -qf FETCH_HEAD
129
            git log -5
130
            echo "tdinternal log merged: `git log -5`" >>${WKDIR}/jenkins.log
T
tangfangzhi 已提交
131
            cd ${WKC}
T
tangfangzhi 已提交
132
            git remote prune origin
T
tangfangzhi 已提交
133
            git pull >/dev/null
134
            git log -5
135
            echo "community log: `git log -5`" >>${WKDIR}/jenkins.log
T
tangfangzhi 已提交
136 137 138 139 140 141
        '''
    } else {
        sh '''
            echo "unmatched reposiotry ${CHANGE_URL}"
        '''
    }
sangshuduo's avatar
sangshuduo 已提交
142 143 144 145 146
    sh '''
        cd ${WKC}
        git rm --cached tools/taos-tools 2>/dev/null || :
        git rm --cached tools/taosadapter 2>/dev/null || :
        git rm --cached tools/taosws-rs 2>/dev/null || :
wafwerar's avatar
wafwerar 已提交
147
        git rm --cached examples/rust 2>/dev/null || :
sangshuduo's avatar
sangshuduo 已提交
148
    '''
T
tangfangzhi 已提交
149
    sh '''
L
liuyq-617 已提交
150
        cd ${WKC}
T
tangfangzhi 已提交
151 152 153 154 155 156
        git submodule update --init --recursive
    '''
    sh '''
        cd ${WKPY}
        git reset --hard
        git pull
157
        git log -5
158 159
        echo "python connector log: `git log -5`" >>${WKDIR}/jenkins.log
        echo >>${WKDIR}/jenkins.log
L
liuyq-617 已提交
160
    '''
T
tangfangzhi 已提交
161 162
    return 1
}
T
tangfangzhi 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
def pre_test_build_mac() {
    sh '''
        hostname
        date
    '''
    sh '''
        cd ${WK}
        rm -rf debug
        mkdir debug
    '''
    sh '''
        cd ${WK}/debug
        cmake ..
        make -j8
    '''
    sh '''
        date
    '''
}
T
tangfangzhi 已提交
182 183 184
def pre_test_win(){
    bat '''
        hostname
185 186 187
        taskkill /f /t /im python.exe
        taskkill /f /t /im bash.exe
        taskkill /f /t /im taosd.exe
T
tangfangzhi 已提交
188 189
        ipconfig
        set
T
tangfangzhi 已提交
190 191
        date /t
        time /t
T
tangfangzhi 已提交
192
        rd /s /Q %WIN_INTERNAL_ROOT%\\debug || exit 0
T
tangfangzhi 已提交
193 194
    '''
    bat '''
T
tangfangzhi 已提交
195
        cd %WIN_INTERNAL_ROOT%
196
        git reset --hard
197 198
        git remote prune origin
        git fetch
T
tangfangzhi 已提交
199 200
    '''
    bat '''
T
tangfangzhi 已提交
201
        cd %WIN_COMMUNITY_ROOT%
T
tangfangzhi 已提交
202
        git reset --hard
203 204
        git remote prune origin
        git fetch
T
tangfangzhi 已提交
205 206
    '''
    script {
207 208 209 210 211 212 213 214
        bat '''
            cd %WIN_INTERNAL_ROOT%
            git checkout ''' + env.CHANGE_TARGET + '''
        '''
        bat '''
            cd %WIN_COMMUNITY_ROOT%
            git checkout ''' + env.CHANGE_TARGET + '''
        '''
T
tangfangzhi 已提交
215
    }
216 217 218
    script {
        if (env.CHANGE_URL =~ /\/TDengine\//) {
            bat '''
T
tangfangzhi 已提交
219
                cd %WIN_INTERNAL_ROOT%
220
                git pull
T
tangfangzhi 已提交
221 222
            '''
            bat '''
T
tangfangzhi 已提交
223 224
                cd %WIN_COMMUNITY_ROOT%
                git remote prune origin
225
                git pull
T
tangfangzhi 已提交
226 227
            '''
            bat '''
T
tangfangzhi 已提交
228
                cd %WIN_COMMUNITY_ROOT%
T
tangfangzhi 已提交
229 230 231
                git fetch origin +refs/pull/%CHANGE_ID%/merge
            '''
            bat '''
T
tangfangzhi 已提交
232
                cd %WIN_COMMUNITY_ROOT%
233 234 235 236
                git checkout -qf FETCH_HEAD
            '''
        } else if (env.CHANGE_URL =~ /\/TDinternal\//) {
            bat '''
T
tangfangzhi 已提交
237
                cd %WIN_INTERNAL_ROOT%
238
                git pull
T
tangfangzhi 已提交
239 240
            '''
            bat '''
T
tangfangzhi 已提交
241
                cd %WIN_INTERNAL_ROOT%
T
tangfangzhi 已提交
242 243 244
                git fetch origin +refs/pull/%CHANGE_ID%/merge
            '''
            bat '''
T
tangfangzhi 已提交
245
                cd %WIN_INTERNAL_ROOT%
246
                git checkout -qf FETCH_HEAD
T
tangfangzhi 已提交
247 248
            '''
            bat '''
T
tangfangzhi 已提交
249 250
                cd %WIN_COMMUNITY_ROOT%
                git remote prune origin
251 252 253
                git pull
            '''
        } else {
T
tangfangzhi 已提交
254 255
            bat '''
                echo "unmatched reposiotry %CHANGE_URL%"
256 257 258
            '''
        }
    }
T
tangfangzhi 已提交
259
    bat '''
T
tangfangzhi 已提交
260
        cd %WIN_INTERNAL_ROOT%
T
tangfangzhi 已提交
261
        git branch
T
tangfangzhi 已提交
262 263 264
        git log -5
    '''
    bat '''
T
tangfangzhi 已提交
265
        cd %WIN_COMMUNITY_ROOT%
T
tangfangzhi 已提交
266
        git branch
T
tangfangzhi 已提交
267 268
        git log -5
    '''
sangshuduo's avatar
sangshuduo 已提交
269 270 271 272 273
    bat '''
        cd %WIN_COMMUNITY_ROOT%
        git rm --cached tools/taos-tools 2>nul
        git rm --cached tools/taosadapter 2>nul
        git rm --cached tools/taosws-rs 2>nul
wafwerar's avatar
wafwerar 已提交
274
        git rm --cached examples/rust 2>nul
sangshuduo's avatar
sangshuduo 已提交
275 276
        exit 0
    '''
T
tangfangzhi 已提交
277
    bat '''
T
tangfangzhi 已提交
278
        cd %WIN_COMMUNITY_ROOT%
279
        git submodule update --init --recursive
T
tangfangzhi 已提交
280
    '''
281
    bat '''
T
tangfangzhi 已提交
282
        cd %WIN_CONNECTOR_ROOT%
283 284 285 286 287
        git branch
        git reset --hard
        git pull
    '''
    bat '''
T
tangfangzhi 已提交
288
        cd %WIN_CONNECTOR_ROOT%
289 290
        git log -5
    '''
T
tangfangzhi 已提交
291 292 293 294 295
}
def pre_test_build_win() {
    bat '''
        echo "building ..."
        time /t
T
tangfangzhi 已提交
296
        cd %WIN_INTERNAL_ROOT%
T
tangfangzhi 已提交
297 298
        mkdir debug
        cd debug
T
tangfangzhi 已提交
299
        time /t
T
tangfangzhi 已提交
300 301
        call "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat" x64
        set CL=/MP8
T
tangfangzhi 已提交
302 303
        echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cmake"
        time /t
T
tangfangzhi 已提交
304
        cmake .. -G "NMake Makefiles JOM" || exit 7
T
tangfangzhi 已提交
305
        echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> jom -j 6"
306
        time /t
T
tangfangzhi 已提交
307
        jom -j 6 || exit 8
T
tangfangzhi 已提交
308
        time /t
T
tangfangzhi 已提交
309
    '''
310
    bat '''
T
tangfangzhi 已提交
311
        cd %WIN_CONNECTOR_ROOT%
312
        python.exe -m pip install --upgrade pip
313
        python -m pip install .
T
tangfangzhi 已提交
314
        xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\lib\\taos.dll C:\\Windows\\System32
315
    '''
L
liuyq-617 已提交
316 317
    return 1
}
T
tangfangzhi 已提交
318
def run_win_ctest() {
T
tangfangzhi 已提交
319 320 321
    bat '''
        echo "windows ctest ..."
        time /t
T
tangfangzhi 已提交
322
        cd %WIN_INTERNAL_ROOT%\\debug
T
tangfangzhi 已提交
323
        ctest -j 1 || exit 7
T
tangfangzhi 已提交
324 325 326
        time /t
    '''
}
T
tangfangzhi 已提交
327 328 329
def run_win_test() {
    bat '''
        echo "windows test ..."
T
tangfangzhi 已提交
330
        cd %WIN_CONNECTOR_ROOT%
331
        python.exe -m pip install --upgrade pip
T
tangfangzhi 已提交
332
        python -m pip install .
T
tangfangzhi 已提交
333
        xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\lib\\taos.dll C:\\Windows\\System32
T
tangfangzhi 已提交
334
        ls -l C:\\Windows\\System32\\taos.dll
T
tangfangzhi 已提交
335
        time /t
T
tangfangzhi 已提交
336
        cd %WIN_SYSTEM_TEST_ROOT%
T
tangfangzhi 已提交
337
        echo "testing ..."
338
        test-all.bat ci
T
tangfangzhi 已提交
339 340 341
        time /t
    '''
}
L
liuyq-617 已提交
342 343

pipeline {
T
tangfangzhi 已提交
344 345 346
    agent none
    options { skipDefaultCheckout() } 
    environment{
T
tangfangzhi 已提交
347
        WKDIR = '/var/lib/jenkins/workspace'
T
tangfangzhi 已提交
348
        WK = '/var/lib/jenkins/workspace/TDinternal'
T
tangfangzhi 已提交
349 350
        WKC = '/var/lib/jenkins/workspace/TDinternal/community'
        WKPY = '/var/lib/jenkins/workspace/taos-connector-python'
T
tangfangzhi 已提交
351 352
    }
    stages {
353 354 355 356 357 358 359 360 361 362
        stage('check') {
            when {
                allOf {
                    not { expression { env.CHANGE_BRANCH =~ /docs\// }}
                    not { expression { env.CHANGE_URL =~ /\/TDinternal\// }}
                }
            }
            parallel {
                stage('check docs') {
                    agent{label " worker03 || slave215 || slave217 || slave219 || Mac_catalina "}
T
tangfangzhi 已提交
363 364 365
                    steps {
                        check_docs()
                    }
366 367 368
                }
            }
        }
T
tangfangzhi 已提交
369
        stage('run test') {
T
tangfangzhi 已提交
370 371 372
            when {
                allOf {
                    not { expression { env.CHANGE_BRANCH =~ /docs\// }}
373
                    expression { docs_only == 0 }
T
tangfangzhi 已提交
374 375
                }
            }
T
tangfangzhi 已提交
376
            parallel {
T
tangfangzhi 已提交
377 378
                stage('windows test') {
                    agent{label " windows10_01 || windows10_02 || windows10_03 || windows10_04 "}
T
tangfangzhi 已提交
379 380 381 382 383 384
                    environment{
                        WIN_INTERNAL_ROOT="C:\\workspace\\${env.EXECUTOR_NUMBER}\\TDinternal"
                        WIN_COMMUNITY_ROOT="C:\\workspace\\${env.EXECUTOR_NUMBER}\\TDinternal\\community"
                        WIN_SYSTEM_TEST_ROOT="C:\\workspace\\${env.EXECUTOR_NUMBER}\\TDinternal\\community\\tests\\system-test"
                        WIN_CONNECTOR_ROOT="C:\\workspace\\${env.EXECUTOR_NUMBER}\\taos-connector-python"
                    }
T
tangfangzhi 已提交
385
                    steps {
T
tangfangzhi 已提交
386
                        catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
T
tangfangzhi 已提交
387
                            timeout(time: 55, unit: 'MINUTES'){
T
tangfangzhi 已提交
388 389 390 391 392 393
                                pre_test_win()
                                pre_test_build_win()
                                run_win_ctest()
                                run_win_test()
                            }
                        }
T
tangfangzhi 已提交
394 395
                    }
                }
T
tangfangzhi 已提交
396 397 398 399 400 401 402 403 404 405 406
                stage('mac test') {
                    agent{label " Mac_catalina "}
                    steps {
                        catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
                            timeout(time: 20, unit: 'MINUTES'){
                                pre_test()
                                pre_test_build_mac()
                            }
                        }
                    }
                }
T
tangfangzhi 已提交
407
                stage('linux test') {
T
tangfangzhi 已提交
408
                    agent{label " worker03 || slave215 || slave217 || slave219 "}
T
tangfangzhi 已提交
409 410 411 412 413
                    options { skipDefaultCheckout() } 
                    when {
                        changeRequest()
                    }
                    steps {
414 415 416 417 418 419 420 421
                        script {
                            def linux_node_ip = sh (
                                script: 'ip addr|grep 192|grep -v virbr|awk "{print \\\$2}"|sed "s/\\/.*//"',
                                returnStdout: true
                            ).trim()
                            echo "${linux_node_ip}"
                            echo "${WKDIR}/restore.sh -p ${BRANCH_NAME} -n ${BUILD_ID} -c {container name}"
                        }
T
tangfangzhi 已提交
422
                        catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
423
                            timeout(time: 120, unit: 'MINUTES'){
424
                                pre_test()
T
tangfangzhi 已提交
425 426 427 428
                                script {
                                    sh '''
                                        date
                                        rm -rf ${WKC}/debug
429
                                        cd ${WKC}/tests/parallel_test
T
tangfangzhi 已提交
430 431 432 433
                                        time ./container_build.sh -w ${WKDIR} -t 8 -e
                                        rm -f /tmp/cases.task
                                        ./collect_cases.sh -e
                                    '''
T
tangfangzhi 已提交
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
                                    def extra_param = ""
                                    def log_server_file = "/home/log_server.json"
                                    def timeout_cmd = ""
                                    if (fileExists(log_server_file)) {
                                        def log_server_enabled = sh (
                                            script: 'jq .enabled ' + log_server_file,
                                            returnStdout: true
                                        ).trim()
                                        def timeout_param = sh (
                                            script: 'jq .timeout ' + log_server_file,
                                            returnStdout: true
                                        ).trim()
                                        if (timeout_param != "null" &&  timeout_param != "0") {
                                            timeout_cmd = "timeout " + timeout_param
                                        }
                                        if (log_server_enabled == "1") {
                                            def log_server = sh (
                                                script: 'jq .server ' + log_server_file + ' | sed "s/\\\"//g"',
                                                returnStdout: true
                                            ).trim()
                                            if (log_server != "null" && log_server != "") { 
                                                extra_param = "-w " + log_server
                                            }
                                        }
                                    }
T
tangfangzhi 已提交
459 460 461 462
                                    sh '''
                                        cd ${WKC}/tests/parallel_test
                                        export DEFAULT_RETRY_TIME=2
                                        date
T
tangfangzhi 已提交
463
                                        ''' + timeout_cmd + ''' time ./run.sh -e -m /home/m.json -t /tmp/cases.task -b ${BRANCH_NAME}_${BUILD_ID} -l ${WKDIR}/log -o 480 ''' + extra_param + '''
T
tangfangzhi 已提交
464 465 466 467
                                    '''
                                }
                            }
                        }
T
tangfangzhi 已提交
468
                        /*catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
T
tangfangzhi 已提交
469
                            timeout(time: 15, unit: 'MINUTES'){
T
tangfangzhi 已提交
470 471 472 473
                                script {
                                    sh '''
                                        echo "packaging ..."
                                        date
474
                                        rm -rf ${WKC}/release/*
T
tangfangzhi 已提交
475 476
                                        cd ${WKC}/packaging
                                        ./release.sh -v cluster -n 3.0.0.100 -s static
T
tangfangzhi 已提交
477
                                    '''
478 479
                                }
                            }
T
tangfangzhi 已提交
480
                        }*/
T
tangfangzhi 已提交
481 482
                    }
                }
L
liuyq-617 已提交
483
            }
T
tangfangzhi 已提交
484 485 486
        }
    }
    post {  
L
liuyq-617 已提交
487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
        success {
            emailext (
                subject: "PR-result: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' SUCCESS",
                body: """<!DOCTYPE html>
                <html>
                <head>
                <meta charset="UTF-8">
                </head>
                <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
                    <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 16pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
                        <tr>
                            <td><br />
                                <b><font color="#0B610B"><font size="6">构建信息</font></font></b>
                                <hr size="2" width="100%" align="center" /></td>
                        </tr>
                        <tr>
                            <td>
                                <ul>
                                <div style="font-size:18px">
                                    <li>构建名称>>分支:${env.BRANCH_NAME}</li>
                                    <li>构建结果:<span style="color:green"> Successful </span></li>
                                    <li>构建编号:${BUILD_NUMBER}</li>
                                    <li>触发用户:${env.CHANGE_AUTHOR}</li>
                                    <li>提交信息:${env.CHANGE_TITLE}</li>
                                    <li>构建地址:<a href=${BUILD_URL}>${BUILD_URL}</a></li>
                                    <li>构建日志:<a href=${BUILD_URL}console>${BUILD_URL}console</a></li>
                                    
                                </div>
                                </ul>
                            </td>
                        </tr>
                    </table></font>
                </body>
                </html>""",
                to: "${env.CHANGE_AUTHOR_EMAIL}",
                from: "support@taosdata.com"
            )
        }
        failure {
            emailext (
                subject: "PR-result: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' FAIL",
                body: """<!DOCTYPE html>
                <html>
                <head>
                <meta charset="UTF-8">
                </head>
                <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
                    <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 16pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
                        <tr>
                            <td><br />
                                <b><font color="#0B610B"><font size="6">构建信息</font></font></b>
                                <hr size="2" width="100%" align="center" /></td>
                        </tr>
                        <tr>
                            <td>
                                <ul>
                                <div style="font-size:18px">
                                    <li>构建名称>>分支:${env.BRANCH_NAME}</li>
                                    <li>构建结果:<span style="color:red"> Failure </span></li>
                                    <li>构建编号:${BUILD_NUMBER}</li>
                                    <li>触发用户:${env.CHANGE_AUTHOR}</li>
                                    <li>提交信息:${env.CHANGE_TITLE}</li>
                                    <li>构建地址:<a href=${BUILD_URL}>${BUILD_URL}</a></li>
                                    <li>构建日志:<a href=${BUILD_URL}console>${BUILD_URL}console</a></li>
                                    
                                </div>
                                </ul>
                            </td>
                        </tr>
                    </table></font>
                </body>
                </html>""",
                to: "${env.CHANGE_AUTHOR_EMAIL}",
                from: "support@taosdata.com"
            )
        }
    } 
}