Analyze project with Java, C++ and C# in Azure DevOps

Must-share information (formatted with Markdown):

  • which versions are you using (SonarQube, Scanner, Plugin, and any relevant extension)
    SonarQube Developer 8.2 with Java-, C++, C# scanners

  • what are you trying to achieve
    Analyze our product with contains

    • Java 8 (buid with ant)
    • C++ and C++/CLI wrapper (build with Visual Studio 2019)
    • C# (build with Visual Studio 2019, including libraries and WIX installer)

    Java is using C++ with JNI.
    All is build in Azure DevOps Server with an yaml pipeline.

  • what have you tried so far to achieve this
    To start I tried to set up the Java analysis without code coverage:

    - task: sonarsource.sonarqube.15B84CA1-B62F-4A2A-A403-89B77A063157.SonarQubePrepare@4
      displayName: 'Prepare analysis on SonarQube'
      continueOnError: true
      inputs:
        SonarQube: Sonarqube
        projectKey: ProductName.Java
        projectName: ProductName.Java
        projectVersion: '$(Build.BuildNumber)'
        extraProperties: |
          #sonar.java.source=8
          sonar.java.binaries=$(JavaClassesPath)
          #sonar.java.libraries='$(Build.SourcesDirectory)/src/lib'    
    - task: BatchScript@1
      displayName: 'Build Tool Studio Java Archive'
      inputs:
        filename: 'Build_release.cmd' # This script sets some environment variables and calls several times ant
        modifyEnvironment: true
    - task: sonarsource.sonarqube.6D01813A-9589-4B15-8491-8164AEB38055.SonarQubeAnalyze@4
          displayName: 'Complete the SonarQube analysis'
          condition: succeededOrFailed()
    

Unfortunately, the Analyze task fails.

Do I have any chance to analyze all three parts in one project in SonarQube?
What is the recommended way to analyze multi-language projects?

ok, I got the Java part analyzed when switching parameter in Prepare task:

  # Prepare SonarQube analysis
  - task: sonarsource.sonarqube.15B84CA1-B62F-4A2A-A403-89B77A063157.SonarQubePrepare@4
    displayName: 'Prepare analysis on SonarQube'
    inputs:
      SonarQube: Sonarqube
      scannerMode: CLI
      extraProperties: |
        sonar.projectKey=ProductName.Java
        sonar.projectVersion='$(Build.BuildNumber)'
        sonar.projectDescription=Product Description
        sonar.links.scm=our url
        sonar.sources=p1,p2
        sonar.tests=p3
        sonar.projectBaseDir=$(SrcDir)
        sonar.java.binaries=$(JavaClassesPath)
        sonar.java.libraries='$(SrcDir)/lib'

The above questions with multi-language analyes remain open.

Hi, you’ll need a SQ project for each technology stack.

If the C++ and C# files are all referenced inside the MSBuild projects, they can be analyzed with the Scanner for MSBuild (see Solution with a Mix of C# and C++) and can be the same project in SQ.

Thanks @Andrei_Epure.

As with the above prepare task the libraries where not recogniced, I modified it. Now I get errors regarding the path, see InvalidPathException for sonar.java.libraries. I split it, as it has nothing to do with multi-language projects.

Thanks, I hope Azure DevOps ALM integration can handle multiple anaylzes in one PR. I’ll see.

The Visual Studio solution contains C++, C++/CLI and C#, so the mixed approch I’ll follow.

You can see how we do it for our mixed C# / Java project, using Azure Pipelines and SonarCloud - search for “SonarCloud” in https://github.com/SonarSource/sonar-dotnet/blob/master/azure-pipelines.yml

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

Hi,

This thread was mentioned elsewhere recently, so I want to follow up. It is possible to analyze C# & other languages at once. It’s just maybe not intuitive.

First you have to make sure the Scanner for .NET recognizes all the files as belonging to the project, so list the extensions in a .csproj file like so:

  <ItemGroup>
    <Content Include="src\**\*.java" />
    <Content Include="src\**\*.c" />

Then make sure your Java & C++ builds run early in your job and pass forward the relevant properties on the command line. Here’s a sanitized excerpt from where I had to do this many moons ago:

SonarQube.Scanner.MSBuild.exe begin /k:project-key /n:"project name" /d:sonar.cfamily.build-wrapper-output=build /d:sonar.java.binaries=build/classes /d:sonar.host.url=%SONARQUBE_URL% /d:sonar.login=%SONARQUBE_TOKEN%

 
HTH,
Ann

2 Likes