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

时间:2017-07-30 20:03:00

标签: java maven github jenkins sonar-runner

目前在我的项目中,组织存储库上的每个pull-Request都是由Jenkins自动构建的,如jenkins文件中所指定的。 当构建结束时,Jenkins向github发送一条消息,其中包含该项目构建的状态。

我想向拉取请求的对话发送Sonar分析,但仅针对已通过拉取请求更新的文件/代码。

赏金信息:

  • 需要使用jenkinsFile(在你的回复中添加一个完整的jenkins文件会很感激)
  • 结果应该出现在github的pullRequest页面中,仅用于pullRequest更新的代码。

2 个答案:

答案 0 :(得分: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()
        }
    }
}

这包括各种各样的内容,但涵盖了你要做的事情,声纳分析发生在两部分预览中(对提交的评论和这些评论在打开时转移到合并请求)然后进行正常分析后

在项目中,我也定义了:

<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

答案 1 :(得分:-1)

看起来您的mvn sonar命令缺少GitHub oauth令牌参数,如sonar documentation中所述。此GitHub article将引导您完成如何生成此令牌。生成后,您可以将其添加到您的命令中(即-Dsonar.github.oauth = 您的令牌)。