jenkins集成sonar流水线部署

jenkins集成sonar流水线部署,第1张

文章目录
      • 1. 创建`SonaQube`的账户`token`
      • 2. 将`token`保存到`Jenkins`凭据中
      • 3. 在`Jenkins`中安装插件`sonarqube scanner`
          • 3.1 配置`sonar`服务器
          • 3.2 全局配置`SonarQube Scanner`
          • 3.3 并关闭`sonar`的审查结果上传到`SCM`功能
      • 4. 创建自定义项目验证
      • 5. 创建流水线项目验证
      • 6. Jenkins添加Sonar结果分析
          • 6.1 `sonar`添加网络调用(`webhook`)
          • 6.2 修改`Jenkinsfile`脚本
          • 6.3 检测不通过测试
          • 6.4 检测通过测试

  • jenkins 安装文档地址
  • 地址 http://jenkins.tophant.wang
  • 账号密码 admin/www19930327
  • sonar 安装文档地址
  • 地址 http://sonar.tophant.wang
  • 账号密码 admin/admin
1. 创建SonaQube的账户token


202af9f3321b30c5e1c4e216ce5e6fbc2477fdae

2. 将token保存到Jenkins凭据中

3. 在Jenkins中安装插件sonarqube scanner

3.1 配置sonar服务器

点击【系统管理】->【系统配置】,向下滚动到SonarQube配置部分,单击Add SonarQube,添加服务器,选择凭据。

3.2 全局配置SonarQube Scanner

3.3 并关闭sonar的审查结果上传到SCM功能

4. 创建自定义项目验证

以之前创建的Maven项目为例,添加构建步骤,并加入Sonar执行配置参数

全局工具配置 安装 jdk8

安装jdk需要oracle账号

全局工具配置 安装 maven3.8.5

添加构建,选择maven

添加构建,选择SonarQube Scaner


配置文件具体内容如下:

sonar.projectKey=istio-demo
sonar.projectName=istio-demo
sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.java.binaries=target/classes

说明:

  • sonar.projectKey:定义唯一的关键字
  • sonar.projectName:定义项目名称
  • sonar.projectVersion:定义项目的版本信息
  • sonar.sources:指定扫描代码的目录位置(多个逗号分隔,java项目源代码一般在src目录下面)
  • sonar.sourceEncoding:执行项目编码
  • sonar.language:指定扫描java语言,如果不指定,则扫描目录下存在的全部
  • sonar.java.binaries:扫描java项目时,指定编译文件所在目录,不指定该目录会报错

也可以将配置好的sonar-project.properties文件放置在代码目录中,在 Path to project properties 配置相应的文件名

立即构建开始扫描,速度太慢,下面用流水线项目测试

5. 创建流水线项目验证


代码扫描成功,但是发现即使代码扫描错误,Jenkins流水线也不会停止,没有结果回调

6. Jenkins添加Sonar结果分析 6.1 sonar添加网络调用(webhook)

在代码扫描成功后,扫描结果需要回调jenkins,添加的Jenkinswebhook结构为:http://[jenkins_url]/sonarqube-webhook/

sonar点击【配置】 -> 【配置】 -> 【网络调用】

6.2 修改Jenkinsfile脚本
def label = "slave-${UUID.randomUUID().toString()}"

def helmLint(String chartDir) {
    println "校验 chart 模板"
    sh "helm lint ${chartDir}"
}

def helmDeploy(Map args) {
    if (args.dry_run) {
        println "Debug 应用 ${args.profile} 环境"
        sh "helm upgrade --install --dry-run --debug --install ..."
    } else {
        println "部署应用 到 ${args.profile} 环境"
        sh "helm upgrade --install --set global.pullPolicy=Always --set global.javaOpts='-Xms256m -Xmx1024m -Xss512k -XX:+PrintGC' \
            --set global.imagePullSecrets=${args.imagePullSecrets} --set global.imageHub.server=${args.imageHubServer}\
            --set global.imageHub.project=${args.imageHubProject} --set global.version=${args.imageTag} \
            --set global.nacos.host=${args.nacosHost} --set global.nacos.port=${args.nacosPort} --set global.nacos.namespace=${args.nacosNamespace} \
            --set global.nacos.username=${args.nacosUsername} --set global.nacos.password=${args.nacosPassword} \
            --set global.profiles=${args.profile} --set global.namespace=${args.namespace} ${args.name} ${args.chartDir}"
        echo "应用 ${args.name} 部署成功. 可以使用 helm status ${args.name} 查看应用状态"
    }
}

