TDengine/Jenkinsfile2

566 lines
21 KiB
Text
Raw Normal View History

2022-02-08 01:29:49 +00:00
import hudson.model.Result
import hudson.model.*;
import jenkins.model.CauseOfInterruption
docs_only=0
2022-02-08 01:29:49 +00:00
node {
}
def abortPreviousBuilds() {
2022-04-28 06:55:31 +00:00
def currentJobName = env.JOB_NAME
def currentBuildNumber = env.BUILD_NUMBER.toInteger()
def jobs = Jenkins.instance.getItemByFullName(currentJobName)
def builds = jobs.getBuilds()
2022-02-08 01:29:49 +00:00
2022-04-28 06:55:31 +00:00
for (build in builds) {
if (!build.isBuilding()) {
continue;
}
2022-02-08 01:29:49 +00:00
2022-04-28 06:55:31 +00:00
if (currentBuildNumber == build.getNumber().toInteger()) {
continue;
}
2022-02-08 01:29:49 +00:00
2022-04-28 06:55:31 +00:00
build.doKill() //doTerm(),doKill(),doTerm()
}
2022-02-08 01:29:49 +00:00
}
// abort previous build
abortPreviousBuilds()
def abort_previous(){
2022-04-28 06:55:31 +00:00
def buildNumber = env.BUILD_NUMBER as int
if (buildNumber > 1) milestone(buildNumber - 1)
milestone(buildNumber)
2022-02-08 01:29:49 +00:00
}
def check_docs() {
if (env.CHANGE_URL =~ /\/TDengine\//) {
sh '''
hostname
date
env
'''
sh '''
cd ${WKC}
git reset --hard
2023-03-02 16:38:53 +00:00
git clean -f
rm -rf examples/rust/
git remote prune origin
git fetch
'''
script {
sh '''
cd ${WKC}
git checkout ''' + env.CHANGE_TARGET + '''
'''
}
sh '''
cd ${WKC}
git remote prune origin
git pull >/dev/null
git fetch origin +refs/pull/${CHANGE_ID}/merge
git checkout -qf FETCH_HEAD
'''
2024-08-01 07:36:30 +00:00
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 {
2024-08-01 06:46:43 +00:00
echo file_changed
}
2024-08-01 07:36:30 +00:00
env.FILE_CHANGED = file_changed
}
}
2022-02-08 01:29:49 +00:00
def pre_test(){
2022-05-13 13:10:34 +00:00
sh '''
hostname
date
env
2022-05-13 13:10:34 +00:00
'''
sh '''
cd ${WK}
git reset --hard
git remote prune origin
git fetch
2022-05-13 13:10:34 +00:00
cd ${WKC}
git reset --hard
2023-03-02 16:38:53 +00:00
git clean -f
rm -rf examples/rust/
git remote prune origin
git fetch
2022-05-13 13:10:34 +00:00
'''
2022-02-08 01:29:49 +00:00
script {
sh '''
cd ${WK}
git checkout ''' + env.CHANGE_TARGET + '''
cd ${WKC}
git checkout ''' + env.CHANGE_TARGET + '''
'''
2022-04-28 06:55:31 +00:00
}
2022-05-11 03:40:04 +00:00
if (env.CHANGE_URL =~ /\/TDengine\//) {
sh '''
cd ${WKC}
2022-06-24 07:17:17 +00:00
git remote prune origin
2022-05-11 03:40:04 +00:00
git pull >/dev/null
2022-06-14 08:32:17 +00:00
git log -5
echo "`date "+%Y%m%d-%H%M%S"` ${JOB_NAME}:${BRANCH_NAME}:${BUILD_ID}:${CHANGE_TARGET}" >>${WKDIR}/jenkins.log
2022-06-25 09:33:24 +00:00
echo "CHANGE_BRANCH:${CHANGE_BRANCH}" >>${WKDIR}/jenkins.log
echo "community log: `git log -5`" >>${WKDIR}/jenkins.log
2022-05-11 03:40:04 +00:00
git fetch origin +refs/pull/${CHANGE_ID}/merge
git checkout -qf FETCH_HEAD
2022-05-13 06:04:21 +00:00
git log -5
echo "community log merged: `git log -5`" >>${WKDIR}/jenkins.log
2022-05-11 04:26:46 +00:00
cd ${WK}
git pull >/dev/null
2022-05-13 06:04:21 +00:00
git log -5
echo "tdinternal log: `git log -5`" >>${WKDIR}/jenkins.log
2022-05-11 03:40:04 +00:00
'''
} else if (env.CHANGE_URL =~ /\/TDinternal\//) {
sh '''
cd ${WK}
git pull >/dev/null
2022-06-14 08:32:17 +00:00
git log -5
echo "`date "+%Y%m%d-%H%M%S"` ${JOB_NAME}:${BRANCH_NAME}:${BUILD_ID}:${CHANGE_TARGET}" >>${WKDIR}/jenkins.log
2022-06-25 09:33:24 +00:00
echo "CHANGE_BRANCH:${CHANGE_BRANCH}" >>${WKDIR}/jenkins.log
echo "tdinternal log: `git log -5`" >>${WKDIR}/jenkins.log
2022-05-11 03:40:04 +00:00
git fetch origin +refs/pull/${CHANGE_ID}/merge
git checkout -qf FETCH_HEAD
2022-05-13 06:04:21 +00:00
git log -5
echo "tdinternal log merged: `git log -5`" >>${WKDIR}/jenkins.log
2022-05-11 04:26:46 +00:00
cd ${WKC}
2022-06-24 07:17:17 +00:00
git remote prune origin
2022-05-11 04:26:46 +00:00
git pull >/dev/null
2022-05-13 06:04:21 +00:00
git log -5
echo "community log: `git log -5`" >>${WKDIR}/jenkins.log
2022-05-11 03:40:04 +00:00
'''
} else {
sh '''
2024-08-02 08:54:54 +00:00
echo "unmatched repository ${CHANGE_URL}"
2022-05-11 03:40:04 +00:00
'''
}
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 || :
2022-07-30 01:12:40 +00:00
git rm --cached examples/rust 2>/dev/null || :
'''
2022-04-28 06:55:31 +00:00
sh '''
2022-02-08 01:29:49 +00:00
cd ${WKC}
2022-04-28 06:55:31 +00:00
git submodule update --init --recursive
'''
return 1
}
2022-07-04 02:46:03 +00:00
def pre_test_build_mac() {
sh '''
hostname
date
'''
sh '''
cd ${WK}
rm -rf debug
mkdir debug
'''
sh '''
cd ${WK}/debug
2022-12-19 11:31:02 +00:00
cmake .. -DBUILD_TEST=true -DBUILD_HTTPS=false -DCMAKE_BUILD_TYPE=Release
make -j10
2022-10-28 08:45:26 +00:00
ctest -j10 || exit 7
2022-07-04 02:46:03 +00:00
'''
sh '''
date
'''
}
2022-04-28 06:55:31 +00:00
def pre_test_win(){
bat '''
hostname
taskkill /f /t /im python.exe
taskkill /f /t /im bash.exe
taskkill /f /t /im taosd.exe
2022-05-18 07:11:54 +00:00
ipconfig
set
2022-04-28 06:55:31 +00:00
date /t
time /t
2022-06-24 07:17:17 +00:00
rd /s /Q %WIN_INTERNAL_ROOT%\\debug || exit 0
2022-04-28 06:55:31 +00:00
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_INTERNAL_ROOT%
2022-05-13 06:04:21 +00:00
git reset --hard
git remote prune origin
git fetch
2022-05-18 07:11:54 +00:00
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_COMMUNITY_ROOT%
2023-03-02 16:38:53 +00:00
git clean -f
2022-04-28 06:55:31 +00:00
git reset --hard
git remote prune origin
git fetch
2022-04-28 06:55:31 +00:00
'''
script {
bat '''
cd %WIN_INTERNAL_ROOT%
git checkout ''' + env.CHANGE_TARGET + '''
'''
bat '''
cd %WIN_COMMUNITY_ROOT%
git checkout ''' + env.CHANGE_TARGET + '''
'''
2022-04-28 06:55:31 +00:00
}
2022-05-13 06:04:21 +00:00
script {
if (env.CHANGE_URL =~ /\/TDengine\//) {
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_INTERNAL_ROOT%
2022-09-20 14:24:33 +00:00
git pull origin ''' + env.CHANGE_TARGET + '''
2022-05-18 07:11:54 +00:00
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_COMMUNITY_ROOT%
git remote prune origin
2022-09-20 14:24:33 +00:00
git pull origin ''' + env.CHANGE_TARGET + '''
2022-05-18 07:11:54 +00:00
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_COMMUNITY_ROOT%
2022-05-18 07:11:54 +00:00
git fetch origin +refs/pull/%CHANGE_ID%/merge
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_COMMUNITY_ROOT%
2022-05-13 06:04:21 +00:00
git checkout -qf FETCH_HEAD
'''
} else if (env.CHANGE_URL =~ /\/TDinternal\//) {
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_INTERNAL_ROOT%
2022-09-20 14:24:33 +00:00
git pull origin ''' + env.CHANGE_TARGET + '''
2022-05-18 07:11:54 +00:00
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_INTERNAL_ROOT%
2022-05-18 07:11:54 +00:00
git fetch origin +refs/pull/%CHANGE_ID%/merge
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_INTERNAL_ROOT%
2022-05-13 06:04:21 +00:00
git checkout -qf FETCH_HEAD
2022-05-18 07:11:54 +00:00
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_COMMUNITY_ROOT%
git remote prune origin
2022-05-13 06:04:21 +00:00
git pull
'''
} else {
2022-05-18 07:11:54 +00:00
bat '''
2024-08-02 08:54:54 +00:00
echo "unmatched repository %CHANGE_URL%"
2022-05-13 06:04:21 +00:00
'''
}
}
2022-05-18 07:11:54 +00:00
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_INTERNAL_ROOT%
2022-05-18 07:51:59 +00:00
git branch
2022-05-18 07:11:54 +00:00
git log -5
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_COMMUNITY_ROOT%
2022-05-18 07:51:59 +00:00
git branch
2022-05-18 07:11:54 +00:00
git log -5
'''
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
2022-07-30 01:12:40 +00:00
git rm --cached examples/rust 2>nul
exit 0
'''
2022-04-28 06:55:31 +00:00
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_COMMUNITY_ROOT%
2022-05-13 06:04:21 +00:00
git submodule update --init --recursive
2022-04-28 06:55:31 +00:00
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_CONNECTOR_ROOT%
git branch
git reset --hard
git pull
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_CONNECTOR_ROOT%
git log -5
'''
2022-04-28 06:55:31 +00:00
}
def pre_test_build_win() {
bat '''
echo "building ..."
time /t
2022-06-24 07:17:17 +00:00
cd %WIN_INTERNAL_ROOT%
2022-04-28 06:55:31 +00:00
mkdir debug
cd debug
2022-05-18 07:51:59 +00:00
time /t
2022-04-28 06:55:31 +00:00
call "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat" x64
set CL=/MP8
2022-05-18 07:51:59 +00:00
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cmake"
time /t
cmake .. -G "NMake Makefiles JOM" -DBUILD_TEST=true -DBUILD_TOOLS=true || exit 7
2022-05-18 07:51:59 +00:00
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> jom -j 6"
2022-05-18 08:10:35 +00:00
time /t
2022-05-18 07:33:15 +00:00
jom -j 6 || exit 8
2022-04-28 06:55:31 +00:00
time /t
2022-04-24 07:02:32 +00:00
'''
bat '''
2022-06-24 07:17:17 +00:00
cd %WIN_CONNECTOR_ROOT%
python.exe -m pip install --upgrade pip
python -m pip uninstall taospy -y
2024-01-26 07:50:33 +00:00
python -m pip install taospy==2.7.13
2023-09-06 08:14:50 +00:00
python -m pip uninstall taos-ws-py -y
2023-11-07 02:37:39 +00:00
python -m pip install taos-ws-py==0.3.1
2024-08-02 08:54:54 +00:00
xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\lib\\taos.dll C:\\Windows\\System32
'''
2022-02-08 01:29:49 +00:00
return 1
}
2022-06-01 06:54:31 +00:00
def run_win_ctest() {
2022-05-31 08:33:46 +00:00
bat '''
echo "windows ctest ..."
time /t
2022-06-24 07:17:17 +00:00
cd %WIN_INTERNAL_ROOT%\\debug
2022-06-04 01:50:15 +00:00
ctest -j 1 || exit 7
2022-05-31 08:33:46 +00:00
time /t
'''
}
2022-06-01 06:54:31 +00:00
def run_win_test() {
bat '''
echo "windows test ..."
2022-06-24 07:17:17 +00:00
cd %WIN_CONNECTOR_ROOT%
xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\lib\\taos.dll C:\\Windows\\System32
2022-06-04 04:13:42 +00:00
ls -l C:\\Windows\\System32\\taos.dll
2022-06-01 06:54:31 +00:00
time /t
2022-06-24 07:17:17 +00:00
cd %WIN_SYSTEM_TEST_ROOT%
2022-06-01 06:54:31 +00:00
echo "testing ..."
test-all.bat ci
2022-06-01 06:54:31 +00:00
time /t
'''
}
2022-02-08 01:29:49 +00:00
pipeline {
2022-04-28 06:55:31 +00:00
agent none
options { skipDefaultCheckout() }
environment{
2022-05-11 11:12:35 +00:00
WKDIR = '/var/lib/jenkins/workspace'
2022-04-28 06:55:31 +00:00
WK = '/var/lib/jenkins/workspace/TDinternal'
2022-05-11 03:40:04 +00:00
WKC = '/var/lib/jenkins/workspace/TDinternal/community'
WKPY = '/var/lib/jenkins/workspace/taos-connector-python'
2022-04-28 06:55:31 +00:00
}
stages {
stage('check') {
when {
allOf {
not { expression { env.CHANGE_BRANCH =~ /docs\// }}
}
}
parallel {
stage('check docs') {
2023-11-28 07:18:06 +00:00
agent{label " slave1_47 || slave1_48 || slave1_49 || slave1_50 || slave1_52 || slave1_59 || slave1_63 || worker03 || slave215 || slave217 || slave219 || Mac_catalina "}
2022-08-22 06:43:22 +00:00
steps {
check_docs()
}
}
}
}
2022-04-28 06:55:31 +00:00
stage('run test') {
2022-07-18 02:46:40 +00:00
when {
allOf {
not { expression { env.CHANGE_BRANCH =~ /docs\// }}
expression { docs_only == 0 }
2022-07-18 02:46:40 +00:00
}
}
2022-04-28 06:55:31 +00:00
parallel {
2022-05-18 06:46:30 +00:00
stage('windows test') {
agent{label " windows10_01 || windows10_02 || windows10_03 || windows10_04 "}
2022-06-24 07:17:17 +00:00
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"
}
2022-05-18 06:46:30 +00:00
steps {
2022-06-01 06:54:31 +00:00
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
2023-02-26 09:50:35 +00:00
timeout(time: 126, unit: 'MINUTES'){
2022-06-01 06:54:31 +00:00
pre_test_win()
pre_test_build_win()
run_win_ctest()
run_win_test()
}
}
2022-05-18 06:46:30 +00:00
}
}
2022-07-04 02:46:03 +00:00
stage('mac test') {
agent{label " Mac_catalina "}
steps {
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
2024-04-30 07:05:11 +00:00
timeout(time: 60, unit: 'MINUTES'){
2022-07-04 02:46:03 +00:00
pre_test()
pre_test_build_mac()
}
}
}
}
2022-04-28 06:55:31 +00:00
stage('linux test') {
2024-08-01 18:12:46 +00:00
agent{label "slave1_47 || slave1_48 || slave1_49 || slave1_50 || slave1_52 || slave1_59 || slave1_63 || worker03 || slave215 || slave217 || slave219 "}
2022-04-28 06:55:31 +00:00
options { skipDefaultCheckout() }
when {
changeRequest()
}
steps {
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}"
}
2022-06-02 05:55:14 +00:00
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
2024-07-20 07:16:47 +00:00
timeout(time: 200, unit: 'MINUTES'){
pre_test()
2022-06-02 05:55:14 +00:00
script {
2024-08-01 07:17:25 +00:00
sh '''
2024-08-02 05:22:10 +00:00
mkdir -p ${WKDIR}/tmp/${BRANCH_NAME}_${BUILD_ID}
echo "''' + env.FILE_CHANGED + '''" > ${WKDIR}/tmp/${BRANCH_NAME}_${BUILD_ID}/docs_changed.txt
2024-08-01 07:17:25 +00:00
'''
2024-08-01 12:46:49 +00:00
sh '''
date
rm -rf ${WKC}/debug
cd ${WKC}/tests/parallel_test
time ./container_build.sh -w ${WKDIR} -e
'''
2022-06-24 07:17:17 +00:00
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
}
}
}
2024-08-01 16:48:49 +00:00
sh '''
2024-08-01 17:12:47 +00:00
cd ${WKC}/tests/parallel_test
2024-08-02 05:22:10 +00:00
./run_scan_container.sh -d ${WKDIR} -b ${BRANCH_NAME}_${BUILD_ID} -f ${WKDIR}/tmp/${BRANCH_NAME}_${BUILD_ID}/docs_changed.txt ''' + extra_param + '''
2024-08-01 16:48:49 +00:00
'''
2022-06-02 05:55:14 +00:00
sh '''
cd ${WKC}/tests/parallel_test
export DEFAULT_RETRY_TIME=2
date
2024-07-19 07:56:51 +00:00
''' + timeout_cmd + ''' time ./run.sh -e -m /home/m.json -t cases.task -b ${BRANCH_NAME}_${BUILD_ID} -l ${WKDIR}/log -o 1200 ''' + extra_param + '''
2022-06-02 05:55:14 +00:00
'''
}
}
}
2022-07-28 10:00:33 +00:00
/*catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
2022-06-01 07:50:14 +00:00
timeout(time: 15, unit: 'MINUTES'){
2022-06-01 06:54:31 +00:00
script {
sh '''
echo "packaging ..."
date
2022-06-02 00:58:20 +00:00
rm -rf ${WKC}/release/*
2022-06-01 06:54:31 +00:00
cd ${WKC}/packaging
./release.sh -v cluster -n 3.0.0.100 -s static
2022-06-04 01:50:15 +00:00
'''
}
}
2022-07-28 10:00:33 +00:00
}*/
2022-04-28 06:55:31 +00:00
}
}
2022-02-08 01:29:49 +00:00
}
2022-04-28 06:55:31 +00:00
}
}
post {
2022-02-08 01:29:49 +00:00
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"
)
}
}
}