18.6.3 版本控制与代码质量插件

版本控制与代码质量插件决定了源码获取可靠性与质量门禁的有效性。本节给出插件选型、安装、配置与流水线实践,并配套命令说明、排错要点与练习。

原理草图(从代码到质量门禁):

文章图片

常用插件与作用#

  • Git:主流版本控制插件,支持多分支、浅克隆、子模块。
  • Subversion:遗留系统使用,支持多路径检出。
  • Git Parameter / Multibranch Pipeline:多分支与参数化构建。
  • Last Changes:变更日志生成。
  • SonarQube Scanner:静态分析与质量门禁。
  • Warnings Next Generation:统一收集编译/静态分析告警。
  • JUnit:单元测试报告。
  • JaCoCo / Cobertura:覆盖率报告。

安装与更新(示例)#

方式一:Jenkins UI
- “Manage Jenkins” → “Plugins” → “Available” → 搜索并安装:
- git, subversion, sonarqube, warnings-ng, junit, jacoco

方式二:jenkins-cli 安装

# 1) 下载 cli(以本地 Jenkins 为例)
curl -o jenkins-cli.jar http://127.0.0.1:8080/jnlpJars/jenkins-cli.jar

# 2) 安装插件(可多插件)
java -jar jenkins-cli.jar -s http://127.0.0.1:8080/ \
  -auth admin:admin \
  install-plugin git subversion sonar warnings-ng junit jacoco -deploy

# 3) 触发安全重启使插件生效
java -jar jenkins-cli.jar -s http://127.0.0.1:8080/ \
  -auth admin:admin safe-restart

命令解释:
- install-plugin:从更新中心安装插件。
- -deploy:安装后立即部署到运行目录。
- safe-restart:等待任务完成后安全重启。

凭据与全局配置(示例)#

Git 凭据配置#

  • “Manage Jenkins” → “Credentials” → 创建 Username with passwordSSH Username with private key

SonarQube 服务器配置#

  • “Manage Jenkins” → “System” → “SonarQube servers”
  • Name: sonarqube-prod
  • Server URL: http://sonarqube:9000
  • Token: 选择对应凭据

Pipeline 示例(可直接运行)#

1) Git + JUnit + JaCoCo + SonarQube 质量门禁#

pipeline {
  agent any
  environment {
    SONARQUBE = 'sonarqube-prod'
  }
  stages {
    stage('Checkout') {
      steps {
        git branch: 'main',
            credentialsId: 'git-cred',
            url: 'https://git.example.com/devops/demo.git'
      }
    }
    stage('Build & Test') {
      steps {
        sh '''
          ./mvnw -v
          ./mvnw clean test
        '''
      }
    }
    stage('Coverage') {
      steps {
        sh './mvnw jacoco:report'
      }
      post {
        always {
          jacoco execPattern: '**/target/jacoco.exec'
        }
      }
    }
    stage('SonarQube Scan') {
      steps {
        withSonarQubeEnv("${SONARQUBE}") {
          sh './mvnw sonar:sonar'
        }
      }
    }
    stage('Quality Gate') {
      steps {
        timeout(time: 5, unit: 'MINUTES') {
          waitForQualityGate abortPipeline: true
        }
      }
    }
  }
  post {
    always {
      junit '*/target/surefire-reports/*.xml'
      archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
    }
  }
}

关键说明:
- waitForQualityGate:质量门禁失败即终止。
- junit:收集测试报告。
- jacoco:覆盖率报告趋势展示。

2) Subversion 多路径检出(示例)#

pipeline {
  agent any
  stages {
    stage('Checkout SVN') {
      steps {
        checkout([
          $class: 'SubversionSCM',
          locations: [[
            credentialsId: 'svn-cred',
            remote: 'http://svn.example.com/repo/trunk/app',
            local: 'app'
          ], [
            credentialsId: 'svn-cred',
            remote: 'http://svn.example.com/repo/trunk/lib',
            local: 'lib'
          ]],
          workspaceUpdater: [$class: 'UpdateUpdater']
        ])
      }
    }
  }
}

说明:
- UpdateUpdater:增量更新,避免每次全量检出。

3) Warnings Next Generation(示例)#

stage('Static Analysis') {
  steps {
    sh 'mvn -q -DskipTests=true checkstyle:check'
  }
  post {
    always {
      recordIssues tools: [checkStyle(pattern: '**/target/checkstyle-result.xml')],
                   qualityGates: [[threshold: 1, type: 'TOTAL', unstable: true]]
    }
  }
}

说明:
- recordIssues:收集告警并可触发构建不稳定。

典型排错#

1) Git 检出失败:Permission denied

# 检查 Jenkins 节点是否能访问 Git
ssh -T git@git.example.com
# 若失败,确认 Jenkins 凭据是否为正确 SSH 私钥

2) SonarQube 质量门禁超时

# 扫描后检查 Webhook 是否配置到 Jenkins
curl -I http://jenkins.example.com/sonarqube-webhook/
# 若 404 或超时,检查 Jenkins URL 与 SonarQube Webhook 配置

3) JUnit 报告未展示
- 检查报告路径是否正确,确保生成 .xml

ls -l **/target/surefire-reports/*.xml

运维建议#

  • 预发布环境验证插件升级,避免与 JDK/Pipeline 不兼容。
  • 定期清理停用插件,减少攻击面。
  • 统一使用凭据管理,禁止在 Jenkinsfile 中硬编码 Token。

练习#

1) 使用 Git 插件配置一个多分支流水线,要求仅构建 mainrelease/* 分支。
2) 在流水线加入 SonarQube 质量门禁,门禁失败时阻止制品归档。
3) 为 Java 项目添加 JaCoCo 覆盖率报告,并设置覆盖率低于 60% 标记构建不稳定。
4) 故意配置错误的 Git 凭据并排查,记录修复步骤与验证命令。