podTemplate(label: label,
    // 容器镜像
    containers: [
        containerTemplate(name: 'maven', image: 'registry.cn-shanghai.aliyuncs.com/wanfei/maven:3.6-alpine-aliyun', command: 'cat', ttyEnabled: true),
        containerTemplate(name: 'docker', image: 'docker', command: 'cat', ttyEnabled: true),
        containerTemplate(name: 'helm', image: 'hypnoglow/kubernetes-helm:3.0.2', command: 'cat', ttyEnabled: true)],
    // 挂载
    volumes: [
        persistentVolumeClaim(mountPath: '/root/.m2', claimName: 'maven-pvc'),
        hostPathVolume(mountPath: '/root/.kube', hostPath: '/root/.kube'),
        hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
    ]) {
        node(label) {
        // checkout scm 下载代码
        def myRepo = checkout scm
        def gitCommit = myRepo.GIT_COMMIT
        def gitBranch = myRepo.GIT_BRANCH
        def imageHubServer = "registry.cn-shanghai.aliyuncs.com"
        def imageHubProject = "wanfei"
        def imageTag = "1.0.0-dev"

        stage('代码编译打包') {
            try {
                container('maven') {
                    echo "1. 代码编译打包阶段"
                    echo "当前commit: ${gitCommit}, 分支: ${gitBranch}"
                    sh """
                    ls -la
                    mvn clean package -Dmaven.test.skip=true
                    """
                }
            } catch (exc) {
                println "构建失败 - ${currentBuild.fullDisplayName}"
                throw(exc)
            }
        }

        stage('代码扫描') {
            echo "2. 代码扫描阶段"
            // jenkins配置的 sonar-server name
            withSonarQubeEnv('sonar') {
                def SCANNER_HOME = tool 'sonar-scan'
                sh """
                ${SCANNER_HOME}/bin/sonar-scanner \
                -Dsonar.projectKey=${JOB_NAME} \
                -Dsonar.projectName=${JOB_NAME} \
                -Dsonar.projectVersion=1.0 \
                -Dsonar.sourceEncoding=UTF-8 \
                -Dsonar.language=java \
                -Dsonar.sources=portal-common/portal-common-api/src,portal-common/portal-common-core/src,portal-gateway/src,portal-platform/src \
                -Dsonar.java.binaries=portal-common/portal-common-api,portal-common/portal-common-core,portal-gateway,portal-platform
                """
            }
        }

        stage('检查结果分析') {
            echo "3. 检查结果分析阶段"
            timeout(5) {
                // 等待sonarqube结果回调过来
                def qg = waitForQualityGate()
                echo "结果状态: ${qg.status}"
                if (qg.status != 'OK') {
                    error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
                }
            }
        }

        stage('构建 Docker 镜像') {
            container('docker') {
                echo "4. 构建 Docker 镜像阶段"
                sh """
                ls -la
                sh ./script/deploy/buildImage.sh -v "${imageTag}" -s "${imageHubServer}" -p "${imageHubProject}"
                """
            }
        }

        stage('运行 Helm') {
            container('helm') {
            echo "5. [INFO] 开始 Helm 部署"

            helmDeploy(
                dry_run             : false,
                imagePullSecrets    : "",
                imageHubServer      : "${imageHubServer}",
                imageHubProject     : "${imageHubProject}",
                imageTag            : "${imageTag}",
                nacosHost           : "nacos-141",
                nacosPort           : "8848",
                nacosNamespace      : "335ad58a-876b-4d74-b27a-4ea0e253b746",
                nacosUsername       : "nacos",
                nacosPassword       : "nacos",
                profile             : "dev",
                namespace           : "default",
                name                : "portal-api",
                chartDir            : "./script/deploy/chart/"
            )
            echo "[INFO] Helm 部署应用成功..."
            }
        }
    }
}
6.3 检测不通过测试

添加一个错误的代码

立即构建

查看详细日志

查看sonar报告

查看Bug

6.4 检测通过测试

删除错误的哪一行代码,提交

立即构建

流水线通过

查看检查分析日志

查看sonar报告

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/730508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存