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

pipeline {
T
tangfangzhi 已提交
345 346 347
    agent none
    options { skipDefaultCheckout() } 
    environment{
T
tangfangzhi 已提交
348
        WKDIR = '/var/lib/jenkins/workspace'
T
tangfangzhi 已提交
349
        WK = '/var/lib/jenkins/workspace/TDinternal'
T
tangfangzhi 已提交
350 351
        WKC = '/var/lib/jenkins/workspace/TDinternal/community'
        WKPY = '/var/lib/jenkins/workspace/taos-connector-python'
T
tangfangzhi 已提交
352 353
    }
    stages {
354 355 356 357 358 359 360 361 362 363
        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 已提交
364 365 366
                    steps {
                        check_docs()
                    }
367 368 369
                }
            }
        }
T
tangfangzhi 已提交
370
        stage('run test') {
T
tangfangzhi 已提交
371 372 373
            when {
                allOf {
                    not { expression { env.CHANGE_BRANCH =~ /docs\// }}
374
                    expression { docs_only == 0 }
T
tangfangzhi 已提交
375 376
                }
            }
T
tangfangzhi 已提交
377
            parallel {
T
tangfangzhi 已提交
378 379
                stage('windows test') {
                    agent{label " windows10_01 || windows10_02 || windows10_03 || windows10_04 "}
T
tangfangzhi 已提交
380 381 382 383 384 385
                    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 已提交
386
                    steps {
T
tangfangzhi 已提交
387
                        catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
T
tangfangzhi 已提交
388
                            timeout(time: 55, unit: 'MINUTES'){
T
tangfangzhi 已提交
389 390 391 392 393 394
                                pre_test_win()
                                pre_test_build_win()
                                run_win_ctest()
                                run_win_test()
                            }
                        }
T
tangfangzhi 已提交
395 396
                    }
                }
T
tangfangzhi 已提交
397 398 399 400 401 402 403 404 405 406 407
                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 已提交
408
                stage('linux test') {
T
tangfangzhi 已提交
409
                    agent{label " worker03 || slave215 || slave217 || slave219 "}
T
tangfangzhi 已提交
410 411 412 413 414
                    options { skipDefaultCheckout() } 
                    when {
                        changeRequest()
                    }
                    steps {
415 416 417 418 419 420 421 422
                        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 已提交
423
                        catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
424
                            timeout(time: 120, unit: 'MINUTES'){
425
                                pre_test()
T
tangfangzhi 已提交
426 427 428 429
                                script {
                                    sh '''
                                        date
                                        rm -rf ${WKC}/debug
430
                                        cd ${WKC}/tests/parallel_test
T
tangfangzhi 已提交
431 432 433 434
                                        time ./container_build.sh -w ${WKDIR} -t 8 -e
                                        rm -f /tmp/cases.task
                                        ./collect_cases.sh -e
                                    '''
T
tangfangzhi 已提交
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
                                    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 已提交
460 461 462 463
                                    sh '''
                                        cd ${WKC}/tests/parallel_test
                                        export DEFAULT_RETRY_TIME=2
                                        date
T
tangfangzhi 已提交
464
                                        ''' + 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 已提交
465 466 467 468
                                    '''
                                }
                            }
                        }
T
tangfangzhi 已提交
469
                        /*catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
T
tangfangzhi 已提交
470
                            timeout(time: 15, unit: 'MINUTES'){
T
tangfangzhi 已提交
471 472 473 474
                                script {
                                    sh '''
                                        echo "packaging ..."
                                        date
475
                                        rm -rf ${WKC}/release/*
T
tangfangzhi 已提交
476 477
                                        cd ${WKC}/packaging
                                        ./release.sh -v cluster -n 3.0.0.100 -s static
T
tangfangzhi 已提交
478
                                    '''
479 480
                                }
                            }
T
tangfangzhi 已提交
481
                        }*/
T
tangfangzhi 已提交
482 483
                    }
                }
L
liuyq-617 已提交
484
            }
T
tangfangzhi 已提交
485 486 487
        }
    }
    post {  
L
liuyq-617 已提交
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 565
        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"
            )
        }
    } 
}