pipeline {
agent {
label 'node1'
}
environment {
DEV_IP = "10.66.225.38"
TEST_IP = "10.66.225.38"
PROD_IP = '10.66.29.113'
DEPLOY_DIR = "/usr/local/"
ZIP = "iot-persistence-mysql-web/target/iot-persistence-mysql-web.zip"
ZIP_NAME = "iot-persistence-mysql-web.zip"
MAVEN_BUILD_COMMAND = "mvn clean compile package -Dmaven.test.skip=true"
APP_LOG = "/opt/logs/unicorn-persistence/applog/info.log"
DEPLOY_COMMAND = "sh /usr/local/deploy_service.sh persistence-phoenix iot-persistence-mysql-web"
NEXUS_GROUP = "yutongiot"
NEXUS_NAME1 = "iot-persistence"
NEXUS_NAME2 = "mysql-web"
NEXUS_NAME = "iot-persistence-mysql-web"
EMAILLIST = "wxchenjt@yutong.com"
}
options {
//保持构建的最大个数
buildDiscarder(logRotator(numToKeepStr: '5'))
}
parameters {
choice(
description: '选择部署环境',
name: 'ENV',
choices: ['dev','test','prod']
)
choice(
description: '代码库地址',
name: 'GITURL',
choices: ['git@dev.yutong.com:yutongiot/iot-persistence-mysql.git']
)
string(name: 'GITBRANCH', defaultValue: 'develop-iot-zhuanxiang',description: '构建分支')
choice(
description: "V3.*X*是X迭代提测版本根目录,迭代从0起,例如 V3.0",
name: 'NEXUS_REP',
choices: ['V3.23','V3.24','V3.25','V3.26']
)
choice(
description: "V3.*X*.*Y*是X迭代上线前研发多次提测版本,Y表示第几次提测,例如 V3.0.1表示V3的0迭代第1次提交; P00*Z*是X迭代上线后研发多次提测补丁,Z表示第几次补丁, P001 表示V3的0迭代第1次补丁; 上线前提测从1起,上线后提测从1起",
name: 'NEXUS_PATCH',
choices: ['001','002','003','004','005','006','007','008','009','010','011','012','013','014','015','016','017','P001','P002','P003','P004','P005','P006']
)
}
stages {
stage('拉取代码'){
when {expression {return params.ENV == 'dev'}}
steps {
sh "echo code pull"
git branch: "${GITBRANCH}", credentialsId: '504b230b-c8f8-4fd5-a708-888db3fcd1c8', url: "${GITURL}"
}
}
stage('代码扫描'){
when {expression {return params.ENV == 'dev'}}
steps {
withSonarQubeEnv('sonar') {
sh "echo SONAR启动 "
sh "cp /data/build-devops/sonar-project.properties $workspace"
sh "sed -i 's/jobname/${JOB_NAME}/g' sonar-project.properties"
sh "/data/sonarqube/bin/sonar-scanner -X -Dsonar.host.url=http://10.66.225.39:9000"
}
script {
timeout(time: 1, unit: "HOURS") {
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
}}}
}
}
stage('代码构建'){
when {expression {return params.ENV == 'dev'}}
steps {
sh "echo ${MAVEN_BUILD_COMMAND}"
sh "${MAVEN_BUILD_COMMAND}"
}
}
stage('拉取部署包'){
when {expression {return params.ENV == 'test'||params.ENV == 'prod'||params.ENV == 'rollback'}}
steps {
script{
if (params.ENV == "test") {
sh "rm -rf *.zip"
sh "cp /data/build-devops/nexus-common/nexus-download-39.sh $workspace"
sh "sed -i 's#name#${ZIP}#g' nexus-download-39.sh"
sh "sed -i 's#cangku#${NEXUS_REP}#g' nexus-download-39.sh"
sh "sed -i 's#group#${NEXUS_GROUP}#g' nexus-download-39.sh"
sh "sed -i 's#patch#${NEXUS_PATCH}#g' nexus-download-39.sh"
sh "sed -i 's/one/${NEXUS_NAME1}/g' nexus-download-39.sh"
sh "sed -i 's/two/${NEXUS_NAME2}/g' nexus-download-39.sh"
sh "sed -i 's/id/${NEXUS_NAME}/g' nexus-download-39.sh"
sh "sed -i 's/type/zip/g' nexus-download-39.sh"
sh "sh nexus-download-39.sh"
}
if (params.ENV == "prod") {
sh "rm -rf *.zip"
sh "cp /data/build-devops/nexus-common/nexus-download-39.sh $workspace"
sh "sed -i 's#name#${ZIP}#g' nexus-download-39.sh"
sh "sed -i 's#cangku#${NEXUS_REP}#g' nexus-download-39.sh"
sh "sed -i 's#group#${NEXUS_GROUP}#g' nexus-download-39.sh"
sh "sed -i 's#patch#${NEXUS_PATCH}#g' nexus-download-39.sh"
sh "sed -i 's/one/${NEXUS_NAME1}/g' nexus-download-39.sh"
sh "sed -i 's/two/${NEXUS_NAME2}/g' nexus-download-39.sh"
sh "sed -i 's/id/${NEXUS_NAME}/g' nexus-download-39.sh"
sh "sed -i 's/type/zip/g' nexus-download-39.sh"
sh "sh nexus-download-39.sh"
}
if (params.ENV == "rollback") {
sh "rm -rf *.zip"
sh "cp /data/build-devops/nexus-common/nexus-download-65.sh $workspace"
sh "sed -i 's#name#${ZIP}#g' nexus-download-65.sh"
sh "sed -i 's#cangku#${NEXUS_REP}#g' nexus-download-65.sh"
sh "sed -i 's#group#${NEXUS_GROUP}#g' nexus-download-65.sh"
sh "sed -i 's#patch#${NEXUS_PATCH}#g' nexus-download-65.sh"
sh "sed -i 's/one/${NEXUS_NAME1}/g' nexus-download-65.sh"
sh "sed -i 's/two/${NEXUS_NAME2}/g' nexus-download-65.sh"
sh "sed -i 's/id/${NEXUS_NAME}/g' nexus-download-65.sh"
sh "sed -i 's/type/zip/g' nexus-download-65.sh"
sh "sh nexus-download-65.sh"
}
}
}
}
stage('部署服务'){
when {expression {return params.ENV == 'dev'||params.ENV == 'test'||params.ENV == 'prod'||params.ENV == 'rollback'}}
steps {
script {
if (params.ENV == "dev") {
for (item in DEV_IP.tokenize(',')){
echo "deploy ${ENV}"
echo "deploy ${item}"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/${ZIP} ${DEPLOY_DIR}"
sh "salt ${item} cmd.run '${DEPLOY_COMMAND}'"
}
}
if (params.ENV == "test") {
for (item in TEST_IP.tokenize(',')){
echo "deploy ${ENV}"
echo "deploy ${item}"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/${ZIP_NAME} ${DEPLOY_DIR}"
sh "salt ${item} cmd.run '${DEPLOY_COMMAND}'"
}
}
if (params.ENV == "prod") {
for (item in PROD_IP.tokenize(',')){
echo "deploy ${ENV}"
echo "deploy ${item}"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/${ZIP_NAME} ${DEPLOY_DIR}"
sh "salt ${item} cmd.run '${DEPLOY_COMMAND}'"
}
}
}
}
}
stage('日志输出'){
when {expression {return params.ENV == 'dev'||params.ENV == 'test'||params.ENV == 'prod'||params.ENV == 'rollback'}}
steps {
script {
if (params.ENV == "dev") {
sh "sleep 5s"
sh "cp /data/build-devops/log_check.sh /data/jenkins_home/workspace/${JOB_NAME}/"
sh "sed -i 's#log#${APP_LOG}#g' log_check.sh"
for (item in DEV_IP.tokenize(',')){
echo "${item}:获取服务最后100行日志"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/log_check.sh ${DEPLOY_DIR}"
sh "salt ${item} cmd.run 'sh ${DEPLOY_DIR}/log_check.sh'"
}
}
if (params.ENV == "test") {
sh "sleep 5s"
sh "cp /data/build-devops/log_check.sh /data/jenkins_home/workspace/${JOB_NAME}/"
sh "sed -i 's#log#${APP_LOG}#g' log_check.sh"
for (item in TEST_IP.tokenize(',')){
echo "${item}:获取服务最后100行日志"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/log_check.sh ${DEPLOY_DIR}"
sh "salt ${item} cmd.run 'sh ${DEPLOY_DIR}/log_check.sh'"
}
}
if (params.ENV == "prod") {
sh "sleep 5s"
sh "cp /data/build-devops/log_check.sh /data/jenkins_home/workspace/${JOB_NAME}/"
sh "sed -i 's#log#${APP_LOG}#g' log_check.sh"
for (item in PROD_IP.tokenize(',')){
echo "${item}:获取服务最后100行日志"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/log_check.sh ${DEPLOY_DIR}"
sh "salt ${item} cmd.run 'sh ${DEPLOY_DIR}/log_check.sh'"
}
}
}
}
}
stage('服务检查'){
when {expression {return params.ENV == 'dev'||params.ENV == 'test'||params.ENV == 'prod'||params.ENV == 'rollback'}}
steps {
script {
if (params.ENV == "dev") {
sh "sleep 5s"
sh "cp /data/build-devops/service_check.sh /data/jenkins_home/workspace/${JOB_NAME}/"
sh "sed -i 's/jarname/${NEXUS_NAME}/g' service_check.sh"
for (item in DEV_IP.tokenize(',')){
echo "${item}:获取服务最后100行日志"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/service_check.sh ${DEPLOY_DIR}"
sh "salt ${item} cmd.run 'sh ${DEPLOY_DIR}/service_check.sh'"
}
}
if (params.ENV == "test") {
sh "sleep 5s"
sh "cp /data/build-devops/service_check.sh /data/jenkins_home/workspace/${JOB_NAME}/"
sh "sed -i 's/jarname/${NEXUS_NAME}/g' service_check.sh"
for (item in TEST_IP.tokenize(',')){
echo "${item}:获取服务最后100行日志"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/service_check.sh ${DEPLOY_DIR}"
sh "salt ${item} cmd.run 'sh ${DEPLOY_DIR}/service_check.sh'"
}
}
if (params.ENV == "prod") {
sh "sleep 5s"
sh "cp /data/build-devops/service_check.sh /data/jenkins_home/workspace/${JOB_NAME}/"
sh "sed -i 's/jarname/${NEXUS_NAME}/g' service_check.sh"
for (item in PROD_IP.tokenize(',')){
echo "${item}:获取服务最后100行日志"
sh "salt ${item} cp.get_file salt://${JOB_NAME}/service_check.sh ${DEPLOY_DIR}"
sh "salt ${item} cmd.run 'sh ${DEPLOY_DIR}/service_check.sh'"
}
}
}
}
}
stage('上传制品库'){
when {expression {return params.ENV == 'dev'||params.ENV == 'prod'}}
steps {
script {
if (params.ENV == "dev") {
input "是否上传测试环境制品库"
sh "echo ${ZIP}"
sh "cp /data/build-devops/nexus-common/nexus-upload.sh $workspace"
sh "sed -i 's#name#${ZIP}#g' nexus-upload.sh"
sh "sed -i 's#cangku#${NEXUS_REP}#g' nexus-upload.sh"
sh "sed -i 's#group#${NEXUS_GROUP}#g' nexus-upload.sh"
sh "sed -i 's#patch#${NEXUS_PATCH}#g' nexus-upload.sh"
sh "sed -i 's/one/${NEXUS_NAME1}/g' nexus-upload.sh"
sh "sed -i 's/two/${NEXUS_NAME2}/g' nexus-upload.sh"
sh "sed -i 's/id/${NEXUS_NAME}/g' nexus-upload.sh"
sh "sed -i 's/type/zip/g' nexus-upload.sh"
sh "sh nexus-upload.sh"
}
if (params.ENV == "prod") {
sh "echo ${ZIP_NAME}"
sh "cp /data/build-devops/nexus-common/nexus-upload-65.sh $workspace"
sh "sed -i 's#name#${ZIP_NAME}#g' nexus-upload-65.sh"
sh "sed -i 's#cangku#${NEXUS_REP}#g' nexus-upload-65.sh"
sh "sed -i 's#group#${NEXUS_GROUP}#g' nexus-upload-65.sh"
sh "sed -i 's#patch#${NEXUS_PATCH}#g' nexus-upload-65.sh"
sh "sed -i 's/one/${NEXUS_NAME1}/g' nexus-upload-65.sh"
sh "sed -i 's/two/${NEXUS_NAME2}/g' nexus-upload-65.sh"
sh "sed -i 's/id/${NEXUS_NAME}/g' nexus-upload-65.sh"
sh "sed -i 's/type/zip/g' nexus-upload-65.sh"
sh "sh nexus-upload-65.sh"
}
}
}
}
/*stage('接口测试'){
steps {
sh "cp /data/build-devops/autotest/autotest.sh /data/jenkins_home/workspace/${JOB_NAME}/${JOB_NAME}.sh"
sh "sed -i 's/projectname/${JOB_NAME}/g' ${JOB_NAME}.sh"
sh "sh ${JOB_NAME}.sh yutong-devops-autotest.json test.postman_environment.json"
script{
stage('测试报告'){
publishHTML([
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: false,
reportDir: 'autotest-reports',
reportFiles: 'yutong-devops-test.html',
reportName: 'HTML Report',
reportTitles: ''])
}
}
}
}*/
}
post{
always{
echo "构建结束"
}
success {
echo '恭喜您,构建成功!!!'
emailext attachLog: true, attachmentsPattern: 'autotest-reports/${JOB_NAME}.html',
subject: "'${ENV}环境:${env.JOB_NAME} [${env.BUILD_NUMBER}]' 构建成功",
body: """
<div id="content">
<h1>CI报告</h1>
<div id="sum2">
<h2>构建结果 - <font color="#00FF00">SUCCESS</font></h2>
<ul>
<li>项目名称 : <a>${env.JOB_NAME}</a></li>
<li>项目 URL : <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a></li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>构建日志 :<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>代码扫描 :<a href="http://10.66.225.39:9000/dashboard?id=${JOB_NAME}">http://10.66.225.39:9000/dashboard?id=${JOB_NAME}</a></li>
</ul>
</div>
<div id="sum0">
<h2>制品信息</h2>
<ul>
<li>GIT项目的地址 : <a>${GITURL}</a></li>
<li>GIT项目当前的分支名 : ${GITBRANCH}</li>
<li>制品库地址 : <a href="http://10.66.225.39">http://10.66.225.39</a></li>
<li>本次生成制品 :${ZIP}</li>
<li>本次提测版本 : ${NEXUS_REP}.${NEXUS_PATCH}</li>
</ul>
</div>
<div id="sum0">
<h2>运行环境</h2>
<ul>
<li>项目发布的环境 : ${ENV}</li>
<li>项目环境访问地址 : ${DEPLOY_DIR} </li>
<li>项目运行环境的IP : Dev: ${DEV_IP} TEST: ${TEST_IP} PROD: ${PROD_IP}</li>
</ul>
</div>
</div>""",mimeType: 'text/html',to : "${EMAILLIST}"
}
failure {
echo '抱歉,构建失败!!!'
emailext attachLog: true, attachmentsPattern: 'autotest-reports/${JOB_NAME}.html',
subject: "'${ENV}环境:${env.JOB_NAME} [${env.BUILD_NUMBER}]' 构建失败",
body: """
<div id="content">
<h1>CI报告</h1>
<div id="sum2">
<h2>Jenkins构建结果 - <font color="#FF0000">FAILED</font></h2>
<ul>
<ul>
<li>项目名称: <a>${env.JOB_NAME}</a></li>
<li>项目 URL: <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a></li>
<li>构建编号:;第${BUILD_NUMBER}次构建</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</ul>
</div>
<div id="sum0">
<h2>制品信息</h2>
<ul>
<li>GIT项目的地址 : <a>${GITURL}</a></li>
<li>GIT项目当前的分支名 : ${GITBRANCH}</li>
<li>制品库地址 : <a href="http://10.66.225.39">http://10.66.225.39</a></li>
<li>本次生成制品 :${ZIP}</li>
<li>本次提测版本 : ${NEXUS_REP}.${NEXUS_PATCH}</li>
</ul>
</div>
</div>""", mimeType: 'text/html',to : "${EMAILLIST}"
}
unstable {
echo '该任务已经被标记为不稳定任务....'
}
changed {
echo ''
}
}
}
ZIP-Jenkinsfile
最新推荐文章于 2023-08-14 20:12:39 发布