使用 Jenkinsfile 和 maven 为 pullRequest 的代码启动声纳分析

2022-09-04 23:36:06

目前在我的项目中,组织存储库上的每个拉取请求都是由 自动构建的,如 jenkinsfile 中指定的那样。当生成结束时,会向 github 发送一条消息,其中包含此项目的生成状态。JenkinsJenkins

我想向拉取请求的会话发送分析,但仅适用于已由拉取请求更新的文件/代码。Sonar

赏金信息:

  • 它需要使用 jenkinsFile(在您的响应中添加完整的 jenkinsfile 将不胜感激)
  • 结果应仅出现在 github 的 pullRequest 页面中,仅针对 pullRequest 更新的代码。

答案 1

由于您在10个月内没有收到答案,我将尽可能地提供帮助 这是我的GitLab工作示例,但您应该能够更改这一点,因为插件相似(https://wiki.jenkins.io/display/JENKINS/GitHub+Plugin#GitHubPlugin-Settingcommitstatus):

#!groovy

pipeline {
    options {
        buildDiscarder(
            logRotator(artifactDaysToKeepStr: '21', artifactNumToKeepStr: '4', daysToKeepStr: '21', numToKeepStr: '4')
        )
        gitLabConnection('GitLab')
    }

    agent any
    tools {
        maven 'Default Maven'
        jdk 'DefaultJDK'
    }

    stages {
        stage('Build') {
            steps {
                sh "mvn clean install -U"
            }
        }

        stage('Source Code Analysis') {
            steps {
                withMaven() {
                    sh "mvn " +
                        "-Dsonar.branch='${env.BRANCH_NAME}' " +
                        "-Dsonar.analysis.mode=preview " +
                        "-Dsonar.gitlab.commit_sha=\$(git log --pretty=format:%H origin/master..'${env.BRANCH_NAME}' | tr '\\n' ',') " +
                        "-Dsonar.gitlab.ref_name='${env.BRANCH_NAME}' " +
                        "sonar:sonar"
                }
                withMaven() {
                    sh "mvn -Dsonar.branch='${env.BRANCH_NAME}' sonar:sonar"
                }
            }
        }
    }

    post {
        success {
            echo 'posting success to GitLab'
            updateGitlabCommitStatus(name: 'jenkins-build', state: 'success')
        }
        failure {
            echo 'posting failure to GitLab'
            updateGitlabCommitStatus(name: 'jenkins-build', state: 'failed')
        }
        always {
            deleteDir()
        }
    }
}

这包括各种位,但涵盖了您尝试执行的操作,声纳分析以两部分预览进行(对提交的注释和这些注释在打开时转移到合并请求),然后是正常的分析后记

在pom项目中,我还定义了:

<sonar.gitlab.project_id>${gitlab.project_id}</sonar.gitlab.project_id>
<sonar.gitlab.unique_issue_per_inline>true</sonar.gitlab.unique_issue_per_inline>
<sonar.gitlab.user_token>GITLAB_USER_TOKEN</sonar.gitlab.user_token>
<sonar.gitlab.url>${git.hostname.url}</sonar.gitlab.url>

如果您添加这些并替换缺少的位,我相信这将解决您的问题。

编辑:我相信你需要以下github选项,而不是GitLab选项:

-Dsonar.analysis.mode=preview \
-Dsonar.github.pullRequest=$PULL_REQUEST_ID \
-Dsonar.github.repository=myOrganisation/myProject \
-Dsonar.github.oauth=$GITHUB_ACCESS_TOKEN \
-Dsonar.host.url=https://server/sonarqube \
-Dsonar.login=$SONARQUBE_ACCESS_TOKEN

答案 2

我有几个GitHub项目需要添加Sonar扫描。因此,我采用了一种稍微通用的方法来执行扫描,方法是从 URL 获取组织和存储库。这允许主分支和拉取请求分支扫描。注意:这要求 Jenkins 服务器为 GitHub Branch Source 安装插件,以公开CHANGE_* 环境变量。

void runSonarScanner() {
    def changeUrl = env.GIT_URL.split("/")
    def org = changeUrl[3]
    def repo = changeUrl[4].substring(0, changeUrl[4].length() - 4)
    if (env.CHANGE_ID != null) {
        sh "mvn -B sonar:sonar \
            -Dsonar.projectKey=${org}_${repo} \
            -Dsonar.pullrequest.provider=GitHub \
            -Dsonar.pullrequest.github.repository=${org}/${repo} \
            -Dsonar.pullrequest.key=${env.CHANGE_ID} \
            -Dsonar.pullrequest.branch=${env.CHANGE_BRANCH} \
            -Dsonar.pullrequest.base=${env.CHANGE_TARGET}"
    } else {
       sh "mvn -B sonar:sonar \
           -Dsonar.projectKey=${org}_${repo} \
           -Dsonar.branch.name=${env.BRANCH_NAME}"
    }
}

上面的时髦定义可以在 Jenkinsfile 中使用,如下所示:

stage ('Analyze') {
    when {
        anyOf {
            changeRequest()
            branch "main"
        }
    }
    tools {
        maven 'maven-3.6.0'
        jdk 'jdk11'
    }
    steps {
        withSonarQubeEnv('MySonar') {
            runSonarScanner()
        }
    }
}

这要求在声纳服务器下的 Jenkins->Configuration 中安装声纳Qube Scanner Server 插件并使用“MySonar”ID 进行配置。


推荐