SonarCloud is unable to parse Combined Lcov file

Hey Everyone,

I am well aware that SonarCloud currently does not support MonoRepo repos while using gitlab. So we went to the drawing board to see what we could do to get code coverage reports into Sonar Cloud.

Due to this being a javascript and mono-repo we used Jest to do code coverage at each package layer.

packages/dir/src/coverage/lcov.info
|           |
|            -> Jest runs here 
|
-> Sonar runs here.

Generating their on lcov files. We had to change the projectRoot setting in jest in order to get the correct paths (shown below)

coverageReporters: ['lcov', { projectRoot: '../../../' }],

We then combined all the lcov files into a single file. This was done with a tool called lcov-result-merger which you can find here: lcov-result-merger - npm

Looking at the lcov file you can see the file paths that it has are the correct ones:

SF:packages/my_package/src/lib/post-hook/post-hook.ts

The problem we are having is that when SonarCloud ingests the merged lcov file it thows the following error:

INFO: Analysing [/builds/engineering/core/service/merged-lcov.info]
WARN: Could not resolve 42 file paths in [/builds/engineering/core/service/merged-lcov.info]

Anybody have any idea why the lcov wouldn’t be valid for sonarCloud?

Hey Kris,

Did you try providing multiple paths in the sonar.javascript.lcov.reportPaths parameter? The parameter format is: Comma-delimited list of paths to LCOV coverage report files. Paths may be absolute or relative to project root.

If this does not work, could you provide us an example project of your setup so we can investigate it?

Best Regards,
Ilia

Thanks for getting back to me

I removed the merged-lcov.info file from our sonar cloud coverage path, and called out each of the lcov files, comma separated but seems to be a much larger version of the same error: (please ignore the random spaces, formatted to exclude some data)

 INFO: Sensor JavaScript/TypeScript Coverage [javascript]
 INFO: Analysing [/builds/engineering/core/service-name-service/apps/service-name/publisher/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/node/sync-sku-batch/   coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/metrics/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/common/utils/coverage/    lcov.info, /builds/engineering/core/service-name-service/packages/nest/infoplus-api/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/passport-service-auth/   coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/config/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/service-name/enrichment/       coverage/lcov.info, /builds/engineering/core/service-name-service/apps/user-notification/upcoming-shipment/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/           restricted-retailers/riskcat/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/service-name/worker/coverage/lcov.info, /builds/engineering/core/service-name-service/   packages/nest/service-name/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/logger/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/    service-name/api/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/models/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/service-name/ history/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/route-event/storage-processor/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/     nest/db/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/node/test-helpers/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/node/crypto/ coverage/lcov.info]
 WARN: Could not resolve 75 file paths in [/builds/engineering/core/service-name-service/apps/service-name/publisher/coverage/lcov.info, /builds/engineering/core/service-name-service/       packages/node/sync-sku-batch/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/metrics/coverage/lcov.info, /builds/engineering/core/service-name-service/      packages/common/utils/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/infoplus-api/coverage/lcov.info, /builds/engineering/core/service-name-service/        packages/nest/passport-service-auth/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/config/coverage/lcov.info, /builds/engineering/core/service-name-        service/apps/service-name/enrichment/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/user-notification/upcoming-shipment/coverage/lcov.info, /builds/engineering/     core/service-name-service/apps/restricted-retailers/riskcat/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/service-name/worker/coverage/lcov.info, /builds/          engineering/core/service-name-service/packages/nest/service-name/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/logger/coverage/lcov.info, /builds/         engineering/core/service-name-service/apps/service-name/api/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/nest/models/coverage/lcov.info, /builds/engineering/  core/service-name-service/apps/service-name/history/coverage/lcov.info, /builds/engineering/core/service-name-service/apps/route-event/storage-processor/coverage/lcov.info, /builds/        engineering/core/service-name-service/packages/nest/db/coverage/lcov.info, /builds/engineering/core/service-name-service/packages/node/test-helpers/coverage/lcov.info, /builds/engineering/ core/service-name-service/packages/node/crypto/coverage/lcov.info]
 WARN: First unresolved path: apps/service-name/publisher/src/publisher/publisher.service.ts (Run in DEBUG mode to get full list of unresolved paths)

I even attempted to use wildcards instead of calling out each file with the same error.

The part I don’t understand is the First Unresolved path: listed is valid. Which causes me to think that all the paths generated are valid but sonarcloud doesn’t know how to associate them.

Hi Kris,

Indeed the files are loaded correctly by the analyzer, however, they don’t seem to be associated with any files set for analysis.

I will look more into this case and come back to you.

Best Regards,
Ilia

Hi Kris,

When the coverage sensor runs, it reads the coverages reports in sonar.javascript.lcov.reportPaths.
It then looks for the files referenced in these reports, like the following in your example:

apps/service-name/publisher/src/publisher/publisher.service.ts

It then tries to match it with files that were defined in the parameter sonar.sources. The error you sent is thrown when this matching fails.

Is it the case for you?

Best regards,
Ilia

Thanks for getting back to me,

in our sonar-project.properties this is what we have for sonar.sources

sonar.sources=.

This should include everything right?

Hey Kris,

using sonar.source=. should indeed index all files under your current directory for analysis.

You can check if a file such as apps/service-name/publisher/src/publisher/publisher.service.ts was analyzed by viewing it on SonarCloud. If the file has syntax highlighting, it means it was analyzed.

Best regards,
Ilia