在经过半年多的应用之后,我考虑再对现有的jenkins整套服务再做升级,使其更好用些。因为现存的jenkins服务结构已经在使用了,所以就联合运维部的同事重新搭建了一套,我也是从头设计了一下,具体设计方案,我准备另外写,这里只分享新体系里的pipeline的样本。新体系里会新用到gitlab、k8s这些技术,而且jenkins设计成了伸缩式的。
好了,脚本如下:
#!/usr/bin/env groovy
pipeline {
//确认使用主机 agent
{
kubernetes {
label "${BUILD_TAG}-pod"
defaultContainer 'jnlp'
yaml """apiVersion: v1kind: Podmetadata:labels:some-label: some-label-valuespec:containers:- name: jnlp-slaveimage: 172.17.1.XXX/library/jenkins-docker:2imagePullPolicy: Alwaysenv:- name: MY_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: MY_POD_SERVICE_ACCOUNTvalueFrom:fieldRef:fieldPath: spec.serviceAccountNamevolumeMounts:- name: sockmountPath: /var/run/docker.sock- name: mvnmountPath: /home/jenkins/.m2/repositorycommand:- cattty: truevolumes:- name: sockhostPath:path: /var/run/docker.sock- name: mvnglusterfs:endpoints: glusterfs-clusterpath: /gfs/jenkinsmvn/.m2/repositoryreadOnly: false"""
}
}
//常量参数,初始确定后一般不需更改 environment {
//services的pom.xml的相对路径 pomPath = 'pom.xml'
//gitlab账号 GIT_USERNAME = 'jenkins'
//密码 GIT_PASSWORD = '*********'
//k8s节点地址 TESTIP = '172.17.1.xxx'
//归档文件,jmeter测试报告 responseData='jmeter/ResponseData.xml,'+'jmeter/ResultReport/*.*,'+'jmeter/ResultReport/sbadmin2-1.0.7/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/less/*.*,'+'jmeter/ResultReport/sbadmin2-1.0.7/dist/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/dist/css/*.*,'+'jmeter/ResultReport/sbadmin2-1.0.7/dist/js/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/*.*,'+'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/bootstrap/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/bootstrap/dist/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/bootstrap/dist/css/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/bootstrap/dist/fonts/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/bootstrap/dist/js/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/metisMenu/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/metisMenu/dist/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/flot.tooltip/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/flot.tooltip/js/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/flot-axislabels/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/flot/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/font-awesome/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/font-awesome/css/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/font-awesome/less/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/font-awesome/fonts/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/font-awesome/scss/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/jquery/*.*,'+
'jmeter/ResultReport/sbadmin2-1.0.7/bower_components/jquery/dist/*.*,'+'jmeter/ResultReport/content/*.*,'+
'jmeter/ResultReport/content/css/*.*,'+'jmeter/ResultReport/content/pages/*.*,'+
'jmeter/ResultReport/content/js/*.*'
//jmeter测试脚本名称 JMETERNAME = 'cms'
}
options {
//保持构建的最大个数 buildDiscarder(logRotator(numToKeepStr: '10'))
// 设置Pipeline运行的超时时间 timeout(time: 1, unit: 'HOURS')
}
//pipeline运行结果通知给触发者 post {
//始终执行 /*always {echo "分支${BRANCH_NAME}删除服务......"container('jnlp-slave') {sh """chmod 755 docker_shell/*.shdocker_shell/always.sh ${JOB_NAME} ${BUILD_NUMBER}"""}}*/
//失败触发邮件 failure {
script {
emailext body: '${JELLY_SCRIPT,template="static-analysis"}',
recipientProviders: [[$class: 'RequesterRecipientProvider'], [$class: 'DevelopersRecipientProvider']],
subject: '${JOB_NAME}- Build # ${BUILD_NUMBER} - Failure!'
}
}
}
stages {
// 编译构建代码 stage('Build') {
steps {
//拉取工程代码 git branch: '${BRANCH_NAME}', credentialsId: '******-***-***-****-**********', url: 'git@172.17.1.xxx:X/xxx/zc-ht/datamgt.git'
container('jnlp-slave') {
script {
if ( "$BRANCH_NAME" != 'master') {
sh "mvn org.jacoco:jacoco-maven-plugin:prepare-agent -Dmaven.test.failure.ignore=true -f ${pomPath} clean install -Dautoconfig.skip=true -Pcoverage-per-test"
} else {
sh "mvn -f ${pomPath} clean install -Dmaven.test.skip=true"
//sh "mvn -f ${pomPath} clean install -Dtest -DfailIfNoTests=false" }
}
}
}
}
//单元测试 stage('Unit test') {
steps {
echo "starting unitTest......"
//注入jacoco插件配置,clean test执行单元测试代码. All tests should pass. //junit '**/target/surefire-reports/*.xml' //配置单元测试覆盖率要求,未达到要求pipeline将会fail,code coverage.LineCoverage>20%. //jacoco changeBuildStatus: true, maximumLineCoverage:"20%" }
}
//静态检查 stage('SonarQube') {
steps {<