PipeLine Note¶
pipeline的 HTML Publisher Plugin使用¶
pipeline {
agent { label 'master' }
stages{
stage('Firmware_Reports'){
steps{
publishHTML (target: [
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: true,
reportDir: 'Firmware_Reports',
reportFiles: 'log.html',
reportName: "Firmware Html Report"])
}
}
stage('Software_Reports'){
steps{
publishHTML (target: [
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: true,
reportDir: 'Software_Reports',
reportFiles: 'log.html',
reportName: "Software Html Report"])
}
}
}
}
还可以判断当html文件存在的时候才执行
stage("Collection Results") {
steps {
//publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: '', reportFiles: 'detail.html', reportName: 'HTML Report', reportTitles: ''])
script {
if (fileExists("detail.html")) {
publishHTML (target: [
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: true,
reportDir: '.',
reportFiles: 'detail.html',
reportName: "Html Report"])
}
bat("python continuous_integration\\collection_build_result.py")
}
}
}
另外一种语法
stage("Collection Results") {
steps {
publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: '', reportFiles: 'detail.html', reportName: 'HTML Report', reportTitles: ''])
script {
bat("python continuous_integration\\collection_build_result.py")
}
}
}
when检查文件是否存在¶
when { expression { fileExists('cppcheck.xml') }}
steps {
publishCppcheck allowNoReport: true,
displayErrorSeverity: true,
displayNoCategorySeverity: true,
displayPerformanceSeverity: true,
displayPortabilitySeverity: true,
displayStyleSeverity: true,
displayWarningSeverity: true,
pattern: 'cppcheck.xml'
}
jenkins build 的结果反馈给gitlab¶
pipeline {
agent any
options {
gitLabConnection('Your GitLab Connection')
}
stages {
stage('build') {
steps {
updateGitlabCommitStatus name: 'build', state: 'running'
hogehoge
}
}
}
post {
success {
updateGitlabCommitStatus name: 'build', state: 'success'
}
failure {
updateGitlabCommitStatus name: 'build', state: 'failed'
}
}
}
gitLabConnection: 是和GitLab连接的名称. 根据用户的权限可以在Job->configure->General->GitLab Connection看到具体的名称; 而这个连接的名称是在Manage Jenkins->Configure System->Gitlab中配置的
updateGitlabCommitStatus: name - build 名称, 可以根据不同的步骤指定不同的名称, 就是一个普通字符串, 结果回传过后可以在 Gitlab中看到; state - 回传的状态, 包括: pending, running, canceled, success, failed
jenkins 官方接口:https://jenkins.io/doc/pipeline/steps/gitlab-plugin/#updategitlabcommitstatus-update-the-commit-status-in-gitlab
pipeline动态配置label¶
agentLabel = "master"
pipeline {
agent { label agentLabel }
stages {
stage('Prep') {
steps {
script {
agentLabel = "Windows && Test"
}
}
}
stage('Checking') {
steps {
script {
println agentLabel
bat('ipconfig')
}
}
}
stage('Final') {
agent { label agentLabel }
steps {
script {
println agentLabel
bat('ipconfig')
}
}
}
}
}
变量agentLabel可以在中间stage赋值, 并且可以多个label进行逻辑组合
AtePipeline配置实例¶
agentTest = "firmwaretester"
pipeline {
agent { label "master" }
environment {
TRIGGER_NUM = "${BUILD_NUMBER}"
GITLAB_BRANCH = "${gitlabSourceBranch}"
GITLAB_NAME = "${gitlabSourceRepoName}"
GITLAB_COMMITER = "${gitlabUserEmail}"
GITLAB_COMMIT = "${gitlabAfter}"
GITLAB_BEFORE = "${gitlabBefore}"
GITLAB_HTTPURL = "${gitlabSourceRepoHttpUrl}"
GITLAB_GROUP = "${gitlabSourceNamespace}"
REPORT_LINK = "${JENKINS_URL}userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/summary.html"
}
options {
timestamps()
timeout(time: 2, unit: 'HOURS')
gitLabConnection('tangke')
}
stages {
stage("Prepare") {
steps {
updateGitlabCommitStatus name: 'Prepare', state: 'running'
// 创建日志目录, 设置build名字, 清理workspace
script {
currentBuild.displayName = "${BUILD_NUMBER} -> ${gitlabSourceRepoName} -> ${gitlabUserName}"
currentBuild.description = "<a href=\"${REPORT_LINK}\">${REPORT_LINK}</a>"
if (env.GITLAB_BRANCH != "master") {
sh "grep \"${GITLAB_GROUP}:${GITLAB_NAME}:${GITLAB_BRANCH}\" ${JENKINS_HOME}/userContent/JobList.txt | awk -F':' '{print \$NF}' > prebuildnumber"
sh "[ \"`cat prebuildnumber`\" != \"\" ] && curl -X POST http://172.16.0.33:8080/job/${JOB_NAME}/`cat prebuildnumber`/stop --user junping.gou:@gjp1234 || exit 0"
sh "echo ${GITLAB_GROUP}:${GITLAB_NAME}:${GITLAB_BRANCH}:${TRIGGER_NUM} >> ${JENKINS_HOME}/userContent/JobList.txt"
}
try {
sh "mkdir -m 777 -p ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}"
} catch (err) {
echo "Caught error in mkdir on master: ${err}"
}
try {
sh "rm -rf ${WORKSPACE}/*"
} catch (err) {
echo "Caught error in clean ${WORKSPACE} on master: ${err}"
}
}
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"]],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
// 解析提交日志, 得出编译和测试条件, 并生成邮件列表
script {
if (env.GITLAB_NAME == "sfp_plus_10g_epon_olt") {
agentTest = "firmwaretester"
}
sh "python \"${GITLAB_GROUP}/${GITLAB_NAME}/02 ci/04 common/analysis_gitlog.py\""
Compile_Firmware = "No"
Compile_Software = "No"
Test_Firmware = "No"
Test_Software = "No"
if (fileExists("${GITLAB_GROUP}\\${GITLAB_NAME}\\02 ci\\02 firmware\\hlt\\robotRun.py")) {
Test_Firmware = "Yes"
}
if (fileExists("${GITLAB_GROUP}\\${GITLAB_NAME}\\02 ci\\03 software\\hlt\\robotRun.py")) {
Test_Software = "Yes"
}
compile_list = readFile('compile_list')
if (compile_list.contains('Compile_Firmware=Yes')) {
Compile_Firmware = "Yes"
}
if (compile_list.contains('Compile_Software=Yes')) {
Compile_Software = "Yes"
}
if (Compile_Firmware == "No") {
Test_Firmware = "No"
}
if (Compile_Software == "No") {
Test_Software = "No"
}
println("Compile_Firmware: ${Compile_Firmware}")
println("Compile_Software: ${Compile_Software}")
println("Test_Firmware: ${Test_Firmware}")
println("Test_Software: ${Test_Software}")
println("currentBuild.result: ${currentBuild.result}")
}
updateGitlabCommitStatus name: 'Prepare', state: 'success'
}
}
stage("Compile") {
parallel {
stage("Firmware Compile") {
when { equals expected: Compile_Firmware, actual: "Yes" }
stages {
stage('Firmware Compile') {
agent { label "firmware_compile" }
steps {
updateGitlabCommitStatus name: "FirmwareCompile", state: 'running'
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"]],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
// 编译固件
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
try {
bat("call \"02 ci\\04 common\\common_script.bat\" compile firmware")
} catch (err) {
echo "Caught error in firmware compile: ${err}"
currentBuild.result = 'FAILURE'
updateGitlabCommitStatus name: "FirmwareCompile", state: 'failed'
} finally {
bat("call \"02 ci\\04 common\\common_script.bat\" post compile firmware")
println("currentBuild.result: ${currentBuild.result}")
}
if (fileExists('build.log')) {
buildlog = readFile('build.log')
if (buildlog.contains('--- Build failed ----')) {
Test_Firmware = "No"
}
}
}
}
updateGitlabCommitStatus name: "FirmwareCompile", state: 'success'
}
}
}
}
stage('Firmware Static') {
when { equals expected: Compile_Firmware, actual: "Yes" }
stages {
stage('Firmware Static') {
agent { label "static" }
steps {
updateGitlabCommitStatus name: "FirmwareStatic", state: 'running'
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"]],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
// 静态解析固件代码
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
try {
bat("call \"02 ci\\04 common\\common_script.bat\" static firmware")
} catch (err) {
echo "Caught error in firmware static: ${err}"
currentBuild.result = 'FAILURE'
Test_Firmware = "No"
updateGitlabCommitStatus name: "FirmwareStatic", state: 'failed'
} finally {
bat("call \"02 ci\\04 common\\common_script.bat\" post static firmware")
}
}
}
//publishCppcheck allowNoReport: true,
// displayErrorSeverity: true,
// displayNoCategorySeverity: true,
// displayPerformanceSeverity: true,
// displayPortabilitySeverity: true,
// displayStyleSeverity: true,
// displayWarningSeverity: true,
// pattern: 'cppcheck.xml'
updateGitlabCommitStatus name: "FirmwareStatic", state: 'success'
}
}
}
}
stage("Software Compile") {
when { equals expected: Compile_Software, actual: "Yes" }
stages {
stage('Software Compile') {
agent { label "software_compile" }
steps {
updateGitlabCommitStatus name: 'SoftwareCompile', state: 'running'
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"]],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
// 编译软件
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
try {
bat("call \"02 ci\\04 common\\common_script.bat\" compile software")
} catch (err) {
echo "Caught error in software compile: ${err}"
currentBuild.result = 'FAILURE'
Test_Firmware = "No"
updateGitlabCommitStatus name: 'SoftwareCompile', state: 'failed'
} finally {
bat("call \"02 ci\\04 common\\common_script.bat\" post compile software")
}
}
}
updateGitlabCommitStatus name: 'SoftwareCompile', state: 'success'
}
}
}
}
stage('Software Static') {
when { equals expected: Compile_Software, actual: "Yes" }
stages {
stage('Software Static') {
agent { label "static" }
steps {
updateGitlabCommitStatus name: 'SoftwareStatic', state: 'running'
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"]],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
// 静态解析软件代码
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
try {
bat("call \"02 ci\\04 common\\common_script.bat\" static software")
} catch (err) {
echo "Caught error in software static: ${err}"
currentBuild.result = 'FAILURE'
Test_Firmware = "No"
updateGitlabCommitStatus name: 'SoftwareStatic', state: 'failed'
} finally {
bat("call \"02 ci\\04 common\\common_script.bat\" post static software")
}
}
}
//publishCppcheck allowNoReport: true,
// displayErrorSeverity: true,
// displayNoCategorySeverity: true,
// displayPerformanceSeverity: true,
// displayPortabilitySeverity: true,
// displayStyleSeverity: true,
// displayWarningSeverity: true,
// pattern: 'cppcheck.xml'
updateGitlabCommitStatus name: 'SoftwareStatic', state: 'success'
}
}
}
}
}
}
stage("Test") {
parallel {
stage("Firmware") {
when { equals expected: Test_Firmware, actual: "Yes" }
stages {
stage('PreTest') {
agent { label "master" }
steps {
script {
sh "echo \"${GITLAB_GROUP}:${GITLAB_NAME}:${TRIGGER_NUM}\" >> ${JENKINS_HOME}/userContent/TestList.txt"
sh "set +x;for i in `seq 1 180`; do if [ `grep \"${GITLAB_GROUP}:${GITLAB_NAME}\" ${JENKINS_HOME}/userContent/TestList.txt | wc -l` -ge 2 ]; then echo \"Wait for the last job to finish ...\";sleep 10; else break; fi;done"
}
}
}
stage('Firmware Test') {
agent { label agentTest }
steps {
updateGitlabCommitStatus name: 'FirmwareTest', state: 'running'
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"]],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
// 固件测试
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
try {
bat("call \"02 ci\\04 common\\common_script.bat\" test firmware")
} catch (err) {
echo "Caught error in firmware test: ${err}"
currentBuild.result = 'FAILURE'
updateGitlabCommitStatus name: 'FirmwareTest', state: 'failed'
} finally {
bat("call \"02 ci\\04 common\\common_script.bat\" post test firmware")
}
if (fileExists("02 ci/02 firmware/hlt/Reports")) {
step([
$class : "RobotPublisher",
outputPath : "02 ci/02 firmware/hlt/Reports",
outputFileName : "*/output.xml",
reportFileName : "report.html",
logFileName : "log.html",
disableArchiveOutput : false,
passThreshold : 100,
unstableThreshold : 95.0,
otherFiles : "*.txt",
])
}
}
}
updateGitlabCommitStatus name: 'FirmwareTest', state: 'success'
}
}
}
}
stage("Software") {
when { equals expected: Test_Software, actual: "Yes" }
stages {
stage('Software Test') {
agent { label "software_test" }
steps {
updateGitlabCommitStatus name: 'SoftwareTest', state: 'running'
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"]],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
// 软件测试
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
try {
bat("call \"02 ci\\04 common\\common_script.bat\" test software")
} catch (err) {
echo "Caught error in software test: ${err}"
currentBuild.result = 'FAILURE'
updateGitlabCommitStatus name: 'SoftwareTest', state: 'failed'
} finally {
bat("call \"02 ci\\04 common\\common_script.bat\" post test software")
}
if (fileExists("02 ci/02 firmware/hlt/Reports")) {
step(
[$class : "RobotPublisher",
outputPath : "02 ci/03 software/hlt/Reports",
outputFileName : "*/output.xml",
reportFileName : "report.html",
logFileName : "log.html",
disableArchiveOutput : false,
passThreshold : 100,
unstableThreshold : 95.0,
otherFiles : "*.txt",]
)
}
}
}
updateGitlabCommitStatus name: 'SoftwareTest', state: 'success'
}
}
}
}
}
}
stage("Collection Reports") {
steps {
updateGitlabCommitStatus name: 'CollectionReports', state: 'success'
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
sh "\"02 ci/04 common/control.sh\""
script {
if (fileExists("02 ci/04 common/release_firmware.py")) {
sh "python \"02 ci/04 common/release_firmware.py\""
}
}
}
}
}
}
post {
success {
updateGitlabCommitStatus name: 'BuldComplete', state: 'success'
emailext subject:"${GITLAB_NAME}, -Build #${TRIGGER_NUM} ${currentBuild.result}, ${gitlabUserName} | ${GITLAB_BRANCH}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: '${FILE,path="mail_list"} ${DEFAULT_RECIPIENTS}'
}
unstable {
updateGitlabCommitStatus name: 'BuldComplete', state: 'failed'
emailext subject:"${GITLAB_NAME}, -Build #${TRIGGER_NUM} ${currentBuild.result}, ${gitlabUserName} | ${GITLAB_BRANCH}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: '${FILE,path="mail_list"} ${DEFAULT_RECIPIENTS}'
}
failure {
updateGitlabCommitStatus name: 'BuldComplete', state: 'failed'
emailext subject:"${GITLAB_NAME}, -Build #${TRIGGER_NUM} ${currentBuild.result}, ${gitlabUserName} | ${GITLAB_BRANCH}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: '${FILE,path="mail_list"} ${DEFAULT_RECIPIENTS}'
}
always {
sh "sed -i \"/${GITLAB_GROUP}:${GITLAB_NAME}:${GITLAB_BRANCH}/d\" ${JENKINS_HOME}/userContent/JobList.txt"
sh "sed -i \"/^ *\$/d\" ${JENKINS_HOME}/userContent/JobList.txt"
sh "sed -i \"/^${GITLAB_GROUP}:${GITLAB_NAME}:${TRIGGER_NUM}\$/d\" ${JENKINS_HOME}/userContent/TestList.txt"
sh "sed -i \"/^ *\$/d\" ${JENKINS_HOME}/userContent/TestList.txt"
}
}
}
SoftwareMiddleware配置实例¶
pipeline {
agent { label "master" }
environment {
TRIGGER_NUM = "${BUILD_NUMBER}"
GITLAB_BRANCH = "${gitlabSourceBranch}"
GITLAB_NAME = "${gitlabSourceRepoName}"
GITLAB_COMMITER = "${gitlabUserEmail}"
GITLAB_COMMIT = "${gitlabAfter}"
GITLAB_BEFORE = "${gitlabBefore}"
GITLAB_HTTPURL = "${gitlabSourceRepoHttpUrl}"
GITLAB_GROUP = "${gitlabSourceNamespace}"
REPORT_LINK = "${JENKINS_URL}userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/summary.html"
}
options {
timestamps()
timeout(time: 2, unit: 'HOURS')
gitLabConnection('tangke')
}
stages {
stage("Prepare") {
steps {
updateGitlabCommitStatus name: 'build', state: 'running'
// 创建日志目录, 设置build名字, 清理workspace
script {
currentBuild.description = "<a href=\"${REPORT_LINK}\">${REPORT_LINK}</a>"
currentBuild.displayName = "${BUILD_NUMBER} -> ${gitlabSourceRepoName} -> ${gitlabUserName}"
try {
sh "mkdir -m 777 -p ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}"
sh "mkdir -m 777 -p ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/Download"
} catch (err) {
echo "Caught error in mkdir on master: ${err}"
}
try {
sh "rm -rf ${WORKSPACE}/mail_list"
sh "rm -rf ${WORKSPACE}/build_list"
sh "rm -rf ${WORKSPACE}/summary.html"
} catch (err) {
echo "Caught error in clean ${WORKSPACE} on master: ${err}"
}
}
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"],
[$class: 'CleanBeforeCheckout'],],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
script {
sh "python \"${GITLAB_GROUP}/${GITLAB_NAME}/02 ci/04 common/analysis_gitlog.py\""
Compile = "No"
Test = "No"
build_list = readFile('build_list')
if (build_list.contains('Compile=Yes')) {
Compile = "Yes"
}
if (build_list.contains('Test=Yes')) {
Test = "Yes"
}
println("Compile: ${Compile}")
println("Test: ${Test}")
}
}
}
stage("Compile") {
when { equals expected: Compile, actual: "Yes" }
stages {
stage('Compile') {
agent { label "software_compile" }
steps {
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"],
[$class: 'CleanBeforeCheckout'],],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
// 编译软件
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
try {
bat("python \"02 ci\\03 software\\complie\\software_compile.py\"")
} catch (err) {
echo "Caught error in software compile: ${err}"
currentBuild.result = 'FAILURE'
}
try {
bat('start /wait cmd /c "python \"02 ci\\04 common\\file_transfer.py\" upload build"')
} catch (err) {
echo "Caught error in upload compile: ${err}"
}
}
}
// CppCheck
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
try {
bat("call \"02 ci\\03 software\\lint\\sw-cppcheck.bat\"")
} catch (err) {
echo "Caught error in software cppcheck: ${err}"
currentBuild.result = 'FAILURE'
}
try {
bat('start /wait cmd /c "python \"02 ci\\04 common\\file_transfer.py\" upload cppcheck"')
} catch (err) {
echo "Caught error in upload cppcheck: ${err}"
}
}
}
}
}
}
}
stage("Test") {
when { equals expected: Test, actual: "Yes" }
stages {
stage('Test') {
agent { label "firmware_test" }
steps {
// 下载代码
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: "${GITLAB_COMMIT}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class:"RelativeTargetDirectory",
relativeTargetDir:"${GITLAB_GROUP}/${GITLAB_NAME}"],
[$class: "CleanCheckout"],
[$class: 'CleanBeforeCheckout'],],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "123",
url: "${GITLAB_HTTPURL}"]]]
checkout changelog: false, poll: false,
scm: [$class: "GitSCM",
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'CleanCheckout'],
[$class: 'CleanBeforeCheckout'],
[$class: 'RelativeTargetDirectory',
relativeTargetDir: 'new_project/xfp_10g_epon_olt']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '123', url: 'http://172.16.0.31/new_project/xfp_10g_epon_olt.git']]]
// 固件测试
dir("${WORKSPACE}/new_project/xfp_10g_epon_olt/02 ci/02 firmware/hlt") {
script {
try {
//bat("echo RxPower_XGPON_Adjust_Test >> parameter.cfg")
bat("start /wait cmd /c \"python \"${WORKSPACE}\\${GITLAB_GROUP}\\${GITLAB_NAME}\\02 ci\\04 common\\file_transfer.py\" download build\"")
} catch (err) {
echo "Caught error in download build: ${err}"
}
try {
bat("python robotRun.py ZTE")
} catch (err) {
echo "Caught error in firmware test: ${err}"
currentBuild.result = 'FAILURE'
}
try {
bat("start /wait cmd /c \"python \"${WORKSPACE}\\${GITLAB_GROUP}\\${GITLAB_NAME}\\02 ci\\04 common\\file_transfer.py\" upload test\"")
} catch (err) {
echo "Caught error in upload test: ${err}"
}
if (fileExists("Reports")) {
step([
$class : "RobotPublisher",
outputPath : "Reports",
outputFileName : "*/output.xml",
reportFileName : "report.html",
logFileName : "log.html",
disableArchiveOutput : false,
passThreshold : 100,
unstableThreshold : 95.0,
otherFiles : "*.txt",
])
}
}
}
}
}
}
}
// 生成报告
stage("Reports") {
steps {
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
sh "cp -f ${WORKSPACE}/git_log.html ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/Download/"
sh "python \"02 ci/04 common/gen_reports.py\""
sh "cp -f ${WORKSPACE}/summary.html ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/"
sh "cp -f ${WORKSPACE}/build_list ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/"
sh "cp -f ${WORKSPACE}/build_list ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/"
}
}
}
}
post {
success {
updateGitlabCommitStatus name: 'build', state: 'success'
emailext subject:"${GITLAB_NAME}, -Build #${TRIGGER_NUM} ${currentBuild.result}, commiter:${GITLAB_COMMITER}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: '${FILE,path="mail_list"} ${DEFAULT_RECIPIENTS}'
}
unstable {
updateGitlabCommitStatus name: 'build', state: 'failed'
emailext subject:"${GITLAB_NAME}, -Build #${TRIGGER_NUM} ${currentBuild.result}, commiter:${GITLAB_COMMITER}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: '${FILE,path="mail_list"} ${DEFAULT_RECIPIENTS}'
}
failure {
updateGitlabCommitStatus name: 'build', state: 'failed'
emailext subject:"${GITLAB_NAME}, -Build #${TRIGGER_NUM} ${currentBuild.result}, commiter:${GITLAB_COMMITER}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: '${FILE,path="mail_list"} ${DEFAULT_RECIPIENTS}'
}
}
}
在PipeLine中使用groovy语法,判断文件存在时执行某些操作¶
stage("Reports") {
steps {
dir("${WORKSPACE}/${GITLAB_GROUP}/${GITLAB_NAME}") {
script {
if (fileExists("02 ci/04 common/collection_log.sh")) {
sh '"02 ci/04 common/collection_log.sh"'
} else {
sh "cp -f ${WORKSPACE}/git_log.html ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/Download/"
sh "python \"02 ci/04 common/gen_reports.py\""
sh "cp -f ${WORKSPACE}/summary.html ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/"
sh "cp -f ${WORKSPACE}/build_list ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/"
sh "cp -f ${WORKSPACE}/build_list ${JENKINS_HOME}/userContent/${GITLAB_GROUP}/${GITLAB_NAME}/${TRIGGER_NUM}/"
}
}
}
}
}
在post中也可以先判断报告文件是否存在, 然后再发邮件
post {
success {
script {
if (fileExists("summary.html")) {
emailext subject:"${JOB_NAME}, -Build #${BUILD_NUMBER} : ${currentBuild.result}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: 'goujunping@ruijie.com.cn'
}
}
}
unstable {
script {
if (fileExists("summary.html")) {
emailext subject:"${JOB_NAME}, -Build #${BUILD_NUMBER} : ${currentBuild.result}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: 'goujunping@ruijie.com.cn'
}
}
}
failure {
script {
if (fileExists("summary.html")) {
emailext subject:"${JOB_NAME}, -Build #${BUILD_NUMBER} : ${currentBuild.result}",
mimeType:'text/html',
body: '${FILE, path="summary.html"}',
to: 'goujunping@ruijie.com.cn'
}
}
}
}
在PipeLine中定义函数并调用¶
在最外层定义函数download_scripts, 实现为代码下载功能, 然后在pipeline中可以直接调用
def download_scripts()
{
println "********* download_scripts ************"
checkout changelog: false, poll: false,
scm: [$class: 'SubversionSCM',
additionalCredentials: [],
excludedCommitMessages: '',
excludedRegions: '',
excludedRevprop: '',
excludedUsers: '',
filterChangelog: false,
ignoreDirPropChanges: false,
includedRegions: '',
locations: [[cancelProcessOnExternalsFail: true,
credentialsId: 'goujunping-svn-secret',
depthOption: 'infinity',
ignoreExternalsOption: true,
local: '.',
remote: 'http://<svnserver>/svn/5G_phy_autotest_x86/rgclienv/testbandwidth_auto']],
quietOperation: false,
workspaceUpdater: [$class: 'UpdateUpdater']]
}
pipeline {
agent { label "master" }
options {
timestamps()
}
stages {
stage("Deployment") {
steps {
script {
println "BBU_IP: ${BBU_IP}"
println "CPE_SERVER: ${CPE_SERVER}"
println "CPE_NUM: ${CPE_NUM}"
println "TIMEOUT: ${TIMEOUT}"
println "UPLOAD_BIN: ${UPLOAD_BIN}"
download_scripts()
if (UPLOAD_BIN == "True")
{
println "********* Deployment ************"
sh("python testbandwidth_auto.py deployment")
}
}
}
}
stage("Start Stack") {
steps {
script {
println "********* Start Stack ************"
sh("python testbandwidth_auto.py startstack")
}
}
}
stage("CPE Connect") {
agent { label CPE_SERVER }
steps {
script {
println "********* CPE Connect ************"
download_scripts()
bat("python testbandwidth_auto.py cpeconnect")
WAN_IPS = readFile("wan_ips.txt")
println "WAN IP: ${WAN_IPS}"
}
}
}
stage("Iperf") {
parallel {
stage("DL Iperf") {
steps {
script {
println "********* DL Iperf ************"
println "WAN IP: ${WAN_IPS}"
writeFile(file: "wan_ips.txt", text: WAN_IPS)
sh('python testbandwidth_auto.py dliperf')
}
}
}
stage("UL Iperf") {
agent { label CPE_SERVER }
steps {
script {
println "********* UL Iperf ************"
sh('python testbandwidth_auto.py uliperf')
}
}
}
}
}
}
}